考虑以下情况:内核已耗尽物理 RAM,需要换出一个页面。它选择最近最少使用的页面框架,并希望将其内容交换到磁盘并将该框架分配给另一个进程。
困扰我的是,这个页面框架通常已经映射到多个进程的几个(相同)页面。内核必须以某种方式找到所有这些进程并将页面标记为已换出。它是如何实现的?
谢谢你。
编辑:问题的插图:
在交换进程 1 和 2 之前有一个共享的 Page 1,它驻留在物理内存帧 1 中:
现在,系统中的内存已经耗尽,内核通过从第 1 帧换出第 1 页并用第 2 页替换它来为进程 3 分配内存。为了做到这一点,它必须
1)找到所有的进程,参考第1页(在我们的例子中是进程1和进程2)
2) 修改它们的页表条目,将“Present”位设置为 0,并在 Swap 中设置 Page 1 位置
所以,我不明白第 1 步是如何进行的。内核不能只是迭代地查看每个进程的页表以找到指向第 1 帧的页表条目。应该有某种从页框到页表条目的反向映射。
答案是:
“页表管理最重要和最重要的变化是引入了反向映射 (rmap)。将其称为“rmap”是故意的,因为它是“首字母缩写词”的常见用法,不应与 -rmap 混淆由 Rik van Riel 开发的树,它对股票 VM 进行了更多的更改,而不仅仅是反向映射。
在一个句子中,rmap 授予了定位所有 PTE 的能力,这些 PTE 映射了一个特定的页面,只给定了结构页面。在 2.4 中,找到映射共享页面的所有 PTE(例如内存映射共享库)的唯一方法是线性搜索属于所有进程的所有页表。这太昂贵了,Linux 试图通过使用交换缓存来避免这个问题(参见第 11.4 节)。这意味着对于许多共享页面,Linux 可能不得不换出整个进程,而不管页面年龄和使用模式如何。相反,2.6 有一个与每个结构页面相关联的 PTE 链,可以遍历它以从所有引用它的页表中删除一个页面。通过这种方式,LRU 中的页面可以以智能的方式被换出,而无需求助于交换整个进程。”
来自《了解 Linux 内存管理》,《Linux2.6 的新特性》