页表太大,因此小号的内存太多

20.2 混合方法:分页和分段

  • 不为进程的整个地址空间提供单个页表,而为每个逻辑分段提供一个

依然保留基址寄存器和界限寄存器。在此处,基址寄存器保存该段的页表的物理地址;界限寄存器用于指示页表的结尾(即它有多少有效页)。

image.png

用地址空间前两位确定使用哪个段。

栈和堆之间未分配的页不在占用页表中的空间(仅将其标记为无效)

然而,分段假设地址空间有一定的使用模式,如果有一个大而稀疏的堆,仍然有可能导致大量的页表浪费。

20.3 多级页表

  • 将页表分成页大小的单元。如果整页的页表项(PTE)无效,就完全不分配该页的页表。使用页目录体现页表的页在哪里,或页表的整个页不包含有效页。

image.png

左侧线性页表,即使地址空间中建达部分区域无效,仍然需要为之分配页表空间。

右侧多级页表,仅将页表的两页标记有效,驻留在内存。

页目录为每页页表包含了一项。由多个页目录项(PDE)组成。PDE至少拥有有效位页帧号。如果ODE项是有效的,则意味着该项指向的页表中至少有一页是有效的。

  • 多级页表也是有成本的,TLB未命中时,需要从内存加载两次,才能从页表中获得正确信息(一次用于页目录,一次用于PTE本身),而线性页表只需要一次加载。

20.5 将页表交换到磁盘

  • 无论如何处理,页表也有可能太大而无法一次装入内存。一些系统将这样的页表放入虚拟内存中,从而在系统压力较大的时候,把这些页表中的一部分交换到磁盘。