目錄
缺頁中斷
缺頁:如果進程被調度,該進程需要使用的外存頁(數據)不存在於數據塊中,這個現象就叫做缺頁。如果這個數據此時不在,就會將這個數據從加入到數據塊首部。缺頁本身是一種中斷,與一般的中斷一樣,需要經過4個處理步驟:
- 保護CPU現場
- 分析中斷原因
- 轉入缺頁中斷處理程序進行處理
- 恢復CPU現場,繼續執行
缺頁中斷:進程線性地址空間裏的頁面不必常駐內存,在執行一條指令時,如果發現他要訪問的頁沒有在內存中(存在位爲0),那麼停止該指令的執行,併產生一個頁不存在異常,對應的故障處理程序可通過從外存加載該頁到內存的方法來排除故障,之後,原先引起的異常的指令就可以繼續執行,而不再產生異常。
缺頁中斷是由於所要訪問的頁面不存在於內存時,由硬件所產生的一種特殊的中斷,因此,與一般的中斷存在區別:
- 在指令執行期間產生和處理缺頁中斷信號。
- 一條指令在執行期間,可能產生多次缺頁中斷。
- 缺頁中斷返回時,執行產生中斷的那一條指令,而一般的中斷返回時,執行下一條指令。
頁面置換算法:
進程運行過程中,如果發生缺頁中斷,而此時內存中又沒有空閒的數據塊,爲了能夠把所缺的頁面裝入內存,系統必須從內存中選擇一頁調出到磁盤的對換區。此時把那個頁面換出則需要根據一定的頁面置換算法(PPA)來確定。
將新頁面調入內存時,如果內存中所有的物理頁都已經分配出去,就要按某種算法(頁面置換算法)來廢棄某個頁面,將其所佔據的物理頁釋放出來,好的算法會讓缺頁率降低。常見的頁面置換算法有:
- 先進先出調度算法(FIFO)
- 最近最不常用調度算法(LRU,根據使用頻率判斷)
- 最佳置換算法(OPT)
LRU算法
一、概念:
- LRU算法:最近最不常用調度算法(least recently used) ,簡單來說就是將數據塊中,每次使用過的數據放在數據塊的最前端,然後將存在的時間最長的,也就是數據塊的末端的數據剔除掉,這就是LRU算法。
- 數據塊插入與剔除:每次有新數據到來時,會將其放入數據塊首部,當數據每次被訪問時,將這個數據插入數據塊的首部;如果數據塊滿了,每次新進的數據都會將數據塊尾部的數據擠出數據塊。
二、基本思想:
選擇在最近一段時間內最久未被使用的頁面進行淘汰。
三、特點:
- 優點:由於考慮程序訪問的時間局部性,一般能有較好的性能;實際應用多。
- 缺點:實現需要較多的硬件支持,會增加硬件成本。
四、缺頁次數計算:
例:假如現在有一組進程:進程編號爲1,2,3,4,5
虛擬頁式存儲管理的數據塊大小爲3(也就是這個頁式存儲區的大小,能放置3個頁面)。
假如進程被調度順序爲3.4.2.1.4.5.3.4.5.1.2。
問:在該訪問中發生的缺頁次數是多少?
解: 進程將要被調度的順序:
- step1:開始時數據塊爲空,第一個進程(進程3)被調度時,未命中數據塊緩存,缺頁並將進程對應數據放入數據塊中
- step2:接着調用進程4,此時數據塊中也沒有4的數據,未命中數據塊緩存,缺頁並將進程對應數據放入數據塊中
- step3:同step1、step2,完成後數據塊已存滿數據,缺頁
- step4:接着調用進程1,由於數據塊沒有1的數據且數據塊已滿,故剔掉隊尾的數據3,放入數據1,缺頁。
- step5:接着調用進程4,此時進程4的數據在數據塊緩存中,故並未缺頁,然後將數據4重新插入到數據塊首部。
以此類推得到最後的結果:缺頁次數爲8次。