缺页中断处理算法
缺頁中斷:在請求分頁系統中,可以通過查詢頁表中的狀態位來確定所要訪問的頁面是否存在于內存中。每當所要訪問的頁面不在內存是,會產生一次缺頁中斷,此時操作系統會根據頁表中的外存地址在外存中找到所缺的一頁,將其調入內存。
缺頁本身是一種中斷,與一般的中斷一樣,需要經過4個處理步驟:
1、保護CPU現場
2、分析中斷原因
3、轉入缺頁中斷處理程序進行處理
4、恢復CPU現場,繼續執行
但是缺頁中斷是由于所要訪問的頁面不存在于內存時,由硬件所產生的一種特殊的中斷,因此,與一般的中斷存在區別:
1、在指令執行期間產生和處理缺頁中斷信號
2、一條指令在執行期間,可能產生多次缺頁中斷
3、缺頁中斷返回是,執行產生中斷的一條指令,而一般的中斷返回是,執行下一條指 ???令。
?
最佳(Optimal)置換算法是指其所選擇的淘汰頁面,將是以后永不使用的,或許是在最長(未來)時間內不再被訪問的頁面。采用最佳置換算法,通常可保證獲得最低的缺頁率。但由于人們目前還無法預知一個進程在內存的若干個頁面中,哪個頁面是未來最長時間內不再被訪問的,因而該算法是無法實現的,但可以利用該算法去評價其他算法。?
?
?
先進先出(FIFO)置換算法是最簡單的頁面置換算法。這種算法的基本思想:當需要淘汰一個頁面是,總是選擇主流駐村時間最長的頁面進行淘汰,即先進入主存的頁面先淘汰。其理由是最早調入主存的頁面不在被使用的可能性最大。該算法會淘汰經常訪問的頁面,不直營進程實際運行的規律,目前已很少使用。
?
個人認為第二張表比較好理解。
?
?
?
Belady異常:一般來說,分配給進程的物理塊越多,運行時的缺頁次數應該越少,使用FIFO是,存在相反情況,分配4個物理塊的缺頁竟然比3個物理塊的缺頁次數還多。不過LRU和OPT算法永遠不會出現Belady異常。
?
?
?
?
最近最久未使用(LRU)置換算法:利用局部性原理,根據一個作業在執行過程中過去的頁面訪問歷史來推測未來的行為。它認為過去一段時間里不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。所以,這種算法的實質是當需要淘汰一個頁面時,總選擇在最近一段時間內最久不用的頁面予以淘汰。LRU算法普遍地適用于各種類型的程序,但是系統要時時刻刻對各頁的訪問歷史情況加以記錄和更新,開銷太大,因此LRU算法必須要有硬件支持。
?
個人認為第二張表比較好理解。
?
?
?
?
?
時鐘(CLOCK)置換算法
LRU算法的新能接近于OPT,但是實現起來比較困難,且開銷大;FIFO算法實現簡單,但性能差。所以操作系統的設計者嘗試了很多算法,試圖用比較小的開銷接近LRU的性能,這類算法都是CLOCK算法的變體。
簡單的CLOCK算法是給每一幀關聯一個附加位,稱為使用位。當某一頁首次裝入主存時,該幀的使用位設置為1;當該頁隨后再被訪問到時,它的使用位也被置為1。對于頁替換算法,用于替換的候選幀集合看做一個循環緩沖區,并且有一個指針與之相關聯。當某一頁被替換時,該指針被設置成指向緩沖區中的下一幀。當需要替換一頁時,操作系統掃描緩沖區,以查找使用位被置為0的一幀。每當遇到一個使用位為1的幀時,操作系統就將該位重新置為0;如果在這個過程開始時,緩沖區中所有幀的使用位均為0,則選擇遇到的第一個幀替換;如果所有幀的使用位均為1,則指針在緩沖區中完整地循環一周,把所有使用位都置為0,并且停留在最初的位置上,替換該幀中的頁。由于該算法循環地檢查各頁面的情況,故稱為CLOCK算法,又稱為最近未用(Not Recently Used, NRU)算法。
CLOCK算法的性能比較接近LRU,而通過增加使用的位數目,可以使得CLOCK算法更加高效。在使用位的基礎上再增加一個修改位,則得到改進型的CLOCK置換算法。這樣,每一幀都處于以下四種情況之一:
1、最近未被訪問,也未被修改(u=0, m=0)
2、最近被訪問,但未被修改(u=1, m=0)
3、最近未被訪問,但被修改(u=0, m=1)
4、最近被訪問,被修改(u=1, m=1)
算法執行如下操作步驟:
1、從指針的當前位置開始,掃描幀緩沖區。在這次掃描過程中,對使用為不做任何修改。選擇遇到的第一個幀(u=0, m=0)用于替換。
2、如果第一步失敗,則重新掃描,查找(u=0, m=1)的幀。選擇遇到的第一個這樣的幀用于替換。在這個掃描過程中,對每個跳過的幀,把它的使用位設置成0。
3、如果第二步失敗,指針將回到它的最初位置,并且集合中所有幀的使用位均為0.重復第一步,并且如果有必要,重復第二步。這樣將可以找到供替換的幀。
?
改進型的CLOCK算法由于簡單CLOCK算法之處在于替換時首選沒有變化的頁。由于修改的頁在被替換之前必須寫回。
?
?
?
?
??????????????
| 時鐘置換算法(CLOCK)例題: |
?
?一個作業的物理塊數為3,此作業的頁面走向為:3,4,2,6,4,3,7,4,3,6,3,4,8,4,6
| 內存及控制信息 | 輸入串 | 指針移動情況及幀替換信息 | 是否缺頁? | ||
| 內存 | 訪問位 | 指針 | 3 | 內存中沒有3,需要找到一個幀放入3, | √ |
| ? | 0 | ← | |||
| ? | 0 | ? | |||
| ? | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 4 | 內存中沒有4,需要找到一個幀放入4, | √ |
| 3 | 1 | ? | |||
| ? | 0 | ← | |||
| ? | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 2 | 內存中沒有2,需要找到一個幀放入2, | √ |
| 3 | 1 | ? | |||
| 4 | 1 | ? | |||
| ? | 0 | ← | |||
| 內存 | 訪問位 | 指針 | 6 | 內存中沒有6,需要找到一個幀放入6, | √ |
| 3 | 1 | ← | |||
| 4 | 1 | ? | |||
| 2 | 1 | ? | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置的訪問位仍為1, | ||
| 3 | 0 | ? | |||
| 4 | 1 | ← | |||
| 2 | 1 | ? | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置的訪問位仍為1, | ||
| 3 | 0 | ? | |||
| 4 | 0 | ? | |||
| 2 | 1 | ← | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置恰好有訪問位為0的, | ||
| 3 | 0 | ← | |||
| 4 | 0 | ? | |||
| 2 | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 4 | 內存中有4,于是4所在幀的訪問位變為1, | × |
| 6 | 1 | ? | |||
| 4 | 0 | ← | |||
| 2 | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 3 | 內存中沒有3,需要找到一個幀放入3, | √ |
| 6 | 1 | ? | |||
| 4 | 1 | ? | |||
| 2 | 0 | ← | |||
| 內存 | 訪問位 | 指針 | 7 | 內存中沒有7,需要找到一個幀放入7, | √ |
| 6 | 1 | ← | |||
| 4 | 1 | ? | |||
| 3 | 1 | ? | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置的訪問位仍為1, | ||
| 6 | 0 | ? | |||
| 4 | 1 | ← | |||
| 3 | 1 | ? | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置的訪問位仍為1, | ||
| 6 | 0 | ? | |||
| 4 | 0 | ? | |||
| 3 | 1 | ← | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置恰好有訪問位為0的, | ||
| 6 | 0 | ← | |||
| 4 | 0 | ? | |||
| 3 | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 4 | 內存中有4,于是4所在幀的訪問位變為1, | × |
| 7 | 1 | ? | |||
| 4 | 0 | ← | |||
| 3 | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 3 | 內存中有3,于是3所在幀的訪問位變為1, | × |
| 7 | 1 | ? | |||
| 4 | 1 | ? | |||
| 3 | 0 | ← | |||
| 內存 | 訪問位 | 指針 | 6 | 內存中沒有6,需要找到一個幀放入6, | √ |
| 7 | 1 | ← | |||
| 4 | 1 | ? | |||
| 3 | 1 | ? | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置的訪問位仍為1, | ||
| 7 | 0 | ? | |||
| 4 | 1 | ← | |||
| 3 | 1 | ? | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置的訪問位仍為1, | ||
| 7 | 0 | ? | |||
| 4 | 0 | ? | |||
| 3 | 1 | ← | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置恰好有訪問位為0的, | ||
| 7 | 0 | ← | |||
| 4 | 0 | ? | |||
| 3 | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 3 | 內存中有3,于是3所在幀的訪問位變為1, | × |
| 6 | 1 | ? | |||
| 4 | 0 | ← | |||
| 3 | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 4 | 內存中有4,于是4所在幀的訪問位變為1, | × |
| 6 | 1 | ← | |||
| 4 | 0 | ? | |||
| 3 | 1 | ? | |||
| 內存 | 訪問位 | 指針 | 8 | 內存中沒有8,需要找到一個幀放入8, | √ |
| 6 | 1 | ? | |||
| 4 | 1 | ? | |||
| 3 | 1 | ← | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置的訪問位仍為1, | ||
| 6 | 1 | ← | |||
| 4 | 1 | ? | |||
| 3 | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置的訪問位仍為1, | ||
| 6 | 0 | ? | |||
| 4 | 1 | ← | |||
| 3 | 0 | ? | |||
| 內存 | 訪問位 | 指針 | 指針所指的位置恰好有訪問位為0的, | ||
| 6 | 0 | ? | |||
| 4 | 0 | ? | |||
| 3 | 0 | ← | |||
| 內存 | 訪問位 | 指針 | 4 | 內存中有4,于是4所在幀的訪問位變為1, | × |
| 6 | 0 | ← | |||
| 4 | 0 | ? | |||
| 8 | 1 | ? | |||
| 內存 | 訪問位 | 指針 | 6 | 內存中有6,于是6所在幀的訪問位變為1, | × |
| 6 | 0 | ? | |||
| 4 | 1 | ? | |||
| 8 | 1 | ← | |||
| 內存 | 訪問位 | 指針 | 結束 | 完成 | 缺頁8次 |
| 6 | 1 | ? | |||
| 4 | 1 | ← | |||
| 8 | 1 | ||||
?
?
總結
- 上一篇: 【技术文档】jeecg3.7.1-mav
- 下一篇: 好纠结啊,JeeWx商业版本和开源版本有