原文地址:http://blog.csdn.net/u011080472/article/details/51206332
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:
系統使用特殊的堆棧來存放內存中每一個頁面的頁號。每當訪問一頁時就調整一次,即把被訪問頁面的頁號從棧中移出再壓入棧頂。因此,棧頂始終是最新被訪問頁面的頁號,棧底始終是最近最久未被訪問的頁號。當發生缺頁中斷時,總是淘汰棧底頁號所對應的頁面。