缺頁中斷與頁面置換演算法

無鞋童鞋發表於2017-09-09

1 缺頁中斷:
  程式線性地址空間裡的頁面不必常駐記憶體,在執行一條指令時,如果發現他要訪問的頁沒有在記憶體中(存在位為0),那麼停止該指令的執行,併產生一個頁不存在異常,對應的故障處理程式可通過從外存載入該頁到記憶體的方法來排除故障,之後,原先引起的異常的指令就可以繼續執行,而不再產生異常。
2 頁面置換演算法:
  頁式虛擬儲存器實現的一個難點是設計頁面排程(置換)演算法,即將新頁面調入記憶體時,如果記憶體中所有的物理頁都已經分配出去,就要按某種策略來廢棄某個頁面,將其所佔據的物理頁釋放出來,好的演算法,讓缺頁率降低。常見的有先進先出排程演算法(FIFO),最近最少排程演算法(LFU,根據時間判斷),最近最不常用排程演算法(LRU,根據使用頻率判斷),最佳置換演算法(OPT)
3 頁面置換與缺頁中斷次數的計算:
 3.1 先進先出置換演算法(FIFO):
  FIFO是最簡單的頁面置換演算法。這種演算法的基本思想是:當需要淘汰一個頁面時,總是選擇駐留主存時間最長的頁面進行淘汰,即先進入主存的頁面先淘汰。其理由是:最早調入主存的頁面不再被使用的可能性最大。 假定系統為某程式分配了三個物理塊,並考慮有以下頁面號引用串:7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。
  三個物理塊先後載入的資料如下圖所示:

這裡寫圖片描述

  程式執行時,先將7, 0, 1三個頁面依次裝入記憶體(初次載入也會激發缺頁中斷)。程式訪問頁面2時,把最早進入記憶體的頁面7換出。然後訪問頁面3時,再把2, 0, 1中最先進入記憶體的頁換出。由上圖可以看出,利用FIFO演算法時進行了 12次頁面置換,效果不是特別好。
  FIFO演算法還會產生當所分配的物理塊數增大而頁故障數不減反增的異常現象,這是由 Belady於1969年發現,故稱為Belady異常,如下圖所示。只有FIFO演算法可能出現Belady 異常,而LRU和OPT演算法永遠不會出現Belady異常。
這裡寫圖片描述

  注意:記憶體的頁面中“最老“的頁面,會被新的網頁直接覆蓋,而不是“最老“的頁面先出隊,然後新的網頁從隊尾入隊。
 3.2 最近最久未使用(LRU)演算法:
  這種演算法的基本思想是:利用區域性性原理,根據一個作業在執行過程中過去的頁面訪問歷史來推測未來的行為。它認為過去一段時間裡不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。所以,這種演算法的實質是:當需要淘汰一個頁面時,總是選擇在最近一段時間內最久不用的頁面予以淘汰。
  再對上面的例項釆用LRU演算法進行頁面置換,如下圖所示。程式第一次對頁面2訪問時,將最近最久未被訪問的頁面7置換出去。然後訪問頁面3時,將最近最久未使用的頁面1換出。
這裡寫圖片描述

  LRU效能較好,但需要暫存器和棧的硬體支援。LRU是堆疊類的演算法。理論上可以證明,堆疊類演算法不可能出現Belady異常。FIFO演算法基於佇列實現,不是堆疊類演算法。
 3.3 最佳置換演算法(OPT):
  從主存中移出永遠不再需要的頁面;如無這樣的頁面存在,則選擇最長時間不需要訪問的頁面。於所選擇的被淘汰頁面將是以後永不使用的,或者是在最長時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率。
  程式要訪問頁面2時,產生缺頁中斷,根據最佳置換演算法,選擇第18次訪問才需調入的頁面7予以淘汰。然後,訪問頁面0時,因為已在記憶體中所以不必產生缺頁中斷。訪問頁面3時又會根據最佳置換演算法將頁面1淘汰……依此類推,如下圖所示,從圖中可以看出釆用最佳置換演算法時的情況。
  可以看到,發生缺頁中斷的次數為9,頁面置換的次數為6。
這裡寫圖片描述

  實際上,LRU演算法根據各頁以前的情況,是“向前看”的,而最佳置換演算法則根據各頁以後的使用情況,是“向後看”的。


  參考文獻:
  http://www.cnblogs.com/zhangbaochong/p/5827167.html
  http://blog.csdn.net/cjl5678/article/details/9010353

相關文章