1. 程式人生 > >深入理解【缺頁中斷】及FIFO、LRU、OPT這三種置換算法

深入理解【缺頁中斷】及FIFO、LRU、OPT這三種置換算法

利用 剔除 存在 table repl 重新 PE 刪除 上下文

缺頁中斷(英語:Page fault,又名硬錯誤、硬中斷、分頁錯誤、尋頁缺失、缺頁中斷、頁故障等)指的是當軟件試圖訪問已映射在虛擬地址空間中,但是目前並未被加載在物理內存中的一個分頁時,由中央處理器的內存管理單元所發出的中斷。 通常情況下,用於處理此中斷的程序是操作系統的一部分。如果操作系統判斷此次訪問是有效的,那麽操作系統會嘗試將相關的分頁從硬盤上的虛擬內存文件中調入內存。而如果訪問是不被允許的,那麽操作系統通常會結束相關的進程。 雖然其名為“頁缺失”錯誤,但實際上這並不一定是一種錯誤。而且這一機制對於利用虛擬內存來增加程序可用內存空間的操作系統(比如Microsoft Windows和各種類Unix系統)中都是常見且有必要的。 微軟在較新版Windows的資源監視器中使用“硬錯誤”(Windows Vista及以上)、“硬中斷”(Windows 8及以上)這一術語來指代“頁缺失”。

分類

軟性

軟性頁缺失指頁缺失發生時,相關的頁已經被加載進內存,但是沒有向MMU註冊的情況。操作系統只需要在MMU中註冊相關頁對應的物理地址即可。 發生這種情況的可能性之一,是一塊物理內存被兩個或多個程序共享,操作系統已經為其中的一個裝載並註冊了相應的頁,但是沒有為另一個程序註冊。 可能性之二,是該頁已被從CPU的工作集中移除,但是尚未被交換到磁盤上。比如OpenVMS這樣的使用次級頁緩存的系統,就有可能會在工作集過大的情況下,將某頁從工作集中去除,但是不寫入硬盤也不擦除(比如說這一頁被讀出硬盤後沒被修改過),只是放入空閑頁表。除非有其他程序需要,導致這一頁被分配出去了,不然這一頁的內容不會被修改。當原程序再次需要該頁內的數據時,如果這一頁確實沒有被分配出去,那麽系統只需要重新為該頁在MMU內註冊映射即可。

硬性

與軟性頁缺失相反,硬性頁缺失是指相關的頁在頁缺失發生時未被加載進內存的情況。這時操作系統需要:
  1. 尋找到一個空閑的頁。或者把另外一個使用中的頁寫到磁盤上(如果其在最後一次寫入後發生了變化的話),並註銷在MMU內的記錄
  2. 將數據讀入被選定的頁
  3. 向MMU註冊該頁
硬性頁缺失導致的性能損失是很大的。以一塊7200rpm的主流機械硬盤為例,其平均尋道時間為8.5毫秒,讀入內存需要0.05毫秒。相對的,DDR3內存的訪問延遲通常在數十到100納秒之間,性能差距可能會達到8萬到22萬倍。 另外,有些操作系統會將程序的一部分延遲到需要使用的時候再加載入內存執行,以此來提升性能。這一特性也是通過捕獲硬性頁缺失達到的。 當硬性頁缺失過於頻繁的發生時,稱發生系統顛簸。

無效

當程序訪問的虛擬地址是不存在於虛擬地址空間內的時候,則發生無效頁缺失。一般來說這是個軟件問題,但是也不排除硬件可能,比如因為內存故障而損壞了一個正確的指針。 具體動作與所使用的操作系統有關,比如Windows會使用異常機制向程序報告,而類Unix系統則會使用信號機制。如果程序未處理相關問題,那麽操作系統會執行默認處理方式,通常是轉儲內存、終止相關的程序,然後向用戶報告。

中斷


是指計算機在執行程序的過程中,當出現異常情況或特殊請求時,計算機停止現行程序的運行,轉向對這些異常情況或特殊請求的處理,處理結束後再返回現行程序的間斷處,繼續執行原程序。

缺頁中斷的次數


中斷次數=進程的物理塊數×頁面置換次數。

缺頁中斷的順序


