模擬請求分頁式儲存管理 4種置換演算法

2022-07-05 14:06:11 字數 3241 閱讀 9961

請求調頁+頁面置換

作業系統中,為了提高記憶體利用率,提供了內外存程序對換機制;記憶體空間的分配和**均以頁為單位進行;乙個程序只需將其一部分(段或頁)調入記憶體便可執行;還支援請求調頁的儲存管理方式。

當程序在執行中需要訪問某部分程式和資料時,發現其所在頁面不在記憶體,就立即提出請求(向cpu發出缺中斷),由系統將其所需頁面調入記憶體。這種頁面調入方式叫請求調頁。

當cpu接收到缺頁中斷訊號,中斷處理程式先儲存現場,分析中斷原因,轉入缺頁中斷處理程式。該程式通過查詢頁表,得到該頁所在外存的物理塊號。如果此時記憶體未滿,能容納新頁,則啟動磁碟i/o將所缺之頁調入記憶體,然後修改頁表。如果記憶體已滿,則須按某種置換演算法從記憶體中選出一頁準備換出,是否重新寫盤由頁表的修改位決定,然後將缺頁調入,修改頁表。利用修改後的頁表,去形成所要訪問資料的實體地址,再去訪問記憶體資料。整個頁面的調入過程對使用者是透明的。

(1)   頁表:放在系統空間的頁表區,存放邏輯頁與物理頁幀的對應關係。 每乙個程序都擁有乙個自己的頁表,pcb表中有指標指向頁表。

(2)   頁框:ram塊,來描述物理記憶體空間,由作業系統實現從邏輯頁到物理頁框的頁面對映,同時負責對所有頁的管理和程序執行的控制。模擬時對於頁框的分配數量自主設定。

(3)   訪問位:不論是讀還是寫(get or set),系統都會設定該頁的訪問位,記錄本頁在一段時間內被訪問的次數,或最近已有多長時間未被訪問,它的值用來幫助作業系統在發生缺頁中斷時選擇要被淘汰的頁,即用於頁面置換。

(4)   修改位(髒位):用於頁面的換出,如果某個頁面被修改過(即為髒),在淘汰該頁時,必須將其寫回磁碟,反之,可以直接丟棄該頁。

(5) 有效位(駐留位、中斷位):表示該頁是記憶體還是磁碟。

(6) 保護位:訪問控制位,用於指出該頁允許什麼型別的訪問,如果用一位來標識的話:1表示唯讀,0表示讀寫。

least recently used 最近時間內 最久未被使用的頁面被置換

如果乙個資料在最近一段時間沒有被訪問到,那麼在將來它被訪問的可能性也很小,拿「最近的過去」**「最近的未來」。

lru演算法的硬體支援

lru演算法雖然是一種比較好的演算法,但是要求系統有較多的支援硬體。為了了解乙個程序在記憶體中的各個頁面各有多少時間未被程序訪問,以及如何快速得知道哪一頁是最近最久未使用的頁面,須有暫存器和棧兩類硬體之一的支援。 

1)暫存器

為了記錄某程序在記憶體中各頁的使用情況,須為每個記憶體中的頁面配置乙個移位暫存器,可表示為 

r=rn−1rn−2⋅⋅⋅r2r1r0

當程序訪問某物理塊時,要將相應的暫存器的rn−1

位置成1。此時,定時訊號將每隔一定時間將暫存器右移一位。如果我們把n

位暫存器的數看作是乙個整數,那麼,具有最小數值的暫存器所對應的頁面,就是最近最久未使用的頁面。 (e.g. 每100ms右移一位,最高位補0還是補1的問題)

2)棧

可利用乙個特殊的棧保持當前使用的各個頁面的頁面號。每當程序訪問某頁面是,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此,棧頂始終是最近最久未使用頁面的頁面號。

模擬實現2:

採用雙向鍊錶+heapmap配合實現,靠近鍊錶頭部的越是最近訪問過得,鍊錶尾部是最久未被訪問的,從而體現使用的時間順序,heapmap記錄表項位址。

