前面说到了采用分段技术来进行虚拟地址(地址空间)到物理内存的转换。
分段有什么问题?
肯定得有不足,才需要提出新的技术来改进。那么我们刚才的分段机制,不是挺好的嘛?有什么问题呢?
比如说,我们现在存放一些内容,需要占用 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),随着时间推移,分配内存会变得比较困难。
第二种方法:将空间分割成固定长度的分片。在虚拟内存中,我们称这种思想为分页。
分页也有所不足,我们后面会进行优化。