Linux内核中的内存重复数据删除

时间:2014-04-23 23:29:47

标签: linux memory

任何人都能解释一下Linux内核中重复数据删除所涉及的算法 https://www.ibm.com/developerworks/library/l-kernel-shared-memory/

我发现很难理解和实施它。任何人都可以通过简单的步骤向我解释。

1 个答案:

答案 0 :(得分:1)

您链接的文章看起来很简单。

  1. 应用程序通知内核(使用madvise()系统调用),其内存的某些区域可能包含重复的页面。
  2. ksmd将此区域中的页面添加到“易失性列表”(实际上是树,以便以后查找)。 “易变”意味着页面仍有可能发生变化。
  3. 对于“volatile”列表中的每个页面,计算校验和。 ksmd将立即扫描列表中的所有页面,以查看校验和是否已更改。如果它确实每次都不同,则不需要做任何事情(页面仍然是“易变的”)。
  4. 如果经过一定数量的扫描ksmd注意到某些特定页面的校验和在迭代之间停止变化(页面已“稳定”),则可将其置于“稳定”列表中。
  5. ksmd将扫描“稳定”列表中的所有现有页面,以查看是否已存在与候选页面内容匹配的页面。如果找到这样的页面,则丢弃候选页面,并将来自“稳定”列表的现有页面映射到其位置为只读(并且稳定页面的相关引用计数递增)。
  6. 如果“稳定”列表中现在存在匹配的页面,则候选页面将标记为“只读”并从“易失性”列表移至稳定列表。
  7. 如果应用程序尝试修改“稳定”页面,它将在内核中出现“保护错误”。错误处理程序将调用ksmd来检查页面是否在其“稳定”列表中。如果是,它将生成该页面的可写副本并将其重新放回“易失性”列表,从应用程序地址空间取消映射“稳定”页面并减少“稳定”页面的引用计数(如果计数在此阶段达到0) ,“稳定”页面被释放。