段式内存管理

本文探讨了分页系统在内存管理中的局限性,如共享困难和单一虚拟地址空间的限制,以及如何通过分段管理系统来解决这些问题。分段管理允许每个程序逻辑单元拥有独立的虚拟地址空间,方便共享和增长。然而,分段仍存在外部碎片和段必须全部加载到内存的缺点。为了解决这些问题,文章提出了段页式内存管理,将分段和分页结合起来,提供更大的灵活性和资源利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分页系统的缺点

前面一节阐述了分页内存管理它克服了交换系统的所有缺点,但它自己有缺点吗?
页表太大?这个缺占用多级页表克服了。多级页表速度慢?这个问题用TLB解决了绝大部分。页面来回更换?这个缺点用页面更换算法解决了大部分。 固定页面大小呢?这不应该算是一个缺点,因为可变页面大小的操作系统不仅难以选择最优的页面大小,而且会变得很复杂。内部碎片算是一个小小的缺憾,但总比交换系统的外部碎片强,一个进程的内部碎片所浪费的空间平均起来只有半个页面,相对于分页系统的诸多优点来说,这个缺点似乎微不足道。

那么分页系统还有没有其他缺陷呢?有。其中的一个是共享困难。虽然在理论上我们可以按页进行共享似乎粒度很细,但实际上这根本就是不现实的。原因是一个页面的内容很可能既包括代码又包括数据,即很难使一个页面只包含需要共享的内容或不需要共享的内容。 只要一个页面里面有一行地址是不能共享的,这个页面就不能共享。而一个页面里面存在至少一行不能共享的地址是完全可能的。这样,想自由地共享任何内容几乎就变得不可能了。

如果说上述缺点尚可以容忍,有一个缺点却是无法容忍的,同时也是分页系统无法解决的。这个缺点就是一个进程只能占有一个虚拟地址空间。在此种限制下,一个程序的大小至多只能和虚拟空间一样大。 其所有内容都必须从这个共同的虚拟空间内分配。那这是缺点吗?很多人不认为这是缺点,因为大部分人不认为我们有需要为任何一个程序配置多个虚拟空间。但事实是这样的吗?

我们来看一个例子:编译器的工作过程。我们知道编译器在工作时需要保持多个数据结构:词法分析树、常数表、代码段符合表、调用栈。保持多个数据结构本身并无任何问题。问题出在这些数据结构可以独立的增长和收缩。即在编译器扫描过程中,这些数据结构里面数据可以增多或减少从而造成该数据结构所需内存空间的变化。
在这里插入图片描述</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值