【问题标题】:How do I save space with inverted page tables?如何使用倒置页表节省空间?
【发布时间】:2012-06-02 01:54:47
【问题描述】:

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

【问题讨论】:

    标签: memory-management operating-system


    【解决方案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。

    我希望它很清楚。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-06-10
          • 1970-01-01
          • 1970-01-01
          • 2020-09-25
          • 1970-01-01
          • 2010-10-19
          • 1970-01-01
          • 2018-01-28
          • 1970-01-01
          相关资源
          最近更新 更多