如何使用倒置页表节省空间?

时间:2012-05-27 06:28:15

标签: memory-management operating-system

如果我们使用反向页表将虚拟地址映射到物理地址,为什么我们会节省内存?如果我们有两个进程都有4个页面,那么我们将在两个不同的表中指向虚拟到物理地址的8个条目:

Process 1:
[0] = 1
[1] = 5
[2] = 63
[3] = 0

Process 2:
[20] = 14
[21] = 55
[22] = 11
[25] = 9

如果我们使用倒置页表,我们只会有一个大表指向它。但是它们的大小相等。

2) Inverted page table

[0] = <p1 | 3>
[1] = <p1 | 0>
[5] = <p1 | 1>
[9] = <p2 | 25>
[11]= <p2 | 22>
[14]= <p2 | 20>
[55]= <p2 | 21>
[63]= <p1 | 2>

3 个答案:

答案 0 :(得分:8)

第一种情况下的页表是每个进程数据结构。每个进程都有一个指向其自己的页表的指针,该指针在调度进程时被加载到%CR3寄存器中。当上下文与其他寄存器一起切换时,也会保存它。

但是反向哈希表是一个全局数据结构。使用这种技术的操作系统将使用一些锁定机制在给定的时间点只能访问1个进程。(想象2进程)在2个内核上同时访问全局数据)。

假设每个进程ram为4GB,页面大小为4096,在第一种情况下,每个进程有4GB / 4096(其页表中没有条目*每个页表项的大小),所有这些都占用空间,创建/分叉的每个进程。用于将虚拟映射到物理的总内存是所有进程的页表大小的总和。这是更简单的方法,因为在每个上下文切换时,您只会更改指针,没有任何复杂。

在第二种情况下,您将只有一个表只有4GB / 4096个条目,因此节省了空间,但内存管理变得复杂,因为这是一个全局数据,您必须在每个条目中添加更多信息,告诉如何当前所有者(如您所示)等.MMU / OS必须小心同步。

但是您给出的示例并不准确,在每个进程页表的实际系统上可以访问整个地址,在您的情况下,进程p1有4页,p2有不同的页面集。实际上,这两个进程都可以访问相同的虚拟地址,映射到不同的物理帧。因此,每个表中的每个表必须有8个条目。

答案 1 :(得分:1)

页面表必须位于一个块上(您将获取页面中的页面)。 你可以从倒置的桌子上得到两件东西。

例如,dir表越来越小,而不是2 ^ 20表大小和2 ^ 12的偏移量,你得到2 ^ 10 dir表大小。

然后,不是为页表获取(2 ^ 20)*(2 ^ 2)字节内存,而是将大多数页面映射到磁盘中,只有在进程需要时才会分配它们。 / p>

在你的情况下,代替所有进程将有一个大小为2 ^ 20 * 2 ^ 2字节的页表,你将只有2 ^ 10 * 2 ^ 2字节的dir表和另一个2页表的^ 10 * 2 ^ 2字节。这是一个很大的区别,而不是2 ^ 22字节,你有2 ^ 13。

我希望很清楚。

答案 2 :(得分:0)

反转页表较小,因为其大小取决于内存大小而不是虚拟地址空间大小。如果虚拟地址空间为2 ^ 48,则可以每个进程具有2 ^ 36个页表条目

对于倒置的页表,页表条目的数量仅取决于内存的大小。假设你有4GB的内存,那么你的倒排页表将有2 ^ 32 - 2 ^ 12 = 2 ^ 20个条目。这也适用于任何数量的流程。