分页

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

分段有什么问题?

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

比如说,我们现在存放一些内容,需要占用 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),随着时间推移,分配内存会变得比较困难。

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

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