1. 程式人生 > >缺頁中斷——LRU、OPT、FIFO演算法

缺頁中斷——LRU、OPT、FIFO演算法

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: 2 3 2 1 5 2 4 5 3 2 5 2
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: 2 3 2 1 5 2 4 5 3 2 5 2
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: 0 2 1 3 0 2 4 0 2 1 3 4
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: 0 2 1 3 0 2 4 0 2 1 3 4
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: 2 3 2 1 5 2 4 5 3 2 5 2
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. 缺頁中斷