Linux 使用内存中未使用的部分进行文件缓存,并在需要时清理空间。
我的问题是它如何选择受害者页面进行替换?有多种算法(LRU、FIFO、LFU 和随机替换)
我想知道 1)Linux 内核中使用什么页面替换算法来进行操作系统文件缓存?
2)如果可能的话,我想知道Linux内核随着时间的推移它是如何演变的。我认为考虑到趋势的“合理”变化,其算法和实现可能会随着时间的推移而改变。我怎样才能找到那些?我需要阅读内核源代码吗?
答案1
Linux 内存管理(“MM”)似乎确实有点神秘且难以追踪。
Linux 文献在内存管理方面大量提到了 LRU(最近最少使用)。我没有注意到提到的任何其他术语。
我发现一个有趣的介绍(前四段)本文在无与伦比的 LWN.net 上。它解释了如何在虚拟内存实践中实现基本的 LRU。阅读。
真正的 LFU(最不常用)替换对于虚拟内存来说并不实用。当mmap()
用于访问文件缓存页面时,内核无法计算页面的每次读取- 例如,这是大多数程序加载到内存中的方式。性能开销会太高。
为了超越这个简单的概念,这里有一个关于 Linux 版本 2.6.28-32 的设计概要:
http://linux-mm.org/PageReplacementDesign
它表明 Clock-PRO 用于文件页面。上面有一张原始纸。有一个老时钟PRO的描述在 LWN.net 上,再次包含一些实际的实现细节。显然,Clock-PRO“试图超越 LRU 方法”,其变体“在大多数系统中使用”。它似乎更加重视频率。
Linux-mm还有另一个在Linux中实现Clock-PRO的设计文档。这个并没有谈论它被合并;它是书面几个月前,LWN 发表了一篇有关它的文章。 http://linux-mm.org/ClockProApproximation
最近的描述是 Linux 只是“使用了一些想法”来自 Clock-PRO,实际上是“混合了许多不同的算法,并进行了一些修改以捕捉极端情况和各种优化”。
上述引用已回答了一个问题阿德里安·麦克梅纳明。麦克梅纳明继续完成了硕士项目2011年,测试基于“工作集模型”的Linux页面替换修改。它包括 Linux 页面替换的简要描述。 “LRU 的变体”被命名为“用于数据库管理的 2Q [双队列]方法”,提供了许多参考文献,并且有一个图表说明了两个队列之间的移动和其他状态转换。他还将 Linux 描述为使用 CLOCK-PRO 的部分实现。
我预计 LRU 概念,而不是你提到的其他可能性,是从一开始就建立的。最重要的变化是引入了基于 Clock-PRO 的功能,即更加重视频率。
2013 年,Linux 获得了“基于崩溃检测的文件缓存大小调整”。这可能也与问题相关。