1、最佳置換法(OPT)
最佳置換算法(OPT,Optimal) :每次選擇淘汰的頁面將是以后永不使用,或者在最長時間內不再被訪問 的頁面,這樣可以保證最低的缺頁率。
最佳置換算法可以保證最低的缺頁率,但實際上,只有在進程執行的過程中才能知道接下來會訪問到的 是哪個頁面。操作系統無法提前預判頁面訪問序列。因此,最佳置換算法是無法實現的
2、先進先出置換算法(FIFO)
先進先出置換算法(FIFO) :每次選擇淘汰的頁面是最早進入內存的頁面
實現方法:把調入內存的頁面根據調入的先后順序排成一個隊列,需要換出頁面時選擇隊頭頁面隊列的最 大長度取決於系統為進程分配了多少個內存塊。
只有FIFO算法會產生Belady異常,而LRU和OPT算法永遠不會出現Belady異常。另外,FIFO算法雖然實 現簡單,但是該算法與進程實際運行時的規律不適應,因為先進入的頁面也有可能最經常被訪問。因此,算法性能差。
FIFO的性能較差,因為較早調入的頁往往是經常被訪問的頁,這些頁在FIFO算法下被反復調入和調 出,並且有Belady現象。所謂Belady現象是指:采用FIFO算法時,如果對—個進程未分配它所要求的全 部頁面,有時就會出現分配的頁面數增多但缺頁率反而提高的異常現象。
3、最近最久未使用置換算法(LRU)
最近最久未使用置換算法(LRU,least recently used) :每次淘汰的頁面是最近最久未使用的頁面
實現方法:賦予每個頁面對應的頁表項中,用訪問字段記錄該頁面自.上次被訪問以來所經歷的時間t(該算 法的實現需要專門的硬件支持,雖然算法性能好,但是實現困難,開銷大)。當需要淘汰一個頁面時, 選擇現有頁面中t值最大的,即最近最久未使用的頁面。
LRU性能較好,但需要寄存器和棧的硬件支持。LRU是堆棧類算法,理論上可以證明,堆棧類算法不可 能出現Belady異常。
在手動做題時,若需要淘汰頁面,可以逆向檢查此時在內存中的幾個頁面號。在逆向掃描過程中最后一 個出現的頁號就是要淘汰的頁面。
4、時鍾置換算法(CLOCK)
最佳置換算法性OPT能最好,但無法實現;先進先出置換算法實現簡單,但算法性能差;最近最久未使 用置換算法性能好,是最接近OPT算法性能的,但是實現起來需要專門的硬件支持,算法開銷大。
所以操作系統的設計者嘗試了很多算法,試圖用比較小的開銷接近LRU的性能,這類算法都是CLOCK 算法的變體,因為算法要循環掃描緩沖區像時鍾一樣轉動。所以叫clock算法。
時鍾置換算法是一種性能和開銷較均衡的算法,又稱CLOCK算法,或最近未用算法(NRU,Not Recently Used)
簡單的CLOCK算法實現方法:為每個頁面設置一個訪問位,再將內存中的頁面都通過鏈接指針鏈接成一 個循環隊列。當某頁被訪問時,其訪問位置為1。當需要淘汰-一個頁面時,只需檢查頁的訪問位。如果 是0,就選擇該頁換出;如果是1,則將它置為0,暫不換出,繼續檢查下一個頁面,若第- - ~輪掃描中所 有頁面都是1,則將這些頁面的訪問位依次置為0后,再進行第二輪掃描(第二輪掃描中一定會有訪問位 為0的頁面,因此簡單的CLOCK算法選擇–個淘汰頁面最多會經過兩輪掃描)
5、改進型的時鍾置換算法
簡單的時鍾置換算法僅考慮到一個頁面最近是否被訪問過。事實上,如果被淘汰的頁面沒有被修改過,就不需要執行I/O操作寫回外存。只有被淘汰的頁面被修改過時,才需要寫回外存。
因此,除了考慮一個頁面最近有沒有被訪問過之外,操作系統還應考慮頁面有沒有被修改過。在其他條件都相同時,應優先淘汰沒有修改過的頁面,避免I/O操作。這就是改進型的時鍾置換算法的思想。修改位=0,表示頁面沒有被修改過; 修改位=1,表示頁面被修改過。
為方便討論,用(訪問位,修改位)的形式表示各頁面狀態。如(1, 1)表示一個頁面近期被訪問過,且被修改過。
改進型的Clock算法需要綜合考慮某一內存頁面的訪問位和修改位來判斷是否置換該頁面。在實際編寫算法過程中,同樣可以用一個等長的整型數組來標識每個內存塊的修改狀態。訪問位A和修改位M可以組成一下四種類型的頁面。
算法規則:將所有可能被置換的頁面排成–個循環隊列

由於第二輪已將所有幀的訪問位設為0,因此經過第三輪、第四輪掃描一定會有一個幀被選中,因此改 進型CLOCK置換算法選擇- -個淘汰頁面最多會進行四輪掃描

