多级页表
我们需要解决 分页引入的一个问题: 页表太大,占用内存过多.
如果我们使用线性页表,假设一个32位的地址空间,页大小为4kB,4字节的页表项(PTE),一个地址空间中大约有一百万个虚拟页面,再乘以页表项的大小,页表大小为4MB.
往往在系统中我们是由许多进程的,而每个进程都有一个页表,如果有一百个进程,那么仅仅是页表所占空间就达到了400MB,这显然不合理,所以,接下来我们会介绍一种多级页表的技术来解决这个问题.


🏝️1. 考虑使用更大的页
我们可以使用一种简单的方法减小页表的大小:使用更大的页,因为页的大小变大,那么PTE就变少,页表也就随之变小.
以32位地址空间为例:这次我们使用16KB的页,因此,会有18位的VPN(虚拟页号)加上14位的偏移量,假设页表项依然为4字节,这时页表的大小就变成了1MB.
但是,这种方法的问题是:大内存页会导致每页内的浪费,这被称为内部碎片问题(浪费在分配的存储单元内部). 应用程序分配页,但只使用每页的一小部分,而内存很快就会充满这些过大的页.
🏖️2. 使用段页式管理
📖2.1 为什么采用段页式管理?
段页式管理将分页和分段相结合,以减少页表的内存开销.
我们先来看看典型的线性页表,就能理解这种方法为什么可能有用,假设我们有一个32位的地址空间,在这个地址空间中,我们只使用了很少的部分:

也就是说,在为这个地址空间所建立的页表当中,充满了无效的页表项,浪费了许多空间.
因此在段页式管理中,我们不再为进程的整个地址空间提供单个页表,而是为每个逻辑分段都提供一个,在我们的例子中,提供3个页表:地址空间中的代码段、堆、栈部分各有一个.
在分段中,我们有一个基址寄存器,告诉我们每个段在物理内存中的位置,还有一个界限寄存器,告诉我们该段的大小.
在段页式方案中,我们仍然拥有这些结构,但是,使用基址指向页表的物理地址,界限寄存器指示页表的结尾.

本文探讨了多级页表技术,如何通过分页和分段结合降低页表内存消耗,以及其优点如支持稀疏地址空间和空间效率,同时提到了缺点如访问复杂性和内存浪费。详细讲解了从简单二级页表到32位地址空间的多级页表实例,以及倒排页表的工作原理。
最低0.47元/天 解锁文章
1412





