50

我试图了解多级页表如何节省内存。据我了解,多级页表总共比单级页表消耗更多的内存。

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

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

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

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

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

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

一级页表大小 = 2^10(# of entries) * (10/8) Bytes (Size of each entry) = 1.25 KB

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

所以我们需要更多的内存来存储多级页表。

如果是这样,多级页表如何节省内存空间?

4

4 回答 4

53
  1. 在单级页表中,您甚至需要整个表来访问少量数据(更少的内存引用)。即 2^20 个页面,每个 PTE 占用 4 个字节,如您所料。

访问任何数据所需的空间为 2^20 * 4bytes = 4MB

  1. 分页页面是多级分页。在多级分页中更具体,您可以在多级组织的帮助下确定您的数据存在于2^20个页面中的哪个特定页面,并选择它。因此,在您运行进程时,您只需要将特定页面放在内存中。

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

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

最终比较是 4MB 与 8KB 。

于 2015-05-27T01:36:39.760 回答
17

这是多级页表的主要优点:

首先,将页表分割成页面大小的单元;那么,如果一整页页表条目 (PTE) 无效,则根本不分配该页表页。

资源。(第 20.3 节)

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

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

于 2015-04-06T08:29:33.270 回答
3

为了补充Sai 的答案,这里必须强调一个想法:您不需要将整个页表加载到主内存中 - 只需将您带到您想去的地方。这弥补了您的正确直觉,即多级页表至少需要与单级页表一样多的容量(毕竟,无论表样式如何,您都需要存储所有虚拟地址的映射)。

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

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

于 2020-11-16T10:49:08.053 回答
1

由于 Intel 领域的内存结构,主要需要多级表。

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

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

旧的 VAX 以一个简单的方法来解决这个问题。它将 4GB 地址空间划分为 4 个区域(2 个用户、1 个系统、1 个不可用)。三个可用区域都有自己的页表。

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

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

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

于 2015-04-10T18:46:59.653 回答