實驗三 內存管理
一、實驗目的
1、了解虛擬存儲技術的特點,掌握虛擬存儲請求頁式存儲管理中幾種基本頁面置換算法的基本思想和實現過程,並比較它們的效率。
2、了解程序設計技術和內存泄露的原因
二、實驗內容
1、模擬實現請求頁式存儲管理的幾種基本頁面置換算法
(1)最佳淘汰算法(OPT)
(2)先進先出的算法(FIFO)
(3)最近最久未使用算法(LRU))
三、實驗原理
1、虛擬存儲系統
UNIX中,為了提高內存利用率,提供了內外存進程對換機制;內存空間的分配和回收均以頁為單位進行;一個進程只需將其一部分(段或頁)調入內存便可運行;還支持請求調頁的存儲管理方式。
當進程在運行中需要訪問某部分程序和數據時,發現其所在頁面不在內存,就立即提出請求(向CPU發出缺中斷),由系統將其所需頁面調入內存。這種頁面調入方式叫請求調頁。
為實現請求調頁,核心配置了四種數據結構:頁表、頁框號、訪問位、修改位、有效位、保護位等。
2、頁面置換算法
當CPU接收到缺頁中斷信號,中斷處理程序先保存現場,分析中斷原因,轉入缺頁中斷處理程序。該程序通過查找頁表,得到該頁所在外存的物理塊號。如果此時內存未滿,能容納新頁,則啟動磁盤I/O將所缺之頁調入內存,然后修改頁表。如果內存已滿,則須按某種置換算法從內存中選出一頁准備換出,是否重新寫盤由頁表的修改位決定,然后將缺頁調入,修改頁表。利用修改后的頁表,去形成所要訪問數據的物理地址,再去訪問內存數據。整個頁面的調入過程對用戶是透明的。
(1)最佳淘汰算法(OPT):選擇永不使用或在未來最長時間內不再被訪問的頁面予以替換。
(2)先進先出的算法(FIFO):選擇在內存中駐留時間最久的頁面予以替換。
(3)最近最久未使用算法(LRU):選擇過去最長時間未被訪問的頁面予以替換。
3、首先用srand( )和rand( )函數定義和產生指令序列,然后將指令序列變換成相應的頁地址流,並針對不同的算法計算出相應的命中率。
(1)通過隨機數產生一個指令序列,共320條指令。指令的地址按下述原則生成:
A:50%的指令是順序執行的
B:25%的指令是均勻分布在前地址部分
C:25%的指令是均勻分布在后地址部分
具體的實施方法是:
A:在[0,319]的指令地址之間隨機選取一起點m
B:順序執行一條指令,即執行地址為m+1的指令
C:在前地址[0,m+1]中隨機選取一條指令並執行,該指令的地址為m’
D:順序執行一條指令,其地址為m’+1
E:在后地址[m’+2,319]中隨機選取一條指令並執行
F:重復步驟A-E,直到320次指令
(2)將指令序列變換為頁地址流
設:頁面大小為1K;
用戶內存容量4頁到32頁;
用戶虛存容量為32K。
在用戶虛存中,按每K存放10條指令排列虛存地址,即320條指令在虛存中的存放方式為:
第 0 條-第 9 條指令為第0頁(對應虛存地址為[0,9])
第10條-第19條指令為第1頁(對應虛存地址為[10,19])
………………………………
第310條-第319條指令為第31頁(對應虛存地址為[310,319])
按以上方式,用戶指令可組成32頁。
四、實驗中用到的系統調用函數(包括實驗原理中介紹的和自己采用的),自己采用的系統調用函數要按照指導書中的格式說明進行介紹。
模擬程序無用到系統調用函數
五、實驗步驟
數據結構:
(1)類PageObject:頁面對象,包含頁號NO和已在內存中停留的時間stayTime。
(2)address[TotalInstruction]:這是一個長度為320的int類型指令地址數組,用來存儲按實驗要求構造的指令序列。TotalInstruction已事先宏定義為320。
(3)InstrucPage:這是一個PageObject類型的長度為TotalInstruction的動態數組,每一號對應一條指令的所在頁面,用於將指令序列轉化為頁地址流。
(4)Truepage:這是一個PageObject類型的動態數組,上述InstrucPage數組在構造完成后由於實驗要求的規則(順序執行一條指令,其地址為m’+1)會出現連續兩個的相同頁面,Truepage數組為將上述數組的連續頁面處理過后的真正的頁地址流。
(5)phyMemory:這是一個PageObject類型的動態數組,代表系統當前的內存塊。
實驗思路:
以上述的頁面按要求構造指令序列,再將其轉化為頁地址流,構造出真正的頁地址流數組。初始化物理內存塊,按頁地址流依次讀取系統運行需要用到的頁面,判斷當前請求頁面是否存在內存塊中,如存在,則直接使用,如不存在,判斷是否有空閑內存塊,如有,則占用該內存塊直接調入頁面,如無,則使用頁面置換算法將合適頁面置換出去,換入需要頁面。結束后處於物理內存塊內的頁面滯留時間全部加1。
附:在讀取頁地址流里首先應該判斷需要的頁面號是否小於最大頁號,即申請越界檢測,但由於模擬程序中頁地址流是系統在限定范圍內隨機產生構造而成,所以不會發生越界錯誤,故在程序及流程圖中沒有體現越界檢測這一環節,但實際操作中越界檢測是必不可少的。
FiFO:選擇內存中駐留時間最久的頁面進行置換。在FIFO算法實現中只需要找到此刻內存塊頁面中駐留時間stayTime最長的頁面將其置換出去即可。
LRU:選擇過去最長時間未被訪問的頁面進行置換。在LRU中,如果需要用到的頁面已在內存中,則將該頁面駐留時間stayTime清0,其他與FIFO一致。
OPT:選擇永不使用或在未來最長時間內不再被訪問的頁面進行置換。在這個算法實現中,需要用到一個int類型的Distance數組,長度為內存塊數。當需要置換頁面時,對每一個已在內存的頁面,在頁地址流中進行尋找,記下頁地址流中距離下次訪問該頁面的距離。計算結束后對比Distance中每個頁面的數值,找出最大數值的下標號,這代表該頁為永不使用或在未來最長時間內不再被訪問的頁面。將其對應內存塊的頁面滯留時間stayTime置為無窮大。其他與FIFO一致。
流程圖:
六、實驗結果分析(截屏的實驗結果,與實驗結果對應的實驗分析)
按算法理論來說,FIFO的缺頁率應該是最高的,OPT的缺頁率是最低的。
設置物理內存塊數量為10,此時的各算法缺頁率:
FIFO:
LRU:
OPT:
通過重復實驗,可以得出,當物理內存塊數為10時,FIFO缺頁率在65-75%之間,LRU缺頁率在60-70%之間,OPT算法缺頁率最少,在37-45%之間。
改變內存塊數為5執行實驗:
FIFO:
LRU:
OPT:
通過重復實驗,可以得出,當物理內存塊數為5時,FIFO缺頁率為80-87%之間,LRU缺頁率為78-84%之間,OPT缺頁率為55-60%之間。
改變物理內存塊數,頁面置換算法的缺頁率也隨之改變。內存塊數越大,證明系統內存可存放頁面越多,缺頁的可能性就越小,減少內存塊數,缺頁的可能性就越大,所以缺頁率也就越高。
在FIFO與LRU算法的隨機試驗中,LRU缺頁率會較FIFO低一些,但如果單單對比FIFO與LRU執行一次的話,LRU不一定會比FIFO低,因為缺頁的概率總是隨機的,數據的不確定性直接導致了缺頁的不確定性。但如果多次執行這兩個算法,LRU的表現優秀於FIFO。
在算法效率方面,LRU與FIFO的時間復雜度一致,OPT的時間復雜度最高,且執行時間也最長。在計算內存內頁面下次需要使用的距離時,對每一個內存塊內的頁面,在最壞的情況下可能要將余下頁地址流全部遍歷完畢,最最壞的情況下,這樣的時間要乘以內存塊數。這大大增加了程序的執行時間,在盡量保留OPT算法的功能性的前提下,對算法進行改造,可以設定一個上限距離,規定距離超過100則表示該頁面在未來最長時間內不會被訪問或者永不使用。
七、思考題
1、從幾種算法的命中率看,哪個算法最高?哪個算法最低?對每個頁面的執行結果進行分析。
答:從幾種算法的命中率看,OPT算法的命中率最高,FIFO算法的命中率最低。
FIFO算法:
按入內存順序依次換出頁面5 2 4 1 10,可以明顯在截圖最后看到,請求頁號5換出頁號10,此時,若為OPT算法,在第一次請求換出的時候就不應該選擇5換出,因為不久的將來即將用到頁面5,此時OPT就避免了此次缺頁,這樣類似的情況一多,OPT的命中率自然就比FIFO高出很多。
2、OPT算法在執行過程中可能會發生錯誤,為什么?
答:OPT算法選擇為永不使用或未來最不可能使用的頁面,這種算法只存在於理想狀態,在現實中很難實現,OPT算法假設未來可能要用到的頁面與過去已使用過的頁面情況一致,從而對未來要使用到的頁面進行預測,雖然說有局部性,但在實際使用當中還是不一定的。
八、實驗數據及源代碼(學生必須提交自己設計的程序源代碼,並有注釋,源代碼電子版也一並提交),包括思考題的程序。
程序完整代碼請轉至個人GitHub倉庫(如果喜歡,麻煩點個star✨謝謝~)
結語:隨筆僅供參考,千萬不要照抄哦,我相信你可以的~!