Memory 多级页表如何节省内存空间?

Memory 多级页表如何节省内存空间?,memory,operating-system,paging,virtual-memory,page-tables,Memory,Operating System,Paging,Virtual Memory,Page Tables,我试图理解多级页表是如何节省内存的。据我所知,多级页表总的来说比单层页表消耗更多的内存 例如:考虑一个内存大小为64KB和32位处理器的内存系统。页面表中的每个条目为4个字节 单级页表:需要16(2^16=64KB)位来表示页偏移量。所以剩余的16位用于索引到页表中。所以 *页面表格的大小=2^16(页面的大小)*4字节(每个页面表格条目的大小)=2^18字节* 多级页面表:对于两级页面表,让我们使用前10个最高有效位索引到一级页面表中。接下来的10位将索引到第二级页表中,该页表具有页码到帧编号

我试图理解多级页表是如何节省内存的。据我所知,多级页表总的来说比单层页表消耗更多的内存

例如:考虑一个内存大小为64KB和32位处理器的内存系统。页面表中的每个条目为4个字节

单级页表:需要16(2^16=64KB)位来表示页偏移量。所以剩余的16位用于索引到页表中。所以

*页面表格的大小=2^16(页面的大小)*4字节(每个页面表格条目的大小)=2^18字节*

多级页面表:对于两级页面表,让我们使用前10个最高有效位索引到一级页面表中。接下来的10位将索引到第二级页表中,该页表具有页码到帧编号的映射。其余12位表示页偏移量

第二级页面表的大小=2^10(#个条目)*4字节(每个条目的大小)=4 KB

所有二级页表的总大小=2^10(二级页表的大小)*4KB(每个二级页表的大小)=4MB

第一级页面表格的大小=2^10(#个条目)*(10/8)字节(每个条目的大小)=1.25 KB

存储一级和二级页表所需的总内存=4 MB+1.25 KB

因此我们需要更多内存来存储多级页表。


在这种情况下,多级页表如何节省内存空间?

多级页表的一个主要优点是:

首先,将页面表切碎为页面大小的单位;然后,如果整个页面的页面表条目(PTE)无效,则根本不分配该页面的页面表条目

(第20.3节)

因此,页表所需的内存量不是由地址空间的大小决定的,而是由进程正在使用的内存量决定的


此外,如果物理内存已满,则页表条目页本身可以分页-只有页目录需要始终存在于内存中。

由于Intel land中的内存结构,主要需要多级表

假设您有一个32位系统,您划分地址空间,以便上半部分保留给系统,下半部分保留给用户地址

有了这样一个分区,在每个用户页表中需要2GB的连续页表条目才能到达系统地址

旧的VAX对此有一个简单的方法。它将4GB地址空间划分为4个区域(2个用户,1个系统,一个不可用)。这三个可用区域都有自己的页面表

每个区域都有自己的页面表。因为有一个专用的系统地址空间,所以用户页表可以是虚拟地址,因此它们不需要连续内存

地址转换的第一阶段是查看2个高阶地址位,以选择要使用的页表

Intel land不再使用单独的页表,而是将页表拆分。这减少了以下问题:(1)表需要连续内存;(2) 要求页表跨越整个地址空间;(3) 允许定义可由所有进程共享的内核地址

  • 在单级pagetable中,您甚至需要整个表来访问少量数据(更少的内存引用)。i、 e 2^20页,每个PTE占用您假设的4字节
  • 访问任何数据所需的空间为2^20*4字节=4MB

  • 分页页面是多级分页。在多级分页中,它更具体,您可以在多级组织的帮助下,在2^20个页面中确定您的数据存在的特定页面,并选择它。因此,在这里,您只需要在运行进程时将该特定页放在内存中
  • 在您讨论的2级案例中,您需要第一级pagetable,然后在第二级中需要2^10个pagetable中的1个。 所以 第一级大小=2^10*4字节=4KB 第二级我们只需要2^10页表中的1页,因此大小为2^10*4字节=4KB

    现在所需的总大小为:4KB+4KB=8KB

    最后一个比较是4MB和8KB。

    要补充的是,这里必须强调一个想法:您不需要将整个页面表加载到主内存中,只需要将它加载到您想去的地方。这补偿了您的正确直觉,即多级页表至少需要与单级页表相同的容量(毕竟,您需要存储所有虚拟地址的映射,而不管表样式如何)

    还值得注意的是,多级分页实际上是由于希望应用上述原则而产生的(而不是相反,即应用该原则是因为希望使用多级分页)。单级表的条目存储在页面中,在单级模型中,这些页面可能会占用一大块内存;这样,您只需要基址来索引表。然而,现在试着取出你不需要的条目页面:作为一种自然的结果,我们需要一种方法来仍然能够引用所有条目页面,即使它们不再作为一个大的块出现。因此,出现了一个顶级页面表,我们有了多级分页


    现在,只需将我们取出的页面写入磁盘,然后检索它们以供以后使用。这样,如果程序实际上只需要一个最终级别的页表条目,那么我们将整个4MB的条目存储到磁盘中,除了实际需要的4KB+4KB。这节省了大量内存。

    所有页表条目不必同时出现在内存中。只有顶级字典,其余的可以交换到磁盘,并在需要时加载和使用(如果有)。因此,(在我看来)节省是因为页面映射占用了适量的内存,而10/8是在计算大小o的过程中完成的