一 最優頁面置換算法
在進程中,一個頁面可能在10條,100條,n條指令后才可能使用,所以說指令越靠后,就可以先把它置換出去,但是這個是不可能是不可能實現的
因為程序在運行中你不可能知道以后的指令是啥,也不知道哪一條指令在什么時間出現,雖然實現不了但是可以作為我們設計頁面置換算法的指導
二 最近為使用頁面置換算法
系統為每一個頁面設置了R位和M為,當頁面被讀到 時候設置R位,當頁面被寫的時候更新M位,一旦一個位被改變則它就保持到操作系統將它復位。
所以說最后每個頁面會有四種狀態:
0 沒有被訪問,沒有被修改
1 沒有被訪問,但是被修改
2 被訪問了,但是沒有被修改
3被訪問了,被修改了
每次發生頁面中斷的時候,操作系統都會檢查每個頁面的R和M位,淘汰一個沒有被訪問的已修改頁面總比淘汰一個已訪問的未修改頁面要好。
三 先進先出算法FIFO
這個很好理解,最新進入的放在鏈表的尾部,最早進入的放在表頭,表頭的最先被淘汰
四 第二次機會頁面置換算法
這個是FIFO的一種改進,再被淘汰的時候會檢測頁面的R位,如果說R位是1的話,將R為清零,然后將它放在表尾,就先剛放入一樣。
五 時鍾頁面置換算法
第二次頁面置換算法是一個比較合理的算法,但是這種算法要經常移動鏈表,降低了效率,所以說要使用一種環形鏈表,
當頁面發生中斷的時候,檢查指針指向的頁面的R位,如果說R位為0,則將該頁面刪除,並且添加一個新頁面到這個位置,然后指針前移一個位置,
如果說R位為1 則將頁面的R位置為0,然后將指針前移一位。
六 最近最少使用頁面置換算法,
這種方法需要維護一個指針,最常使用的在表頭,最近最少使用的在表尾,但是這種方法需要經常的更新鏈表,效率不高
六 工作集頁面置換算法
在單純的分頁操作系統中,該開始的時候內存中是沒有頁面的,所以說每次讀取葉框都會發生缺頁中斷,所以說這樣的話會浪費大量的時間,
程序在運行過程中會發生一種情況就是在程序運行的某一階段,程序只會訪問頁面中的一小部分。
一個進程中正在使用的頁面的集合稱為它的工作集,它的表示可以用w(k,t),就是在任意時刻t,前k次訪問內存的頁面的集合,也就是函數w(k,t)在t時刻工作集的大小
在多任務的系統中,有時候會把進程轉移到磁盤上用以給其他進程騰出內存空間,如果說再次調入磁盤的時候就會發生大量的缺頁中斷,所以說不少系統都會跟蹤程序的工作集,
讓進程再次調入內存中的時候,它的工作集就已經在內存中,這種方式被稱為預先調頁。
如果說要實現工作集頁面置換算法,則操作系統要跟蹤哪些頁面在工作集中,當發生頁面中斷的時候,淘汰一個不在工作集中的頁面,為了實現該算法,就需要確定哪些頁面在工作集中
比如說設置一個k位的寄存器,每次訪問內存過后就把寄存器左移一位,然后然后在最右端插入剛才訪問過的頁面號,移位寄存器中的k個頁面的頁面號就是工作集中的內容,
每次發生缺頁中斷的時候就會訪問移位寄存器中的內容並且排序,然后刪除重復的頁面,結果就是工作集,但是這種方式的開銷太大,所以說基本上沒有人使用這種方式,
作為替代可以不使用k次內存訪問這個概念,轉而定義工作集為過去T秒的時間內訪問內存的集合
這個樣的話就更容易實現。
下面就是基於工作集的頁面置換算法
頁表中至少包含兩個域,上次使用該頁面的時間以及R位
當發生缺頁中斷的的時間,就會掃描在內存中頁面的R位如果說R位為1則說明該頁面被訪問過,所以說它肯定在工作集中,所以說它肯定不會被淘汰,
然后將R 為更改為1,將上次訪問該頁面的時間改為當前時間
如果說R為0,則該頁面有可能會被置換,然后比較它的上次訪問時間與T比較,如果說大於T則這個頁面不在工作集中,所以說它就應該被置換,
如果小於0,那么該頁面不應該被置換,但是應該記錄下上次訪問時間最靠前的那個頁面,如果說掃描完整個頁表都沒有找到在工作集之外的頁表項
則淘汰那個訪問時間最靠前的頁面
七 工作集時鍾置換算法
當缺頁中斷發生的時候,需要掃描整個頁表才能找到要被淘汰的頁面,這樣的話效率非常得低,
因此有一種改進算法,工作集時鍾置換算法,這種算法把葉框放在一個循環鏈表中。
