《操作系统导论》 知识总结 第20章 分页:较小的表

通过引入TLB优化了分页时,由于需要查询页表而进行的额外的内存访问,现在解决分页的第二个问题,即页表太大,消耗了太多内存

假设一个32位地址空间,一页为4kb,每个页表项为4kb,一个32位地址空间大约被分为一百万个虚拟页,那么该进程页表大约为4MB,现代计算机可能同时有100个活动进程,那么光是页表,就需要占用内存数百兆,因此需要一些技术来减轻这种沉重的负担

简单的解决方案:更大的页

可以用一种简单的方法减小页表大小:使用更大的页

再以32位地址空间为例,这次每页设置为16kb,每个页表项4kb,现在该进程页表总大小为1MB,页表缩小到了1/4

然而使用增大页的方法会导致每页内的浪费,这被称为内部碎片,应用程序分配了较大的页,但只用每页的一小部分,而内存很快就会充满这些过大的页,因此大多数系统在常见的情况下使用相对较小的页(4kb或8kb)

混合方法:分页和分段

分页和分段相结合,以减少页表的内存开销。

先看一个典型的线性页表:
假设有一个16kb地址空间每页为1kb,堆和栈的使用部分很小,该进程的虚拟地址空间与物理内存的可能关系如下:
在这里插入图片描述
再看看该16kb地址空间的页表:
在这里插入图片描述
在这里插入图片描述
大部分页表空间没有被使用,充满了无效项,这仅仅是16kb的地址空间,想象一下32位地址空间的页表和其潜在浪费的空间

采用杂合的方法不是为进程的整个地址空间提供单个页表,而是为每个逻辑段提供一个

回顾分段,为每个逻辑段提供一对基址,界限寄存器,现在在分页中,让每个段拥有一个页表每个段页表拥有一对基址,界限寄存器

每个段页表的基址寄存器指向该段的页表的物理地址,每个段页表的界限寄存器用于指示页表的结尾

一个简单例子:假设 32 位虚拟地址空间包含 4KB 页面,我们只使用 3 个段:一个用于代码,另一个用于,还有一个用于。要确定地址引用哪个段,我们会用地址空间的前两位。假设 00 是未使用的段,01 是代码段,10 是堆段,11 是栈段。因此,虚拟地址如下所示:
在这里插入图片描述
系统中的每个进程现在都有 3 个与其关联的页表。在上下文切换时,必须更改这些寄存器,以反映新运行进程的页表的位置。

TLB 未命中时,硬件使用分段位(SN)来确定要用哪个基址和界限对。然后硬件将其中的物理地址与 VPN 结合起来,形成页表项(PTE)的地址

SN = (VirtualAddress & SEG_MASK) >> SN_SHIFT 
VPN = (VirtualAddress & VPN_MASK) >> VPN_SHIFT 
AddressOfPTE = Base[SN] + (VPN * sizeof(PTE))

杂合方案的关键区别在于,每个分段都有界限寄存器,每个界限寄存器保存了段中最大有效页的值

但是该方法仍有缺点,仍然存在分段,虽然大部分内存以页大小为单位存在于内存,但现在的页表可以是任意大小,会使得外部碎片再次出现,使得物理内存更为复杂

多级页表

将页表中的所有无效区域去掉,而不是将它们都保留在内存中,这种方式称为多级页表,它将线性页表变成了类似树的东西

多级页表思想:首先,将页表分成页大小的单元。然后,如果整页的页表项(PTE)无效,就完全不分配该页的页表。为了追踪页表的页是否有效(以及如果有效,它在内存中的位置),使用了名为页目录(page directory)的新结构。页目录因此可以告诉你页表的页在哪里,或者页表的整个页不包含有效页。

下面看一个例子:
在这里插入图片描述

  • 左侧的线性页表即使地址空间中间区域无效,也要为这些区域分配页表空间
  • 右侧的多级页表,页目录仅将页表的两页标记为有效,因此这两页就驻留在内存里,多级页表让线性页表无效的部分消失,并用页目录来记录页表的哪些页被分配

多级页表分配的表空间,与正在使用的地址空间内存量成比例,它通常很紧凑,并且支持处理稀疏的地址空间,使用页目录,它指向页表的各个有效部分,因可以将页表页存放到物理内存的任何地方

但多级页表也是有成本的,在TLB未命中时,需要从内存中加载两次,才能从页表中获取正确的地址转换映射(一次用于页目录,一次用于PTE),TLB未命中时,会因为较小的表导致较高的成本,且虽然多级页表能节省内存,但它无疑比线性页表复杂的多

详细的多级示例

不写了,看书p158

反向页表

反向页表更极端地节省内存空间,在这里只保留了一个页表,其中的页表项代表系统的每个物理页,而不是有许多页表,页表项告诉我们哪个进程正在使用此页,以及该进程的哪个虚拟页映射到此物理页

要找到正确的项,就是要搜索这个数据结构线性遍历是昂贵的,因此在此基础上建立散列表,以加速查找

页表只是数据结构,可以根据需求,创建各种满足需要的数据结构

将页表交换到磁盘

一些系统将页表放入内核虚拟内存,从而允许系统在内存压力大时,将这些页表的一部分交换到磁盘

小结

我们现在已经看到了如何构建真正的页表。不一定只是线性数组,而是更复杂的数据结构。这样的页表体现了时间和空间上的折中(表格越大,TLB 未命中可以处理得更快,反之亦然),因此结构的正确选择强烈依赖于给定环境的约束。
在一个内存受限的系统中(像很多旧系统一样),小结构是有意义的。在具有较多内存,并且工作负载主动使用大量内存页的系统中,用更大的页表来加速 TLB 未命中处理,可能是正确的选择。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值