缺頁中斷發生時的事件順序如下: 1) 硬件陷入內核,在內核堆棧中保存程序計數器。大多數機器將當前指令的各種狀態信息保存在特殊的CPU寄存器中。 2) 啟動一個匯編代碼例程保存通用寄存器和其他易失的信息,以免被操作系統破壞。這個例程將操作系統作為一個函數來調用。 3) 當操作系統發現一個缺頁中斷時,嘗試發現需要哪個虛擬頁面。通常一個硬件寄存器包含了這一信息,如果沒有的話,操作系統必須檢索程序計數器,取出這條指令,用軟件分析這條指令,看看它在缺頁中斷時正在做什麽。 4) 一旦知道了發生缺頁中斷的虛擬地址,操作系統檢查這個地址是否有效,並檢查存取與保護是否一致。如果不一致,向進程發出一個信號或殺掉該進程。如果地址有效且沒有保護錯誤發生,系統則檢查是否有空閑頁框。如果沒有空閑頁框,執行頁面置換算法尋找一個頁面來淘汰。 5) 如果選擇的頁框“臟”了,安排該頁寫回磁盤,並發生一次上下文切換,掛起產生缺頁中斷的進程,讓其他進程運行直至磁盤傳輸結束。無論如何,該頁框被標記為忙,以免因為其他原因而被其他進程占用。 6) 一旦頁框“幹凈”後(無論是立刻還是在寫回磁盤後),操作系統查找所需頁面在磁盤上的地址,通過磁盤操作將其裝入。該頁面被裝入後,產生缺頁中斷的進程仍然被掛起,並且如果有其他可運行的用戶進程,則選擇另一個用戶進程運行。 7) 當磁盤中斷發生時,表明該頁已經被裝入,頁表已經更新可以反映它的位置,頁框也被標記為正常狀態。 8) 恢復發生缺頁中斷指令以前的狀態,程序計數器重新指向這條指令。 9) 調度引發缺頁中斷的進程,操作系統返回調用它的匯編語言例程。 10) 該例程恢復寄存器和其他狀態信息 [1]

1. 缺頁中斷

  在請求分頁系統中,可以通過查詢頁表中的狀態位來確定所要訪問的頁面是否存在於內存中。每當所要訪問的頁面不在內存時,會產生一次缺頁中斷,此時操作系統會根據頁表中的外存地址在外存中找到所缺的一頁,將其調入內存。
  缺頁本身是一種中斷,與一般的中斷一樣,需要經過4個處理步驟:
  1. 保護CPU現場
  2. 分析中斷原因
  3. 轉入缺頁中斷處理程序進行處理
  4. 恢復CPU現場,繼續執行
  但是缺頁中斷時由於所要訪問的頁面不存在與內存時,有硬件所產生的一種特殊的中斷,因此,與一般的中斷存在區別:
   1. 在指令執行期間產生和處理缺頁中斷信號
   2. 一條指令在執行期間,可能產生多次缺頁中斷
   3. 缺頁中斷返回時,執行產生中斷的那一條指令,而一般的中斷返回時,執行下一條指令

2. 頁面置換算法

  進程運行過程中,如果發生缺頁中斷,而此時內存中有沒有空閑的物理塊是,為了能夠把所缺的頁面裝入內存,系統必須從內存中選擇一頁調出到磁盤的對換區。但此時應該把那個頁面換出,則需要根據一定的頁面置換算法(Page Replacement Algorithm)來確定。

2.1 最佳置換(Optimal, OPT)

2.1.1 基本思想

  置換以後不再被訪問,或者在將來最遲才回被訪問的頁面,缺頁中斷率最低。但是該算法需要依據以後各業的使用情況,而當一個進程還未運行完成是,很難估計哪一個頁面是以後不再使用或在最長時間以後才會用到的頁面。所以該算法是不能實現的。但該算法仍然有意義,作為很亮其他算法優劣的一個標準。

2.1.2 算例

  采用固定分配局部置換的策略,嘉定系統為某進程在內存中分配了3個物理塊,頁面訪問順序為2、3、2、1、5、2、4、5、3、2、5、2。假定系統未采用預調頁策略,即未事先調入任何頁面。進程運行時,一次將2、3、1三個頁面調入內存,發生3次缺頁中斷。當第一次訪問頁面5時,產生第4次缺頁中斷,根據OPT算法,淘汰頁面1,因為它在以後不會在使用了;第5次缺頁中斷時,淘汰頁面2,因為它在5、3、2三個頁面中,是在將來最遲才會被頁面訪問的頁面。以此類推:
  註意:第4次中斷時將最後不會訪問的1剔除,將最後才訪問的3放入最下面的內存塊中,以後的調度過程中,最後不會訪問或最後才被訪問的頁面總是放在最下面的內存塊中。內存塊從上到下依次存放最先訪問的頁面。
  中斷次數為6,缺頁中斷率為6/12*100% = 50%。

