多级页面table如何节省内存space?

How does multi-level page table save memory space?

我正在尝试了解多级页面 table 如何节省内存。据我了解,多级页面 table 总共比单级页面 table 消耗更多内存。

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

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

*页面大小 table = 2^16(页面数)* 4 字节(每页 table 条目的大小)= 2^18 字节*

多级页面Table:在两级页面的情况下table,让我们使用前 10 个最高有效位作为第一个索引级别页面 table。接下来的 10 位索引到二级页面 table,它具有页码到帧号的映射。其余 12 位表示页面偏移量。

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

所有二级页面的总大小tables = 2^10(二级页面的#=49=]s)* 4KB(每个二级页面的大小table) = 4MB

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

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

所以我们需要更多的内存来存储多级页面tables.

如果是这样,多级页面tables如何节省内存space?

这是多级页面的主要优势 tables:

First, chop up the page table into page-sized units; then, if an entire page of page-table entries (PTEs) is invalid, don’t allocate that page of the page table at all.

Source.(第 20.3 节)

因此页面 table 所需的内存量不是由地址大小 space 决定的,而是由进程使用的内存量决定的。

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

多级 table 主要是因为英特尔领域的内存结构。

假设您有一个 32 位系统,您将地址 space 分开,这样上半部分保留给系统,下半部分留给用户地址。

通过这样的划分,您需要在每个用户页面 table 中有 2GB 的连续页面 table 条目才能到达系统地址。

旧的VAX来一个简单的处理方法。它将4GB地址space分成了4个区域(2个用户,1个系统,1个不可用)。三个可用区域有自己的页面 table。

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

地址转换的第一阶段是查看 select 页面 table 的 2 个高位地址位以供使用。

Intel-land 没有单独的页面 table,而是将页面 table 分开。这减少了 (1) table 需要连续内存的问题; (2) 要求页面table跨越全地址space; (3) 允许定义一个内核地址,可以被所有进程共享。

  1. 在单级页面table中,您需要整个table来访问即使是少量数据(更少的内存引用)。即 2^20 页,每个 PTE 占用 4 个字节,正如您假设的那样。

Space 访问任何数据所需的大小为 2^20 * 4bytes = 4MB

  1. 分页是多级的paging.In多级分页是更具体的,你可以借助多级组织来决定你的数据存在于2^20页中的具体哪一页,select 它。所以在这里你只需要那个特定的页面在你 运行 过程中在内存中。

在您讨论的 2 级案例中,您需要第 1 级页面table,然后是第 2 级 2^10 页中的 1 个table。 所以, 第一级大小 = 2^10 * 4bytes = 4KB 第二级我们只需要 2^10 页中的 1tables = 所以大小是 2^10 * 4bytes = 4KB

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

最终比较是 4MB 与 8KB。

要补充 ,这里确实有一个想法必须强调:您不需要将整个页面 table 加载到主内存中 - 只需加载部分带你去你想去的地方。这补偿了您正确的直觉,即多级页面 table 至少需要与单级页面 table 一样多的容量(毕竟,您需要存储所有虚拟地址的映射,无论table 风格)。

还需要注意的是,多级分页实际上出现是因为想要应用上述原则(而不是相反,即应用该原则,因为你想使用多级分页)级分页)。单级 table 的条目本身存储在页面中,并且在单级模型中,这些页面可以填满一大块内存;这样,您只需要基地址来索引您的 table。但是,现在尝试拉出您不需要的条目页面:自然而然,我们需要一种方法来仍然能够引用所有条目页面,即使它们不再作为一大块。于是出现了顶级页面table,我们就有了多级分页。

现在只需将我们拉出的页面写入磁盘,仅检索它们以备后用。这样,如果程序真的只需要一个最终级别的页面 table 条目,我们将整个 4 MB 的条目存储到磁盘,除了我们实际需要的 4 kB + 4 kB。节省了大量 RAM。