分页系统的缺点
前面一节阐述了分页内存管理它克服了交换系统的所有缺点,但它自己有缺点吗?
页表太大?这个缺占用多级页表克服了。多级页表速度慢?这个问题用TLB解决了绝大部分。页面来回更换?这个缺点用页面更换算法解决了大部分。 固定页面大小呢?这不应该算是一个缺点,因为可变页面大小的操作系统不仅难以选择最优的页面大小,而且会变得很复杂。内部碎片算是一个小小的缺憾,但总比交换系统的外部碎片强,一个进程的内部碎片所浪费的空间平均起来只有半个页面,相对于分页系统的诸多优点来说,这个缺点似乎微不足道。
那么分页系统还有没有其他缺陷呢?有。其中的一个是共享困难。虽然在理论上我们可以按页进行共享似乎粒度很细,但实际上这根本就是不现实的。原因是一个页面的内容很可能既包括代码又包括数据,即很难使一个页面只包含需要共享的内容或不需要共享的内容。 只要一个页面里面有一行地址是不能共享的,这个页面就不能共享。而一个页面里面存在至少一行不能共享的地址是完全可能的。这样,想自由地共享任何内容几乎就变得不可能了。
如果说上述缺点尚可以容忍,有一个缺点却是无法容忍的,同时也是分页系统无法解决的。这个缺点就是一个进程只能占有一个虚拟地址空间。在此种限制下,一个程序的大小至多只能和虚拟空间一样大。 其所有内容都必须从这个共同的虚拟空间内分配。那这是缺点吗?很多人不认为这是缺点,因为大部分人不认为我们有需要为任何一个程序配置多个虚拟空间。但事实是这样的吗?
我们来看一个例子:编译器的工作过程。我们知道编译器在工作时需要保持多个数据结构:词法分析树、常数表、代码段符合表、调用栈。保持多个数据结构本身并无任何问题。问题出在这些数据结构可以独立的增长和收缩。即在编译器扫描过程中,这些数据结构里面数据可以增多或减少从而造成该数据结构所需内存空间的变化。
如果编译器只在一个虚拟空间活动,则所有的数据结构或表格均在一个虚拟空间分配,这样就必然发生不同的数据结构占据虚拟空间的不同部分的情况。这样,当一个数据结构空间需要增长时,就会碰到处于其上的其他数据结构而造成无法增长!那么如果某个数据结构无法增长,例如词法树所占空间无法增长,则编译过程将失败。
当然了,编译器在工作时会为每个数据结构多分配一些空间来容纳其随后的增长。而且这此空间的大小都经过经验数据测