如果我们使用反向页表将虚拟地址映射到物理地址,为什么我们会节省内存?如果我们有两个进程都有4个页面,那么我们将在两个不同的表中指向虚拟到物理地址的8个条目: Process 1:[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>第一种情况下的页表是一个每进程数据结构.每个进程都有一个指向自己的页表的指针,这个指针在调度进程时被加载到%CR3寄存器中.当它上下文切换时它也被保存与其他登记册.
但是反向散列表是一种全局数据结构.使用这种技术的操作系统将使用一些锁定机制来在给定的时间点仅访问1个进程.(想象2个进程同时访问全局数据的2个进程).
假设每个进程ram为4GB,页面大小为4096,在第一种情况下,每个进程有4GB / 4096(其页表中没有条目*每个页表项的大小),所有这些都占用了空间,对于每个进程来说用于将虚拟映射到物理的总内存是所有进程的页表大小的总和.这是更简单的方法,因为在每个上下文切换时,您将只更改指针,没有任何复杂.
在第二种情况下,您将只有一个表,只有4GB / 4096个条目,因此节省了空间,但内存管理变得复杂,因为这是一个全局数据,您将不得不在每个条目中添加更多信息,告诉当前所有者是(如你所示)等.MMU / OS必须小心同步.
但是您给出的示例并不准确,在具有每个进程页表的实际系统上可以访问整个地址,在您的情况下,进程p1有4个页面而p2有不同的页面集.实际上,这两个进程都可以访问相同的虚拟地址,映射到不同的物理帧.因此,每个表中的每个表必须有8个条目.