分页系统存在的一个无法容忍,同时也是分页系统无法解决的一个缺点就是:一个进程只能占有一个虚拟地址空间。在此种限制下,一个程序的大小至多只能和虚拟空间一样大,其所有内容都必须从这个共同的虚拟空间内分配。
分段管理就是将一个程序按照逻辑单元分成多个程序段,每一个段使用自己单独的虚拟地址空间。例如,对于编译器来说,我们可以给其5个段,占用5个虚拟地址空间,如下图所示:
如此,一个段占用一个虚拟地址空间,不会发生空间增长时碰撞到另一个段的问题,从而避免因空间不够而造成编译失败的情况。如果某个数据结构对空间的需求超过整个虚拟之地所能够提供的空间,则编译仍将失败。不过出现这种可能的概率恐怕不会比太阳从西边出来的概率高出多少。
优点:
(1)每个逻辑单元可单独占用一个虚拟地址空间,这样使得编写程序的空间大为增长。
(2)由于段式按逻辑关系划分,因此共享起来十分方便。
(3)对于空间稀疏的程序来说,分段管理将节省大量的空间。
缺点:
(1)外部碎片和一个段必须全部加载到内存。
那么,解决办法是什么呢?分页,不过这次的分页不是前面提到的直接对程序进程进行分页,而是对程序里面的段进行分页,于是就形成了所谓的段页式内存管理模式。
段页式管理就是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。这样做的目的就是想同时获得分段和分页的好处,但又避免了单独分段或单独分页的缺陷。
如果我们将每个段看做一个单独的程序,则逻辑分段就相当于同时加载多个程序。
采用多级页表,顶级为段表,次级为页表。由段号在段表里面获得所应该使用的页表,然后在该页表里面查找物理页面号,如下图所示:
如果需要,次级页表又可以再分为两个或者多个层次,形成层次更为丰富的段页式层次结构。
(1)一开始,人们根据直觉,将一个程序作为一整段进行管理,从而形成了纯粹分段(固定加载地址、固定分区、非固定分区、交换)管理模式,也称为基本内存管理模式,这种模式由于直观易实现,曾经大为流行。
(2)但是,纯粹分段存在重大缺陷(由于此种模式下一个程序只有一段,从而导致内存空间增长困难,外部碎片、程序不能超过物理内存容量、一个程序必须同时加载到内存才能执行等缺点),为了克服这些缺点,引入了页式内存管理模式。
(3)显然,页式内存管理克服了纯粹分段的一系列缺点,但又存在共享不方便、一个程序只能在一个徐地址空间增长的问题,为了解决这个问题,引入了逻辑分段。逻辑分段将一个程序按逻辑关系分解为多个段,从而扩大了程序可以使用的虚拟地址空间并解决了共享难的问题。
(4)但是,逻辑分段终究还是分段,自然又引入了分段的缺点。而要客服这些缺点,自然又想到了分页。这样,人们又引入了段页式管理模式。
因此,内存管理模式经历了从纯粹分段到分页,再到逻辑分段,再到段内分页的演变过程,如下图所示:
邹恒明,《操作系统之哲学原理》,机械工业出版社
作者:周旭龙
出处:http://edisonchou.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。