天天看點

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

繼續閱讀