Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何为索引节点指定多个地址空间结构?_Linux_Linux Kernel_Page Caching - Fatal编程技术网

Linux 如何为索引节点指定多个地址空间结构?

Linux 如何为索引节点指定多个地址空间结构?,linux,linux-kernel,page-caching,Linux,Linux Kernel,Page Caching,假设两个不同的进程分别打开两个不同的文件。通常,每个索引节点都有自己的索引节点,每个索引节点都有自己的结构地址\u空间(这是一个能够记住页面缓存页面在内存中位置的人) 但是,假设我知道这些文件最初是相同的。我想提出一种尽可能实现智能共享缓存的方法 我在考虑这些策略: 将新字段添加到struct address\u空间struct:指向“父级”的指针。然后,每当我查找现有页面时,我也会查找父页面(如果存在)。因此,每当我写入一个页面时,我都需要出错并将该页面插入主地址空间。这两个文件将共享公共父文

假设两个不同的进程分别打开两个不同的文件。通常,每个索引节点都有自己的索引节点,每个索引节点都有自己的
结构地址\u空间
(这是一个能够记住页面缓存页面在内存中位置的人)

但是,假设我知道这些文件最初是相同的。我想提出一种尽可能实现智能共享缓存的方法

我在考虑这些策略:

  • 将新字段添加到
    struct address\u空间
    struct:指向“父级”的指针。然后,每当我查找现有页面时,我也会查找父页面(如果存在)。因此,每当我写入一个页面时,我都需要出错并将该页面插入主地址空间。这两个文件将共享公共父文件

  • 在链表中对每个相关的
    struct address_space
    集合进行分组。每当我查找现有页面时,都会搜索整个链接列表。不过,在这种情况下,不允许在朋友的地址空间中“查找”脏页。换句话说,如果页面变脏,它就不能再用作备份。在这种情况下,如果有人向文件写入数据,我需要解除地址空间的关联。我还需要一些C-O-W行为来维持这一点

  • 谁能告诉我:

    • 这些想法中的一个或两个都是正确的吗
    • 我应该特别注意哪些事情
    作为参考,我正在做一个自定义内核破解来节省内存,因为在我的系统上有多个相同的文件正在打开(但不是相同的inode=不共享页面缓存)

    编辑:第三个想法:

    • 保留“相关”页面缓存的链接列表
      地址空间
      ,然后每次从磁盘读取时,更新每个打开的
      地址空间
      结构。打开一个新的相关文件将不得不导致一个大的页表复制的事情发生,除了跳过任何脏页

    你的想法听起来很有趣,让我想起了你。但是KSM不合并页面缓存页面,可能是因为没有必要或者是因为其他原因。是的,类似于KSM。除了与KSM不同之外,我想使用专门的知识在页面发生时捕获和共享页面,而不是稍后比较数据并意识到它们是相同的。@RobertMartin:自从Unix以来,我就没有看过内核的这一部分,但是那些独立的
    struct文件
    指向同一个
    inode
    ?如果它们是同一个inode,事情会自行解决的,是的。但在我的例子中,我有不同的索引节点,但文件内容相同。这是因为我有一个联合文件系统,我正在打开文件“rw”