• 分页


    前面说到了采用分段技术来进行虚拟地址(地址空间)到物理内存的转换。

    分段有什么问题?

    肯定得有不足,才需要提出新的技术来改进。那么我们刚才的分段机制,不是挺好的嘛?有什么问题呢?

    比如说,我们现在存放一些内容,需要占用 160K 的空间,但是我们来看空间的地址空间,分别是150K和50K,每个段都不足以满足 160 K 的要求,但是两个加起来,的的确确可以满足要求。

    只使用 分段机制,会造成内存碎片,浪费空间。

    如何解决呢?

    针对上面的问题,我们可以想到有下面的一些方法:

    • 移动已经使用的内存,把空闲的内存放在一起。这样就可以有200K的空闲内存了。
    • 把160K的内容分成多个块,比如分成4个40K,然后就可以放进去了。
    • 把不需要的进程内容放到磁盘,然后就有了更大的空闲内存。

    这些方法,都可以解决上面的问题。但方法1、3需要很多额外的动作,方法一移动内容是很慢的,而且移动过程中,CPU不能做其他事。方法三,会影响其他进程的使用。相对来说,方法二相比其他方法,较为优秀。

    分页

    上面的方法二,就是分页的思想。

    现在,我们可以将内存分为固定大小的内存块,每一块称为页。就像我们的书一样,把很多的文字,放在固定大小的页面上。

    现在,就像我们刚才面临的问题一样,我们把内容分为4个部分,分别放到4个页之中。

    一般情况下,页的大小是4K。

    就像我们下图一样,比如说段0的所需的空间大小为13K,那么我们需要4个页才能装填下。这个时候,虽有空间的浪费,但是浪费是很少的,也就浪费 3K 而已。这个时候,段0 分为4个页,分别放到页框1、3、5、6。

    分页的实现

    那么分页该如何实现呢?我们可以像分段那样,也建立一个表,叫 页表。针对不同的页,存储页的相关信息。

    这样就可以通过页表,在物理内存上进行定位,找到相关的内容。

    页表的更多细节,我们后面再说。

    总结

    分段和分页是两种从虚拟地址(地址空间)转换为物理地址的方法。

    操作系统有两种方法,来解决大多数空间管理问题。

    第一种方法:将空间分割成不同长度的分片,就像虚拟内存管理中的分段。遗憾的是,这个解决方法存在固有的问题。具体来说,将空间切成不同长度的分片以后,空间本身会碎片化(fragmented),随着时间推移,分配内存会变得比较困难。

    第二种方法:将空间分割成固定长度的分片。在虚拟内存中,我们称这种思想为分页。

    分页也有所不足,我们后面会进行优化。

  • 相关阅读:
    android状态栏
    python基础(二)——文件操作
    python基础(一)——字符串
    每日读书
    gradle相关
    EditText整体hint
    java生成pdf
    Androidstudio点9图报错
    【ASP.NET Core学习】使用JWT认证授权
    数据访问仓储模式的事务管理(Unit of Work)
  • 原文地址:https://www.cnblogs.com/zhouzhiyao/p/12858368.html
Copyright © 2020-2023  润新知