linux - 属于已打开文件的内存页是否作为 vm_area_struct 进行管理?

标签 linux memory-management linux-kernel vfs page-tables

由于我只有第一版《Understanding the Linux Kernel》这本书,我看了一些Linux 2.2.14的源代码,已经很老了。

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

我知道swapping就是内核把一些page放到swap区,文件page是不能swap的。但是,内核仍然可以写回任何脏数据并取消链接文件页面以获得一些空闲页面。所以我的问题是,为什么内核不尝试释放一些属于已打开文件的页面?

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

最佳答案

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

在内存不足的情况下,将当前内存中的部分内容移动到其他存储空间可能是有意义的。匿名页面交换。文件支持页面,如果干净,就会被驱逐。如果脏了,先写回来。所以特别是它们不会以交换结束——如果你可以做同样的输入/输出并且只是让文件干净,你为什么要把它们放在那里。请注意,如果文件由远程 fs 支持并且当时已关闭,而交换是本地的,这可能有一定意义。

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

关于linux - 属于已打开文件的内存页是否作为 vm_area_struct 进行管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41021413/

相关文章:

linux - 用另一个 makefile 包装 GNU makefile

linux - awk 找到第一个匹配项,而不是所有匹配项

android - 解包 64 位设备的 'Non-Standard' Boot.img 问题

linux - 针对正在运行的内核构建外部模块

c - 如何通过信号量同步N个进程互相等待

linux - 在 linux 中使用批处理文件启动多个 firefox 配置文件

本地 (Windows) 和 VPS (Fedora) 上的 PHP 内存使用差异

c - 函数返回的字符串错误

c++ - move 构造函数孤立内存?

linux - 在 linux 中,所有内核进程共享同一个内核堆栈,每个用户进程都有自己的堆栈,对吗?