內存常識之缺頁中斷

什麼是缺頁中斷:算法

進程線性地址空間裏的頁面沒必要常駐內存,在執行一條指令時,若是發現他要訪問的頁沒有在內存中(存在位爲0),那麼中止該指令的執行,併產生一個頁不存在異常,對應的故障處理程序可經過從外存加載加載該頁到內存的方法來排除故障,以後,原先引發的異常的指令就能夠繼續執行,而再也不產生異常。數組

頁面調度算法:併發

頁式虛擬存儲器實現的一個難點是設計頁面調度(置換)算法,即將新頁面調入內存時,若是內存中全部的物理頁都已經分配出去,就要按某種策略來廢棄某個頁面,將其所佔據的物理頁釋放出來,好的算法,讓缺頁率下降。常見的有先進先出調度算法,最近最少調度算法,最近最不經常使用調度算法。ide

缺頁中斷的計算:函數

做業自己的程序編制方法。程序編制的方法不一樣,對缺頁中斷的次數有很大影響。spa

例如:有一個程序要將128×128的數組置初值「0。現假定分給這個程序的主存塊數只有一塊,頁面的尺寸爲每頁128個字,數組中的元素每一行存放在一頁中,開始時第一頁在主存。若程序以下編制:操作系統

Var A: array[1..128] of array [1..128] of設計

integer;htm

for j := 1 to 128進程

do for i := 1 to128

do A[i][j]:=0

則每執行一次A[i][j] :=0就要產生一次缺頁中斷,因而總共要產生(128×1281)次缺頁中斷。

若是從新編制這個程序以下:

Var A: array[1..128] of

array[1..128] of

integer;

for i := 1 to128

do for j := 1 to128

do A[i][j] := 0

那麼總共只產生(1281)次缺頁中斷。

顯然,虛擬存儲器的效率與程序的局部化程度密切相關。程序的局部化有兩種:時間局部化和空間局部化。

 

 

 

缺頁中斷就是要訪問的頁不在主存,須要操做系統將其調入主存後再進行訪問。在這個時候,被內存映射的文件實際上成了一個分頁交換文件。

 

中斷

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

 

缺頁中斷的順序

缺頁中斷髮生時的事件順序以下:

1) 硬件陷入內核,在內核堆棧中保存程序計數器。大多數機器將當前指令的各類狀態信息保存在特殊的CPU寄存器中。

2) 啓動一個彙編代碼例程保存通用寄存器和其餘易失的信息,以避免被操做系統破壞。這個例程將操做系統做爲一個函數來調用。

3) 操做系統發現一個缺頁中斷時,嘗試發現須要哪一個虛擬頁面。一般一個硬件寄存器包含了這一信息,若是沒有的話,操做系統必須檢索程序計數器,取出這條指令,用軟件分析這條指令,看看它在缺頁中斷時正在作什麼。

4) 一旦知道了發生缺頁中斷的虛擬地址操做系統檢查這個地址是否有效,並檢查存取與保護是否一致。若是不一致,向進程發出一個信號或殺掉該進程。若是地址有效且沒有保護錯誤發生,系統則檢查是否有空閒頁框。若是沒有空閒頁框,執行頁面置換算法尋找一個頁面來淘汰。

5) 若是選擇的頁框髒」了,安排該頁寫回磁盤,併發生一次上下文切換,掛起產生缺頁中斷的進程,讓其餘進程運行直至磁盤傳輸結束。不管如何,該頁框被標記爲忙,以避免由於其餘緣由而被其餘進程佔用。

6) 一旦頁框乾淨」後(不管是馬上仍是在寫回磁盤後),操做系統查找所需頁面在磁盤上的地址,經過磁盤操做將其裝入。該頁面被裝入後,產生缺頁中斷的進程仍然被掛起,而且若是有其餘可運行的用戶進程,則選擇另外一個用戶進程運行。

7) 當磁盤中斷髮生時,代表該頁已經被裝入,頁表已經更新能夠反映它的位置,頁框也被標記爲正常狀態。

8) 恢復發生缺頁中斷指令之前的狀態,程序計數器從新指向這條指令。

9) 調度引起缺頁中斷的進程,操做系統返回調用它的彙編語言例程。

10) 該例程恢復寄存器和其餘狀態信息[1]

相關文章
相關標籤/搜索