4

如果我们使用倒置页表将虚拟地址映射到物理地址,为什么要节省内存?例如,如果我们有两个进程,它们都有 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>
4

3 回答 3

10

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

但是倒排哈希表是一种全局数据结构。使用这种技术的操作系统将使用某种锁定机制在给定时间点仅授予对 1 个进程的访问权限。(想象 2 个内核上的 2 个进程同时访问全局数据)。

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

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

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

于 2012-07-21T22:04:59.950 回答
1

页表必须在一个块上(您将页面作为数组获取)。你从倒置表中得到两件事。

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

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

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

我希望这很清楚。

于 2012-05-27T07:07:03.627 回答
1

倒排页表更小,因为它的大小取决于内存大小而不是虚拟地址空间大小。如果虚拟地址空间是 2^48,则每个进程可以有 2^36 个页表条目。

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

于 2018-04-24T02:21:00.143 回答