過程:要操作頁面k

未在記憶體 1.記憶體未滿->直接插入鍊錶頭部,記錄位址

2.記憶體已滿->先刪除鍊錶尾部節點,再插入新節點到鍊錶頭部,並且更新map中增加該節點

class

lrublock

/**操作頁面k

*/void

set(int blockid,int

k)

///插入新節點到鍊錶頭部,並且更新map中增加該節點

blocklist.push_front(blocknode(blockid,k));

blockmap[k] =blocklist.begin();

}///已在記憶體

else

}list

getlist()

private

: list

blocklist;

unordered_map

blockmap;///

記錄結點位址

intsize;

};

void lru(lrublock&lru,int address,map&pagetable,map&memoryblock)

else

memoryblock[i+1]=0

; pagetable[pagenum].entrystatus=1

; pagetable[pagenum].blockid=i+1

; lru.

set(i+1

,pagenum);

}else

///先swap再分

pagebreak++;

}total++;

}

least frequently used 最少使用置換

如果乙個資料在最近一段時間內使用次數很少,那麼在將來一段時間內被使用的可能性也很小,lru的淘汰規則是基於訪問時間,而lfu是基於訪問次數的。

注意:一般情況下,lfu效率要優於lru,且能夠避免週期性或者偶發性的操作導致快取命中率下降的問題。但lfu需要記錄資料的歷史訪問記錄,一旦資料訪問模式改變,lfu需要更長時間來適用新的訪問模式,即:lfu存在歷史資料影響將來資料的「快取汙染」效用。

實現:用陣列儲存記憶體中表項情況,通過遍歷查詢最小值。

過程:要操作頁面k

未在記憶體 1.記憶體未滿:更新頁表,表項放入陣列。

2.記憶體已滿:更新頁表,陣列刪除要淘汰的表項,加入新表項。

已在記憶體:更新頁表,表項重新放入陣列。

first in first out 最早出現置換

佇列實現

過程:已在記憶體:none

不在記憶體:

記憶體未滿:表項加入隊尾

記憶體已滿:pop隊首,新表項加入隊尾

nru---not recently used

用陣列儲存記憶體中表項情況,修改陣列中表項訪問情況選擇置出頁面。

置換策略:依次訪問陣列中的表項,遇到status=1的置為0,再給一次駐留記憶體的機會,遇到status=0的換出。

過程:已在記憶體:none

不在記憶體:

記憶體未滿:表項加入陣列

記憶體已滿:拿新來表項替換置出表項

請求分頁儲存管理模擬實驗

實驗目的 通過編寫和除錯儲存管理的模擬程式以加深對儲存管理方案的理解。熟悉虛存管理的各種頁面淘汰演算法。通過編寫和除錯位址轉換過程的模擬程式以加強對位址轉換過程的了解。實驗要求 設計乙個請求頁式儲存管理方案。並編寫模擬程式實現。1 產生乙個需要訪問的指令位址流。它是一系列需要訪問的指令的位址。為不失...

請求分頁儲存管理方式

請求分頁系統是建立在基本分頁的基礎上的,為了能支援虛擬儲存器功能而增加了請求調頁功能和頁面置換功能。相應地,每次調入和換出的基本單位都是長度固定的頁面,這使得請求分頁系統在實現上要比請求分段系統簡單 請求分段系統在換進和 換出時是 可變長度的段 因此,請求分頁便成為目前最常用的一種實現虛擬儲存器的方...

基本分頁 請求分頁儲存管理方式

基本分頁儲存管理方式具有如下特徵 1 一次性。要求將作業全部裝入記憶體後方能執行。許多作業在每次執行時,並非其全部程式和資料都要用到。如果一次性地裝入其全部程式,造成記憶體空間的浪費。2 駐留性。作業裝入記憶體後,便一直駐留在記憶體中,直至作業執行結束。儘管執行中的程序會因i o而長期等待,或有的程...