我试图了解多级页表如何节省内存。根据我的理解,多级页表总共消耗比单级页表更多的内存。
示例:考虑页面大小为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
因此我们需要更多内存来存储多级页面表。
如果是这种情况,多级页表如何节省内存空间?
答案 0 :(得分:30)
访问任何数据所需的空间是2 ^ 20 * 4bytes = 4MB
在您讨论的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)允许定义可由所有进程共享的内核地址。