假设两个不同的进程分别打开两个不同的文件。通常,他们每个人都有自己的inode,每个inode都有自己的struct address_space
(这是记住页面缓存页面在内存中的位置的人)。
但是,假设我知道这些文件最初是相同的。我想想出一种尽可能智能共享缓存的方法。
我正在考虑这些策略:
向结构中添加一个新字段
struct address_space
:指向“父级”的指针。然后,每当我查找现有页面时,我也会查看父页面(如果存在)。因此,每当我写入页面时,我都需要将页面出错并将其 COW 放入主地址空间。这两个文件将共享共同的父级。将每个相关的集合分组
struct address_space
到一个链表中。每当我查找现有页面时,搜索整个链接列表。但是,在这种情况下,不允许在朋友的 address_space 上“找到”脏页。换句话说,如果一个页面变脏了,它就不能再用作备份了。在这种情况下,如果有人曾经将数据写入文件,我需要解除 address_spaces 的关联。我还需要某种 COW 行为来维持这一点。
谁能告诉我:
- 这些想法中的一个或两个都是合理的吗?
- 我应该特别注意哪些事情?
作为参考,我正在进行自定义内核破解以节省内存,因为在我的系统上打开了多个相同的文件(但不同的 inode = 不共享页面缓存)。
编辑:第三个想法:
- 保留“相关”页面缓存的链接列表,
address_space
然后每次我们从磁盘读取时,更新每个address_space
打开的结构。打开一个新的相关文件将不得不导致一个大的页表复制事情发生,除了跳过任何脏页。