P:232152453252
M=3 2 2 2 2 2 5 5 3 5 5 2 2
3 3 3 5 3 3 5 4 2 5 5
1 3 2 4 4 3 4 4 4
F=5 Y Y Y Y Y Y

2.2 先進先出置換算法(First In First Out, FIFO)

2.2.1 基本思想

  置換最先調入內存的頁面,即置換在內存中駐留時間最久的頁面。按照進入內存的先後次序排列成隊列,從隊尾進入,從隊首刪除。但是該算法會淘汰經常訪問的頁面,不適應進程實際運行的規律,目前已經很少使用。

2.2.2 算例

  仍然以OPT算例為例子。
  中斷次數為6,缺頁中斷率為9/12*100% = 75%。

P:232152453252
M=3 2 3 3 1 5 2 4 4 3 3 5 2
2 2 3 1 5 2 2 4 4 3 5
2 3 1 5 5 2 2 4 3
F=9 Y Y Y Y Y Y Y Y

2.2.3 Belady異常

  一般來說,分配給進程的物理塊越多,運行時的缺頁次數應該越少,使用FIFO時,可能存在相反情況,分配4個物理塊的缺頁竟然比3個物理塊的缺頁次數還多!
  例如:進程訪問順序為0、2、1、3、0、2、4、0、2、1、3、4。
  M=3時,缺頁中斷9次。缺頁中斷率9/12*100% = 75%。

P:021302402134
M=3 0 2 1 3 0 2 4 4 4 1 3 3
0 2 1 3 0 2 2 2 4 1 1
0 2 1 3 0 0 0 2 4 4
F=9 Y Y Y Y Y Y Y Y Y

  M=4時,缺頁中斷10次。缺頁中斷率10/12*100% = 83.3%。

P:021302402134
M=4 0 2 1 3 3 3 4 0 2 1 3 4
0 2 1 1 1 3 4 0 2 1 3
0 2 2 2 1 3 4 0 2 1
0 0 0 2 1 3 4 0 2
F=10 Y Y Y Y Y Y Y Y Y Y

2.3 最近最久未使用置換算法(Least Recently Used, LRU)

2.3.1 基本思想

  置換最近一段時間以來最長時間未訪問過的頁面。根據程序局部性原理,剛被訪問的頁面,可能馬上又要被訪問;而較長時間內沒有被訪問的頁面,可能最近不會被訪問。
  LRU算法普偏地適用於各種類型的程序,但是系統要時時刻刻對各頁的訪問歷史情況加以記錄和更新,開銷太大,因此LRU算法必須要有硬件的支持。

2.3.2 算例

  仍然以OPT算例為例子。
  中斷次數為6,缺頁中斷率為7/12*100% = 58.3%。

P:232152453252
M=3 2 3 2 1 5 2 4 5 3 2 5 2
2 3 2 1 5 2 4 5 3 2 5
3 2 1 5 2 4 5 3 3
F=7 Y Y Y Y Y Y Y

  堆棧實現LRU:
  系統使用特殊的堆棧來存放內存中每一個頁面的頁號。每當訪問一頁時就調整一次,即把被訪問頁面的頁號從棧中移出再壓入棧頂。因此,棧頂始終是最新被訪問頁面的頁號,棧底始終是最近最久未被訪問的頁號。當發生缺頁中斷時,總是淘汰棧底頁號所對應的頁面。
  

參考

  1. 溫靜,計算機操作系統原理,武漢大學出版社.

目錄

  • 缺頁中斷
  • 頁面置換算法
    • 1 最佳置換Optimal OPT
      • 11 基本思想
      • 12 算例
    • 2 先進先出置換算法First In First Out FIFO
      • 21 基本思想
      • 22 算例
      • 23 Belady異常
    • 3 最近最久未使用置換算法Least Recently Used LRU
      • 31 基本思想
      • 32 算例
    • 參考
      • 目錄

深入理解【缺頁中斷】及FIFO、LRU、OPT這三種置換算法