下面将深入探讨页表所采纳的几种主流技术,包括分层分页、哈希页表和倒置页表等。
分层分页
在现代计算机系统中,逻辑地址空间通常非常大,可以达到2^32至2^64的规模。页表可能变得异常庞大。以一个具有32位逻辑地址空间的计算机系统为例,若页大小为4KB(即2^12字节),则页表条目可能多达百万计。若每个条目占用4字节,那么每个进程就需要约4MB的物理内存空间来存储页表本身。为了解决这一问题,一种有效的策略是将页表细分为更小的块。
两级页表方案
两级分页算法即将页表再次分页。逻辑地址被划分为页码和页偏移两部分。以一个具体的例子来说,对于具有32位逻辑地址空间和4K页的系统,逻辑地址中的前20位作为外层页表的索引(即第一级页码),而后12位作为内层页表的页偏移(即第二级页偏移)。这样,一个逻辑地址可以被分解为两个级别的索引:外层的p1用于访问外层页表,内层的p2用于在内层页表中定位具体条目。
哈希页表
针对大于32位地址空间的处理,常用方法是采用哈希页表。该方法使用虚拟页码作为哈希值,并将相关条目链式地存储在哈希表中。每个条目包含三个字段:虚拟页码、映射的帧码以及指向链表中下一个元素的指针。当进行内存访问时,通过哈希函数将虚拟页码映哈希表中,然后比较哈希表中的条目与虚拟页码是否匹配。如不匹配,则继续在链表中搜索直到找到匹配的条目。
聚簇页表变体
针对64位地址空间,有变体方案采用聚簇页表。该方案中,哈希表中的每个条目引用多个页(例如16个),而非单个页。这使得单个页表条目能够映多个物理帧上,对于稀疏地址空间特别有用。
倒置页表
通常,每个进程都与一个关联的页表相对应。倒置页表的表示方式则更为直接,其中每个进程使用的每个虚拟页在页表中都有一项(无论该虚拟页是否有效)。这种表示法便于操作系统将虚拟地址转换为物理内存地址。传统页表可能包含大量条目,占用大量物理内存。为了解决这一问题,可以引入倒置页表。
倒置页表的原理
倒置页表以物理内存的帧或页为单位进行。每个条目包含保存在真正内存位置上的虚拟地址以及拥有该虚拟地址的进程信息。整个系统只有一个统一的倒置页表,每个物理内存的帧或页面只对应一个条目。
如上图所示,倒置页表的工作原理是接收一个虚拟地址作为输入,然后查找与该虚拟地址匹配的物理内存帧或页面信息。为了增加效率,系统可以使用一个额外的辅助结构如哈希表或TLB(转换后缓冲),以便快速找到所需条目。
尽管倒置页表减少了存储每个进程所需的内存空间,但增加了由于页面访问而需要查找的时间成本。由于倒置页表按物理地址排序且根据虚拟地址进行查找,可能导致长时间的搜索过程。
使用倒置页表的系统在实现共享内存时面临挑战。传统的共享内存实现方法是将多个虚拟地址映同一个物理地址。然而在倒置页表中,每个物理页面只有一个与之对应的虚拟地址条目。对于共享内存的场景,需要采取其他策略来处理。
参考来源:《操作系统概念》等文献资料。