0

由于我只有第一版:Understanding the Linux Kernel,所以看了一些Linux 2.2.14的源码,很老了。

从源代码来看,我认为属于进程通过 open() 系统调用打开的文件的内存页面不受进程的 vm_area_struct 列表管理。此外,内核似乎只在必要时交换所选进程的 vm_area_struct 列表中的页面。

我知道交换意味着内核将一些页面放入交换区域,并且文件页面无法交换。但是,内核仍然可以写回任何脏数据并取消链接文件页面以获取一些空闲页面。所以我的问题是,为什么内核也不尝试释放一些属于打开文件的页面?

或者我的理解,例如文件页面不是由进程的 vm_area_struct 列表管理的,是完全错误的吗?

4

1 回答 1

1

我对您的问题有些困惑,我认为这归结为内核是否可以在压力下释放文件占用的物理页面。当然可以而且肯定可以。

在内存不足的情况下,将当前内存中的部分内容移动到其他存储可能是有意义的。匿名页面进入交换状态。文件支持页面,如果干净,就会被驱逐。如果脏了,先写回来。因此,特别是它们不会以交换结束-如果您可以执行相同的 i/o 并且只是清理文件,为什么要将它们放在那里。请注意,如果文件由远程 fs 支持并且当时它已关闭,而 swap 是本地的,则这可能是有意义的。

对 vm_area_struct 的考虑完全是红鲱鱼。我只会注意到您的心理模型似乎已关闭。首先是一个小问题,即打开文件不会使进程映射任何东西。也许您的意思是映射文件。该文件可以同时被多个不同的进程映射,即使没有被任何人打开,页面也可以作为缓存持久存在。匿名内存在使用时也有类似的考虑——例如在 fork 之后会发生什么?因此,虽然确实给定 mm 结构最终会与特定页面建立“连接”,但下面还有一层。

于 2016-12-12T03:14:11.740 回答