linux2.6.28内核对页面置换算法的改进--理论

最新的2.6.28放出来了,以前很欣赏windows的内存管理,看来linux也不甘示弱,追上来了,我觉得新内核的页面置换算法非常好。新内核采用 了双指针时钟置换算法,这样的话每次就不用扫描整个页面链表了,以往都是在回收内存的时候,先扫描inactive链表,然后将可能的active链表上 的追加到inactive链表,最后回收inactive链表,这个思想是好的,一直也很稳定,但是遇到大内存就不那么好了,每次扫描的页面太多,基本就是在扫描过程中,改变页面所处的链表,活动的放到active,不活动的清除访问标志递减引用计数,不活动的引用计数为0的进行回收,这种算法看来十分笨 拙,因此新内核借鉴了Solaris的方式,采用了双指针时钟,本质上就是将inactive链表维持在一个可微调的可控范围内,每次回收的时候,就先回 收inactive链表的,当然如果有访问标志就重新放入active链表,inactive链表不断得到补充,以使得它里面页面的数量维持在上面提到的一个范围,总结起来就是扫描inactive,有访问位的置回active链表,没有的直接回收,然后从active链表补充页面到inactive链 表,这样的话每次操作的页面数量就不会随着内存的增加而无限制的增长,从而提高了效率。 
另外一个改进就是新内核认为,文件缓存的页面和匿名页面的地位不再相同,为何呢?因为匿名页面更加容易被更改,匿名页面存在的目的就是进程在运行过程中读写的,而磁盘缓存页面存在的目的是加速磁盘访问,它们一般被更改的几率并不大,因此会优先回收磁盘缓存,因为对于很多没有被修改的页面来说,直接丢弃就可 以了,不需要进行磁盘io,对于匿名页面很多都被写过,换出它们需要进行磁盘io,而磁盘io是一个很耗时的行为。对于cpu消耗型的程序,这是一种福 音,因为它们需要的匿名页面很大的几率都在内存,被回收的都是磁盘缓存页面,但是对于io消耗型的程序,这也许不是什么好消息,因为这个实现使得磁盘io 操作增加了。但是我很有信心,因为linux的可微调性,用户一定可以自行配置页面置换的行为的。 
第三个改进就是增加了不可回收链表,以往的内核在回收内存的时候会扫描所有的页面,如果有lock标志的,跳过它,但是还是要一个一个检查,新内核将不可回收的页面移出回收者扫描的视线,这样在扫描的时候就减少了扫描的数量。 

总结起来就是:新内核不再仅仅使用inactive和active两个链表,而是增加了磁盘缓存页面的lru链表以和匿名页面区分,增加了不可换出页面的链表以使之移出扫描者的视线。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274026

上一篇:贪心算法——哈夫曼编码树


下一篇:通过操作系统的进程号查看数据库的session