日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统之存储管理——FIFO算法和LRU算法

發布時間:2025/3/20 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统之存储管理——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代碼。有的解釋會在注釋中:

package 實驗;import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Scanner;public class storemanage {static int mingzhong;static int lenyeliu=320;static int errortime;//失效次數static int random[]=new int[330];//隨機指令static Scanner sc=new Scanner(System.in);static void init()//初始隨機數{int index=0;while(index<320){int m=(int) (Math.random()*320);random[index++]=m;//順序指令int m1=(int) (Math.random()*(m+1));if(m1==320) {continue;}//跳出問本次random[index++]=m1;//前地址部分 最大317if(m1+1==320) {continue;}//跳出問本次random[index++]=m1+1;//順序指令int m2=(int) (Math.random()*(319-(m1+2))+m1+2);if(m2==320) {continue;}//跳出問本次random[index++]=m2;//后地址if(index>320){break;} }}private static void lur(){for(int memory=2;memory<=32;memory++){mingzhong=0;errortime=0;Queue<Integer>q1=new ArrayDeque<>();int index=0;while(index<320){if(q1.size()<memory){if(q1.contains(random[index]/10)){q1.remove(random[index]/10);mingzhong++;q1.add(random[index]/10);}else{q1.add(random[index]/10);errortime++;}}else{if(q1.contains(random[index]/10)){q1.remove(index);mingzhong++;}else{q1.poll();//拋出q1.add(random[index]/10);errortime++;}}index++;}double minz=1-(double)(errortime/(double)(320));//mingzhong/320一樣String minzhon=String.format("%.4f", minz);System.out.println("lur :memory:"+memory+" 缺失個數:"+errortime+" 命中個數"+mingzhong+" 命中率:"+minzhon);}System.out.println("書否繼續Y/N");String team=sc.next();if(team.equals("Y")){System.out.println("請輸入編號");int index=sc.nextInt();if(index==1) {fifo();}else{lur();}}}private static void fifo() {// TODO 自動生成的方法存根for(int memory=2;memory<=32;memory++){mingzhong=0;errortime=0;List<Integer>list=new ArrayList<>();int index=0;while(index<320){if(list.size()<memory)//小于內存{if(list.contains(random[index]/10)) {mingzhong++;}else{list.add(random[index]/10);errortime++;} }else//內存慢了{if(list.contains(random[index]/10)) {mingzhong++;}else{list.remove(0);//移除第一個list.add(random[index]/10);errortime++;}}index++;// System.out.println(index);}double minz=1-(double)(errortime/(double)(320));//mingzhong/320一樣String minzhon=String.format("%.4f", minz);System.out.println("fifo :memory:"+memory+" 缺失個數:"+errortime+" 命中個數"+mingzhong+" 命中率:"+minzhon);}System.out.println("書否繼續Y/N");String team=sc.next();if(team.equals("Y")){System.out.println("請輸入編號");int index=sc.nextInt();if(index==1) {fifo();}else{lur();}}}public static void main(String[] args) {init();System.out.println("隨機數為");for(int i=0;i<320;i++){System.out.print(String.format("%5d", random[i]));if((i+1)%20==0)System.out.println();}System.out.println("輸入選擇算法的計算方式序號\n1:先進先出的算法(FIFO);\n" + "2:最近最少使用算法(LRU);\n" + "3:最佳淘汰算法(OPT);\n" + "4:最少訪問頁面算法(LFR);");int index=sc.nextInt();if(index==1) {fifo();}else if(index==2){lur();} } }

執行結果

fifo

lur


可以看得出成功了。并且最后都是0.9因為固定缺頁數(首次命中)達到0.1.
如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai

總結

以上是生活随笔為你收集整理的操作系统之存储管理——FIFO算法和LRU算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。