【问题标题】:Page table entries in Virtual Memory虚拟内存中的页表条目
【发布时间】:2018-11-18 13:51:51
【问题描述】:

我有一个关于页表条目的简单问题。假设我们有一个 32 位的虚拟地址,它有 4 KiB 的页面和 2^28 位的物理内存大小。

由于页偏移量是 12 位,我们将有 2^20 个页表条目,它们将映射到 2^16 个物理帧。但是 2^20 个条目如何映射到 2^16 个条目。物理帧地址将用完。假设进程使用完整的 2^20 页,然后假设整个 RAM 由仅来自该进程的内存组成,那么 RAM 中的所有 2^16 帧都将包含该进程的内存。我可以说 2^4 页表条目会显示它映射到磁盘吗?

另外,如果进程只使用一个页表,那么剩余的 2^20 - 1 个页表条目将是无效的?

【问题讨论】:

    标签: operating-system paging virtual-memory


    【解决方案1】:

    您的问题中有很多假设。假设页表条目是 32 位的。它们可能是 64 位甚至 128 位。

    您还假设有 20 位可用于指示页框。任何实际系统都需要其中一些位用于控制和保护目的。

    但是 2^20 个条目如何映射到 2^16 个条目。物理帧地址将用完。

    这就是虚拟内存系统的全部意义所在。假设您有 2^20 个页面映射到一个进程,但只有 2^16 个物理页面,那么并非所有进程的页面都会同时映射到页框。

    我是否正确地说 2^4 页表条目会显示它映射到磁盘?

    合理设计的虚拟内存系统会在磁盘上的某个位置维护所有进程页面的副本。根据需要将页面从磁盘复制到内存并映射到地址空间。

    【讨论】:

    • 如果我错了,请纠正我。 1)页表是页表条目的数组,每个页表条目必须存储虚拟地址(32位)+允许位的内存。因此,根据用于 VA 的位数,页表条目的大小可能会有所不同。但是,如果我们忽略那些允许的位,那么我们可以假设 32 位 VA 的页表条目大小是 4 个字节? 2)因此假设所有VM都用于此过程,即分配了2^20页,那么至少2^4页表条目将表明相应的页在磁盘中。
    • VM 系统在某处维护磁盘上所有进程页面的副本是什么意思?如果页面在磁盘中,页表不会有 SWAP 页号吗?
    • 不,页表没有指定相应页面在磁盘上的位置——至少没有直接指定。操作系统必须进行该映射。
    • 1) 和 2) 怎么样?
    • (1) 您不能假设页表条目是 32 位的。 (2) 所有页面都在磁盘上。有些也可能在内存中。
    【解决方案2】:

    但是 2^20 个条目如何映射到 2^16 个条目。物理帧地址会用完。

    了解虚拟内存的重要一点是它是“虚拟的”——它是一种实际上(物理上)不存在的幻觉。这允许操作系统执行各种技巧,例如:

    • 将一些/许多虚拟页面标记为“未使用/不存在”,以便在不需要时不会浪费 RAM(因此程序在尝试访问不存在的内容时会出错- 例如SIGSEGV 信号)。

    • 在 RAM 和交换空间之间移动页面,以假装 RAM 比实际更多。请注意,这不仅限于“交换磁盘空间” - 例如它可能是某种设备中内置的内存(例如,视频卡中未使用的内存),不在当前机器中的内存(例如,使用网络将数据存储在另一台计算机的 RAM 中),也可能是 RAM在同一台计算机中(例如,如果一半的数据可以压缩到它的一半大小,那么“压缩为交换空间”可以让您在 3 MiB 的 RAM 中存储 4 MiB 的数据)。

    • 假装 RAM 是通过在各处映射全零的同一页来分配的,然后再分配它(当且仅当该页被写入时);这样您就可以拥有几乎没有成本的大面积零(例如程序的“.bss”部分)(直到/除非它被写入)。

    • 假装一个文件被映射/加载到内存中而不分配内存并且没有加载文件;然后分配页面并在以后访问数据时将数据加载到其中,并且(如果操作系统需要它用于其他事情,则获得更多可用 RAM)如果未修改内存(知道你如果稍后再次访问它,可以稍后再次从磁盘中获取它)

    • 将相同的 RAM 页面映射到多个进程。例如,如果您有 10 个进程都在执行相同的可执行文件;那么可执行文件可能会在 RAM 中存储一次,然后映射到虚拟文件系统的缓存中,并映射到 10 个不同的进程中。

    • “写时复制”技巧;其中 RAM 的同一页映射到许多进程(因此任何进程都可以从该页读取),然后如果一个进程写入该页,则操作系统可以分配一个新页并复制旧页并替换带有新(非共享、可写)副本的原始(共享、只读)页面。

    如果每个虚拟地址空间为 1 MiB,那么您可能有 100 个进程(具有 100 个虚拟地址空间和 1 GiB 的总空间),其中每个进程仅使用(平均)512 KiB 的虚拟地址空间,因此看起来总共使用了 51200 KiB 的虚拟内存;但是计算机可能只有 64 KiB 的 RAM,而剩余的 51136 KiB 虚拟内存只是个骗局。

    【讨论】:

      猜你喜欢
      • 2012-01-18
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2012-09-23
      相关资源
      最近更新 更多