Memory management 如何使用倒置的页面表节省空间?
如果我们使用反向页表将虚拟地址映射到物理地址,为什么要节省内存?例如,如果我们有两个进程,它们都有4个页面,我们将在两个不同的表中有8个条目,从虚拟地址指向物理地址: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
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个条目。这也适用于任何数量的流程