操作系统之存储管理——FIFO算法和LRU算法
操作系統之進程調度——優先權法和輪轉法(附上樣例講解)
操作系統之銀行家算法—詳解流程及案例數據
操作系統之多線程編程—讀者優先/寫者優先詳解
操作系統之存儲管理——FIFO算法和LRU算法
操作系統之磁盤調度——SCAN實例講解
要求
一、實驗目的
存儲管理的主要功能之一是合理地分配空間。請求頁式管理是一種常用的虛擬存儲管理技術。
本實驗的目的是通過請求頁式管理中頁面置換算法模擬設計,了解虛擬存儲技術的特點,掌握請求頁式存儲管理的頁面置換算法。
二、實驗內容
(1)通過計算不同算法的命中率比較算法的優劣。同時也考慮了用戶內存容量對命中率的影響。
頁面失效次數為每次訪問相應指令時,該指令所對應的頁不在內存中的次數。
在本實驗中,假定頁面大小為1k,用戶虛存容量為32k,用戶內存容量為4頁到32頁。
(2)produce_addstream通過隨機數產生一個指令序列,共320條指令。
A、指令的地址按下述原則生成:
1)50%的指令是順序執行的
2)25%的指令是均勻分布在前地址部分
3)25%的指令是均勻分布在后地址部分
B、具體的實施方法是:
1)在[0,319]的指令地址之間隨機選取一起點m;
2)順序執行一條指令,即執行地址為m 1的指令;
3)在前地址[0,m 1]中隨機選取一條指令并執行,該指令的地址為m’;
4)順序執行一條指令,地址為m’ 1的指令
5)在后地址[m’ 2,319]中隨機選取一條指令并執行;
6)重復上述步驟1)~5),直到執行320次指令
C、將指令序列變換稱為頁地址流
在用戶虛存中,按每k存放10條指令排列虛存地址,即320條指令在虛存中的存放方式為:
第0條~第9條指令為第0頁(對應虛存地址為[0,9]);
第10條~第19條指令為第1頁(對應虛存地址為[10,19]);
。。。。。。
第310條~第319條指令為第31頁(對應虛存地址為[310,319]);
按以上方式,用戶指令可組成32頁。
(3)計算并輸出下屬算法在不同內存容量下的命中率。
1)先進先出的算法(FIFO);
2)最近最少使用算法(LRU);
3)最佳淘汰算法(OPT);
4)最少訪問頁面算法(LFR);
其中3)和4)為選擇內容
三、系統框圖
一、運行結果
a、運行程序:終端先顯示:
Start memory management.
Producing address flow, wait for while, please.
b、地址流、地址頁號流生成后,終端顯示:
There are algorithms in the program
1、Optimization algorithm
2、Least recently used algorithm
3、First in first out algorithm
4、Least frequently used algorithm
Select an algorithm number, please.
用戶輸入適當淘汰算法的號碼,并按回車,若是第一次選擇,輸出相應的地址頁號流。然后輸出該算法分別計算的用戶內存從2k ~ 32k時的命中率,若輸入的號碼不再1~4中,則顯示:
there is not the algorithm in the program,并重復b。
c、輸出結果后,終端顯示 “do you try again with anther algorithm(y/n)”。若鍵入y則重復b,否則結束。(一般講四種算法都用過后結束,以便比較)。
二、運行結果討論
1、比較各種算法的命中率
2、分析當用戶內存容量增加是對命中率的影響
分析
上面就是實驗要求,因為時間關系,只寫了fifo和lru兩種,但是這兩個會了,剩下的了解算法原理就很容易實現。
對于兩種算法的理解和實現為:
先進先出算法算法(Fifo):
這個算法原理沒有算法,就是先進先出。對于這個結構最好采用的就算隊列了,對于java而言,我用的是list集合,每次添加數據的時候添加到第0位置,而如果移除的時候移除末尾的頁數。在這個過程中,每執行一條指令的時候,如果這個指令對應的地址(指令/10)在list中,那么就命中,否則就是缺頁,需要移除尾,在0位置添加元素。
舉個例子,頁面內存為3,(只能存三頁),要執行指令地址頁面對應為:4 2 3 4 1 2 1 5 6 3
那么流程順序為:(4)缺頁—>(2,4)缺頁—>(3,2,4)缺頁—>4命中—>(1,3,2)缺頁4被置換—>2命中—>1命中—>(5,1,3)缺頁2被替換—>(6,5,1)缺頁2被替換—>(3,6,5)缺頁1被替換。
最近最少使用算法(LRU):
這個算法跟fifo其實還是挺像的,但是有一點區別,最近最少使用。也就是說在一個正常序列的時候如果命中的化,就會把這個地址的頁號移動到首位(或者鏈表首位)。而如果缺頁的時候,要把這個鏈表的末尾位置移除,因為末尾的元素是最近用的最少的(很久前才有的)。對于數據結構,我依然選擇Arraylist。每次遇到指令地址的時候我只需要特殊判斷下就可以了。我只為了實驗的目的,沒有考慮性能,因為檢查是否存在地址的時候我用了list.contains()方法,這是線性查詢復雜度O(n),如果數據量大可以list map組合使用,將查詢降低到O(logn).還可以開一個boolean數組標記讓查詢復雜度降低到O(1),(但是這樣的化增大空間),還好數據量不大,影響不大。
如果頁面內存為3,(只能存三頁),要執行指令地址頁面對應為:4 2 3 4 1 2 1 5 6 3
那么流程順序為(4)—>(2,4)—>(3,2,4)—>(4,3,2)命中—>(1,4,3)缺頁2被替換—>(2,1,4)缺頁—>(1,2,4)命中—>(5,1,2)缺頁—>(6,5,1)缺頁—>(3,6,5)缺頁
代碼
大致流程就是這樣,有一點區別。
下面附上我的ac代碼。有的解釋會在注釋中:
執行結果
fifo
lur
可以看得出成功了。并且最后都是0.9因為固定缺頁數(首次命中)達到0.1.
如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai
總結
以上是生活随笔為你收集整理的操作系统之存储管理——FIFO算法和LRU算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统之多线程编程—读者优先/写者优先
- 下一篇: 操作系统之磁盘调度——SCAN实例讲解