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

时间:2015-04-06 07:58:27

标签: memory operating-system paging virtual-memory page-tables

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

示例:考虑页面大小为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(条目数)*(10/8)字节(每个条目的大小)= 1.25 KB

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

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

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

4 个答案:

答案 0 :(得分:30)

  1. 在单级页面表中,您需要整个表来访问少量数据(更少的内存引用)。即2 ^ 20页,每个PTE占用4字节,如你所愿。
  2. 访问任何数据所需的空间是2 ^ 20 * 4bytes = 4MB

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

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

      最终比较是4MB对8KB。

答案 1 :(得分:8)

以下是多级页表的主要优点:

  

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

Source.(第20.3节)

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

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

答案 2 :(得分:1)

要添加到Sai's answer中,实际上必须在这里强调一个想法:您不需要将整个页表都加载到主内存中-只需要将您想去的那一部分。这补偿了您的正确直觉,即多级页表至少需要与单级页表一样大的容量(毕竟,无论表样式如何,都需要存储所有虚拟地址的映射)。

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

现在只需将我们拉出的页面写到磁盘上,然后只检索它们以备后用。这样,如果程序确实只需要一个最终级别的页表条目,那么除了实际需要的4 kB + 4 kB之外,我们会将全部4 MB存储在磁盘中的条目中。这样可以节省大量RAM。

答案 3 :(得分:0)

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

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

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

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

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

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

Intel-land没有单独的页表,而是打破了页面表。这减轻了(1)需要连续记忆的问题; (2)要求页表跨越整个地址空间; (3)允许定义可由所有进程共享的内核地址。