32

考虑以下情况:内核已耗尽物理 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 的新特性》

4

1 回答 1

12

Linux:

当使用交换文件时,页表条目会更新为一个标记为无效并保存有关它在交换文件中保存位置的信息。即:swap_info数组的索引和swap_map.

pte_tx86 上(有点旧的)页表条目类型()的示例。一些位被硬件用作标志:

Bit         Function
_PAGE_PRESENT   Page is resident in memory and not swapped out
_PAGE_PROTNONE  Page is resident but not accessable
_PAGE_RW        Set if the page may be written to
_PAGE_USER      Set if the page is accessible from user space
_PAGE_DIRTY     Set if the page is written to
_PAGE_ACCESSED  Set if the page is accessed

表 3.1:页表条目保护和状态位

另请参阅带有 x86-64 页表格式图的另一个 SO 答案。当低位 = 0 时,硬件会忽略所有其他位,因此内核可以将它们用于任何事情。即使在“当前”条目中,也有一些保证忽略的位不会保留供将来的硬件使用,因此内核可以将它们用于自己的目的。

大概其他架构是相似的。


简单来说:一个进程指向一个页面,页面得到更新。因此,这些过程实际上也得到了更新。当物理页面被请求时,它被交换,因此所有进程也被交换。关键是在换出内存时不会删除页表条目。

您可能会发现其中一些有用:

内核文档包括 Mel Gorman (2007)的书:

于 2013-05-15T10:19:24.100 回答