Memory management 如何使用倒置的页面表节省空间?

Memory management 如何使用倒置的页面表节省空间?,memory-management,operating-system,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

如果我们使用反向页表将虚拟地址映射到物理地址,为什么要节省内存?例如,如果我们有两个进程,它们都有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>
2)倒页表
[0] = 
[1] = 
[5] = 
[9] = 
[11]= 
[14]= 
[55]= 
[63]= 

页面表必须位于一个块上(页面以数组的形式出现)。 你们可以从倒转的桌子上得到两样东西

例如,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字节


我希望这是清楚的。

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

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

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

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


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

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

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