第一篇:虛擬內(nèi)存頁面置換算法實驗報告
軟
件
學(xué)
院
上
機(jī)
實
驗
報
告
課程名稱:
操作系統(tǒng)原理
實驗項目:
虛擬內(nèi)存頁面置換算法
實
驗
室:
地獄 018
姓
名 :
死神
學(xué)
號:
專業(yè)班級 :
實驗時間:
2015/12 / 13
實驗成績 評閱教師
一、
實驗?zāi)康眉耙?/p>
通過這次實驗,加深對虛擬內(nèi)存頁面置換概念得理解,進(jìn)一步掌握先進(jìn)先出 FIFO、最佳置換OPI 與最近最久未使用LRU 頁面置換算法得實現(xiàn)方法。結(jié)合 Linux 得內(nèi)層得分析方法查瞧內(nèi)存得分配過程及 linux kernel 得內(nèi)存管理機(jī)制 二、實驗性質(zhì)
設(shè)計性 三、實驗學(xué)時
學(xué)時 四、實驗環(huán)境
實驗環(huán)境1、實驗環(huán)境:
C 與C++程序設(shè)計學(xué)習(xí)與實驗系統(tǒng) 2、知識準(zhǔn)備:(1)使用 Linux得基本命令;(2)了解 Linux vmstat、free、top等命令查瞧linux系統(tǒng)得內(nèi)存分配情況;(3)
掌握虛擬內(nèi)存頁面置換算法 FIFO 等基本算法理論。
五、
實驗內(nèi)容及步驟
假設(shè)有n個進(jìn)程分別在 T1, … ,Tn時刻到達(dá)系統(tǒng),它們需要得服務(wù)時間分別為S1,… ,Sn。分別采用先來先服務(wù) FCFS 與短作業(yè)優(yōu)先 SJF 進(jìn)程調(diào)度算法進(jìn)行調(diào)度,計算每個進(jìn)程得完成時間、周轉(zhuǎn)時間與帶權(quán)周轉(zhuǎn)時間,并且統(tǒng)計 n 個進(jìn)程得平均周轉(zhuǎn)時間與平均帶權(quán)周轉(zhuǎn)時間。
步驟
通過已知最小物理塊數(shù)、頁面?zhèn)€數(shù)、頁面訪問序列、及采用置換方式可以得出頁面置換得缺頁次數(shù)與缺頁率,及每次缺頁時物理塊中存儲。
1.輸入得形式
?int
PageOrder[MaxNumber];//頁面序列 int
PageNum,LackNum=0,BlockNum;//頁面?zhèn)€數(shù),缺頁次數(shù),最小物理塊數(shù) 2、輸出得形式 double
LackPageRat(yī)e//缺頁率 缺頁個數(shù) 每次缺頁時物理塊中存儲
程序所能達(dá)到得功能 模擬先進(jìn)先出 FIFO、最佳置換 OPI與最近最久未使用 LRU頁面置換算法得工作過程.假設(shè)內(nèi)存中分配給每個進(jìn)程得最小物理塊數(shù)為m,在進(jìn)程運(yùn)行過程中要訪問得頁面?zhèn)€數(shù)為 n,頁面訪問序列為P1, …,Pn,分別利用不同得頁面置換算法調(diào)度進(jìn)程得頁面訪問序列,給出頁面訪問序列得置換過程,計算每種算法缺頁次數(shù)與缺頁率。測試數(shù)據(jù),包括正確得輸入及其輸出結(jié)果與含有錯誤得輸入及其輸出結(jié)果。
程序中用到得所有抽象數(shù)據(jù)類型得定義、主程序得流程以及各程序模塊之間得層次(調(diào)用)關(guān)系.int
PageOrder[MaxNumber];//頁面序列 int
PageCount[MaxNumber]={0};//計算內(nèi)存內(nèi)數(shù)據(jù)離下一次出現(xiàn)得距離 int
PageNum,LackNum=0,BlockNum;//頁面?zhèn)€數(shù),缺頁次數(shù),最小物理塊數(shù) double
LackPageRate=0; bool found=false;
六、實驗數(shù)據(jù)及結(jié)果分析
運(yùn)行截圖:
圖6、1
圖6、2
圖6、3 七、實驗總結(jié)
這次試驗,讓我加深了對虛擬內(nèi)存頁面置換算法得理解,進(jìn)一步掌握先進(jìn)先出 FIFO、最佳置換 OPI 與最近最久未使用 LRU 頁面置換算法得實現(xiàn)方法。熟悉 Linux需要經(jīng)過大量得實驗、改進(jìn)與思考,在編寫代碼得過程中遇到了一些問題要積極面對并通過討論上網(wǎng)或者問老師解決。通過這次試驗我了解了虛擬內(nèi)存置換算法得一些知識,就是我對于所學(xué)習(xí)得專業(yè)知識得到了更好得鞏固與提升。
附錄 源程序清單 #include <iostream> using namespace std;#define MaxNumber 100 void OPI(int
PageOrder[MaxNumber],int
PageCount[MaxNumber],?
int
PageNum,int LackNum,int BlockNum,double
LackPageRate,bool found)
{
int module[MaxNumber];
int sum=0;
int i,j,k,m;
for(i=0;i { module[i]=PageOrder[i]; ;++mus??)++j;i= cout<〈module[j]<〈” "; ;ldne<〈tuoc? } LackNum=BlockNum; for(i=BlockNum;i〈PageNum;i++) { found=false; for(j=0;j<BlockNum;j++)//遍歷已存儲,判斷就是否缺頁 { ? ?? if(module[j]==PageOrder[i]) { ?? found=true; ? ? break; ? } ?? } ? if(found==false)//缺頁,選擇替換 { ? for(j=0;j〈BlockNum;j++) //計算內(nèi)存內(nèi)數(shù)據(jù)離下一次出現(xiàn)得距離 { PageCount[j]=0; for(k=i+1;k { ??? ? ? if(module[j]!=PageOrder[k]) ?? PageCount[j]++; ? esle? ;kaerb? } ? } ;]0[tnuoCegaP=xam tni? int kind=0; 值大最出找//)++j;muNkcolB〈j;0=j(rof? { ? if(PageCount[j]>max) ? { ?? ;]j[tnuoCegaP=xam?? ? ? kind=j(luò); ? } ? } module[kind]=PageOrder[i]; ? LackNum++;)++m;3 ;” ”<<]m[eludom<〈tuoc?? ?;ldne< ? } LackPageRate=(LackNum*1、0)/PageNum; cout〈〈“該算法缺頁次數(shù)為:"<〈LackNum<<endl; cout<<”該算法缺頁率為:"〈<LackPageRat(yī)e*100<〈'%”〈〈endl;} /******************************先進(jìn)先出置換算法*************************************/ void FIFO(int PageOrder[MaxNumber],int PageCount[MaxNumber],egaPkcaL elbuod ,muNkcolB tni,muNkcaL tni,muNegaP tni?Rate,bool found){ int module[MaxNumber]; int sum=0; int i,j,m; for(i=0;i〈BlockNum;i++)//將內(nèi)存填滿 { module[i]=PageOrder[i]; ;++mus?? PageCount[i]=3-i;)++j;i=<j;0=j(rof? cout<<module[j]<<" “; cout<<endl; } LackNum=BlockNum; for(i=BlockNum;i〈PageNum;i++) { found=false; for(j=0;j〈BlockNum;j++)//遍歷已存儲,判斷就是否缺頁 { ? if(module[j]==PageOrder[i]) ? { ? ;eurt=dnuof?? ? break; } } if(found==false)//缺頁,選擇替換 { ? ;]0[tnuoCegaP=xam tni? int kind=0; 值大最出找//)++j;muNkcolB〈j;0=j(rof? { ? if(PageCount[j]>max) { ;]j[tnuoCegaP=xam?? ?? kind=j; } ??? } ? for(int k=0;k<BlockNum;k++)//不就是最大值,則要+1 ? { ? ? if(k!=kind) PageCount[k]++; ? } ? module[kind]=PageOrder[i]; PageCount[kind]=0;// 替換之后已經(jīng)查詢得次數(shù)改為0 LackNum++; ? for(m=0; m〈3;m++) ? ;” ”<〈]m[eludom〈 ;ldne〈〈tuoc?? } ? } ? LackPageRate=(LackNum*1、0)/PageNum; cout〈〈“該算法缺頁次數(shù)為:”<<LackNum< cout<<”該算法缺頁率為:"< PageOrder[MaxNumber],int PageCount[MaxNumber],egaPkcaL elbuod,muNkcolB tni,muNkcaL tni,muNegaP tni??Rate,bool found){ int module[MaxNumber]; int sum=0; int i,j,m; for(i=0;i<BlockNum;i++)//將內(nèi)存填滿 { module[i]=PageOrder[i]; ? sum++; PageCount[i]=3—i;)++j;i=<j;0=j(rof? cout〈〈module[j]〈〈” ”; ;ldne〈<tuoc?? } LackNum=BlockNum; for(i=BlockNum;i { found=false; for(j=0;j<BlockNum;j++)//遍歷已存儲,判斷就是否缺頁 { ? if(module[j]==PageOrder[i]) ?? { ? found=true; PageCount[j]=0;//查詢后,更改次數(shù) ?? for(int k=0;k〈BlockNum;k++) ? { ?? ??)j=!k(fi?? PageCount[k]++; ? } ? break; ? } ? } ? if(found==false)//缺頁,選擇替換 { ? ;]0[tnuoCegaP=xam tni?? int kind=0; 值大最出找//)++j;muNkcolB ??)xam〉]j[tnuoCegaP(fi?? { ? ?;]j[tnuoCegaP=xam? ?? kind=j; } ? } ?? for(int k=0;k { ? if(k!=kind) PageCount[k]++; ?? } ? module[kind]=PageOrder[i]; PageCount[kind]=0;// 替換之后未查詢得次數(shù)改為0 ;++muNkcaL?? for(m=0; m<3;m++) ? cout〈 ”; ?;ldne<〈tuoc? } ? } ? LackPageRate=(LackNum*1、0)/PageNum; cout<〈“該算法缺頁次數(shù)為:"< cout〈<”該算法缺頁率為:”〈<LackPageRate*100〈<“%’<<endl;} int main() { int PageOrder[MaxNumber];//頁面序列 int PageCount[MaxNumber]={0};//計算內(nèi)存內(nèi)數(shù)據(jù)離下一次出現(xiàn)得距離 int PageNum,LackNum=0,BlockNum;//頁面?zhèn)€數(shù),缺頁次數(shù),最小物理塊數(shù) ;0=etaRegaPkcaL elbuod? bool found=false; ;3ecoihc,2ecoihc,0=1ecoihc tni? int i=0;)0==1ecoihc(elihw? { ;”:入輸新重:1,入輸不:0;據(jù)數(shù)入輸新重否是就“〈〈tuoc? cin〉>chioce2; if(chioce2==1) {? cout<<”請輸入頁面?zhèn)€數(shù):”; ;muNegaP >>nic?;“數(shù)塊理物小最入輸請”〈〈tuoc? ;muNkcolB>>nic? cout<〈”請輸入頁面序列:”< for(i=0;i〈PageNum;i++) ;]i[redrOegaP>〉nic? }?;”:URL-3,IPO—2,OFIF-1:法算擇選請"< if(chioce3==1) colB,muNkcaL,muNegaP,tnuoCegaP,redrOegaP(OFIF?kNum,LackPageRat(yī)e,found); else { if(chioce3==2) colB ,muNkcaL,muNegaP,tnuoCegaP,redrOegaP(IPO?kNum,LackPageRate, found); esle? ,muNkcolB ,muNkcaL,muNegaP,tnuoCegaP,redrOegaP(URL?LackPageRate,found); } *************************************“〈<tuoc?****************************”<<endl; ;"束結(jié):1,續(xù)繼:0:束結(jié)是就還續(xù)繼擇選請"< } } 《操作系統(tǒng)--頁面置換算法》 實驗報告 姓 名: 范學(xué)升 學(xué) 號:1001050903 班 級:電科10-1班 專 業(yè):電子信息科學(xué)與技術(shù) 一、實驗?zāi)康?/p> 1.通過模擬實現(xiàn)幾種基本頁面置換的算法,了解虛擬存儲技術(shù)的特點。 2.掌握虛擬存儲請求頁式存儲管理中幾種基本頁面置換算法的基本思想,并至少用三種算法來模擬實現(xiàn)。 3.通過對幾種置換算法頁面的比較,來對比他們的優(yōu)缺點,并通過比較更換頻率來對比它們的效率。 二、實驗內(nèi)容: 設(shè)計一個虛擬存儲區(qū)和內(nèi)存工作區(qū),并使用下述算法來模擬實現(xiàn)頁面的置換: 1.先進(jìn)先出的算法(FIFO)2.最近最久未使用算法(LRU)3.最佳置換算法(OPT) 三、實驗分析 在進(jìn)程運(yùn)行過程中,若其所訪問的頁面不存在內(nèi)存而需要把它們調(diào)入內(nèi)存,但內(nèi)存已無空閑時,為了保證該進(jìn)程能夠正常運(yùn)行,系統(tǒng)必須從內(nèi)存中調(diào)出一頁程序或數(shù)據(jù)送磁盤的對換區(qū)中。但應(yīng)調(diào)出哪個頁面,需根據(jù)一定的算法來確定,算法的好壞,直接影響到系統(tǒng)的性能。 一個好的頁面置換算法,應(yīng)該有較低的頁面更換頻率。 假設(shè)分給一作業(yè)的物理塊數(shù)為3,頁面數(shù)為20個。頁面號為(20個): 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1 1.先進(jìn)先出(FIFO)置換算法的思路 該算法總是淘汰最先進(jìn)入內(nèi)存的頁面,即選擇在內(nèi)存中駐留時間最久的頁面予以淘汰。該算法實現(xiàn)簡單,只需把一個進(jìn)程已調(diào)入內(nèi)存的頁面,按照先后次序連接成一個隊列,并設(shè)置一個替換指針,使它總指向最老的頁面。 2.最近久未使用(LRU)置換算法的思路 最近久未使用置換算法的替換規(guī)則,是根據(jù)頁面調(diào)入內(nèi)存后的使用情況來進(jìn)行決策的。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經(jīng)歷的時間,當(dāng)需淘汰一個頁面的時候選擇現(xiàn)有頁面中其時間值最大的進(jìn) 行淘汰。 3.最佳(OPT)置換算法的思路 其所選擇的被淘汰的頁面,獎是以后不使用的,或者是在未來時間內(nèi)不再被訪問的頁面,采用最佳算法,通??杀WC獲得最低的缺頁率。 4.?dāng)?shù)據(jù)結(jié)構(gòu) struct pageInfor { int content;//頁面號 int timer;//被訪問標(biāo)記 }; class PRA { public: PRA(void);int findSpace(void);//查找是否有空閑內(nèi)存 int findExist(int curpage);//查找內(nèi)存中是否有該頁面 int findReplace(void);//查找應(yīng)予置換的頁面 void display(void);//顯示 void FIFO(void);//FIFO算法 void LRU(void);//LRU算法 void BlockClear(void);//BLOCK清空,以便用另一種方法重新演示 pageInfor * block;//物理塊 pageInfor * page;//頁面號串 private: }; 5.FIFO頁面置換算法 當(dāng)需要訪問一個新的頁面時,首先調(diào)用findExist(i)函數(shù)來查看物理塊中是否就有這個頁面,若要查看的頁面物理塊中就有,則調(diào)用display函數(shù)直接顯示,不需要替換頁面;如果要查看的頁面物理塊中沒有,就需要尋找空閑物理塊放入,若存在有空閑物理塊,則將頁面放入;若沒有空閑物理塊,則調(diào)用findReplace函數(shù)替換頁面。并將物理塊中所有頁面timer++。 6.LRU頁面置換算法 當(dāng)需要訪問一個新的頁面,首先調(diào)用findExist(i)函數(shù)查看物理塊中是否就有這個頁面。 7.OPT頁面置換算法 當(dāng)需要訪問一個新的頁面,首先調(diào)用findExist(i)函數(shù)來查看物理塊中是否有這個頁面。 8.尋找置換頁面函數(shù)findReplace比較三個物理塊中的時間標(biāo)記timer,找到時間最久的。 四、源程序結(jié)構(gòu)分析 1. 程序結(jié)構(gòu) 程序共有以下九個部分: int findSpace(void);//查找是否有空閑內(nèi)存 int findExist(int curpage);//查找內(nèi)存中是否有該頁面 int findReplace(void);//查找應(yīng)予置換的頁面 void display(void);//顯示 void FIFO(void);//FIFO算法 void LRU(void);//LRU算法 void OPT(void);//OPT算法; void BlockClear(void);//BLOCK清空,以便用另一種方法重新演示 int main() //主程序 五、實驗結(jié)果 1運(yùn)行后的初始界面 opt算法 3.FIFO算法 4LRU算法 計算機(jī)體系結(jié)構(gòu) 實驗報告 班級:計科姓名:張華敏學(xué)號: 0902班 0909090814 FIFU算法 一,實驗內(nèi)容: 編寫一段程序來模擬頁面置換算法中的FIFU算法的實現(xiàn) 二,算法設(shè)計: 設(shè)置一個產(chǎn)生隨機(jī)數(shù)的函數(shù)rand()產(chǎn)生隨機(jī)數(shù)來模擬程序所需訪問的頁面的標(biāo)號,如果頁面需要被訪問則把頁面中的一個標(biāo)志位設(shè)為in表示他已經(jīng)被調(diào)入內(nèi)存,如果再次需要訪問此頁面是只需檢查此頁面的標(biāo)志位是否為in就可判斷它是否已經(jīng)存在在內(nèi)存中了,如果已經(jīng)存在則可直接使用,如果不存在則需調(diào)入,在調(diào)入新頁面是先檢查內(nèi)存空間是否已滿,如果未滿則直接調(diào)入,如果已經(jīng)滿了則需選擇一個頁面將其調(diào)出,調(diào)出時就把頁面的標(biāo)志位設(shè)為out。選擇頁面的規(guī)則是:將進(jìn)入內(nèi)存時間最久的頁面調(diào)出去,為了達(dá)到這一目的,在頁面中設(shè)置一個計數(shù)器,每當(dāng)有新頁面調(diào)入內(nèi)存時則將內(nèi)存中已經(jīng)存在的頁面計數(shù)器自動加一,調(diào)出頁面時就選擇那個計數(shù)器最大值的頁面,調(diào)出后重新將計數(shù)器設(shè)為零。三,遇到的問題及解決方案: 在做此實驗時遇到了一些小問題,如在C語言中函數(shù)名定義為export()則會報錯。在調(diào)用有返回值的函數(shù)是如果直接int s=use(pag)則會運(yùn)行出錯,要先分開寫如:int s,s=use(pag).四,源代碼 頭文件.cpp #include int t;//全局變量,用來盛放rand()函數(shù)產(chǎn)生的隨機(jī)數(shù) enum boolean{in,out};//定義一個枚舉類型 /////////如果把in,out換成 true,false則會處錯誤 typedef struct { int num;//頁面編號 char content;//頁面內(nèi)容 enum boolean flog;//判斷此頁面是否頁調(diào)入,調(diào)入為true,否則為false;int count;//頁面計數(shù)器 int usebit;//使用位,被使用過值為1,否則為0 }page; FIFU.cpp #include int capacity=3;//設(shè)置內(nèi)存最多可以容納的頁面數(shù) void initialize(page p[])//初始化頁面函數(shù) { for(int i=0;i<5;i++)//初始化頁面,頁面內(nèi)容分別為小寫字母 abcde,計數(shù)器全部為0 {p[i].num=i;p[i].content=i+97;p[i].flog=out;p[i].count=0;} } int use(page p[]){ t=rand()%5;//產(chǎn)生一個0-5的隨機(jī)數(shù),if(p[t].flog==in){ printf(“tt%d頁面命中n”,t);//for(int i=0;i<5;i++)//調(diào)入此頁面后其他以在內(nèi)存中存在的頁面計數(shù)器加1 // { // if(p[i].flog==in)// p[i].count++;// } return(1);} else return(0);} void import(page p[])//調(diào)入頁面的函數(shù) { /* int t=rand()%5;//產(chǎn)生一個0-5的隨機(jī)數(shù),if(p[t].flog==in)printf(“tt%d頁面命中n”,t);*/ // if(p[t].flog==out)//如果此頁面未被調(diào)入內(nèi)存則立即調(diào)入 p[t].flog=in;capacity--;//調(diào)入后內(nèi)存空間減少一葉 for(int i=0;i<5;i++)//調(diào)入此頁面后其他以在內(nèi)存中存在的頁面計數(shù)器加1 { if(p[i].flog==in&&p[i].num!=t)p[i].count++;} printf(“頁面%d被調(diào)入內(nèi)存n”,t);} void port(page p[])//調(diào)出頁面的函數(shù),,,,,,,,,,,如果函數(shù)名定義為export則處錯誤 { int x=0,y;//x用來暫時存放計數(shù)器 中的最大值,y存放此頁面的頁面號 for(int i=0;i<5;i++)//尋找計數(shù)器值最大的 頁面 { if(p[i].count>x){ x=p[i].count;y=i;} } p[y].flog=out;//修改調(diào)入符號 p[y].count=0;capacity++;//調(diào)入后內(nèi)存空間增加一葉 printf(“ttt頁面%d被調(diào)出內(nèi)存n”,y);} main(){ int s;long t3,t1,t2;page pag[5];//定義五個頁面,,,,,,,,,,,如果這個定義在子函數(shù)之前那么不用通過參數(shù) 子函數(shù)便可以直接訪問 t3=time(NULL);initialize(pag);do { t1=time(NULL);s=use(pag);//,,,,,,,,,,,,,,如果這里寫成int s=use(pag)則會運(yùn)行出錯 //printf(“s=%d capacity=%dn”,s,capacity);if(capacity>0&&s==0)import(pag);else { if(capacity==0&&s==0){ port(pag);import(pag);} } t2=time(NULL);while(t2-t1<1){ t2=time(NULL);} }while(t2-t3<20);system(“pause”);} 五,測試結(jié)果: LFU算法 一,實驗內(nèi)容: 編寫一段程序來模擬頁面置換算法中的LFU算法的實現(xiàn) 二,算法設(shè)計: 設(shè)置一個產(chǎn)生隨機(jī)數(shù)的函數(shù)rand()產(chǎn)生隨機(jī)數(shù)來模擬程序所需訪問的頁面的標(biāo)號,如果頁面需要被訪問則把頁面中的一個標(biāo)志位設(shè)為in表示他已經(jīng)被調(diào)入內(nèi)存,如果再次需要訪問此頁面是只需檢查此頁面的標(biāo)志位是否為in就可判斷它是否已經(jīng)存在在內(nèi)存中了,如果已經(jīng)存在則可直接使用,如果不存在則需調(diào)入,在調(diào)入新頁面是先檢查內(nèi)存空間是否已滿,如果未滿則直接調(diào)入,如果已經(jīng)滿了則需選擇一個頁面將其調(diào)出,調(diào)出時就把頁面的標(biāo)志位設(shè)為out。選擇頁面的規(guī)則是:將最近一段時間未被訪問過的頁面調(diào)出。為了達(dá)到這一目的在頁面中設(shè)置一個標(biāo)志位,如果頁面在近期只要被訪問過則將該標(biāo)志位設(shè)置為1(默認(rèn)為0),在選擇調(diào)出頁面時只需將標(biāo)志位為0的頁面調(diào)出即可。三,遇到的問題及解決方案: 未遇到什么問題 四,實驗感悟: 遇到問題后上網(wǎng)查資料和有效,及時查不到自己想要的但是也可從相關(guān)結(jié)果中獲得啟發(fā)給自己靈感來想到解決問題的方法.四,源代碼 FLU.cpp #include int capacity=3; //設(shè)置內(nèi)存最多可以容納的頁面數(shù) void initialize(page p[]) //初始化頁面函數(shù) { for(int i=0;i<5;i++) //初始化頁面,頁面內(nèi)容分別為小寫字母 abcde,計數(shù)器全部為0 {p[i].num=i; p[i].content=i+97; p[i].flog=out; p[i].count=0; p[i].usebit=0; } } int use(page p[]){ t=rand()%5; //產(chǎn)生一個0-5的隨機(jī)數(shù),if(p[t].flog==in) { printf(“tt%d頁面命中n”,t); p[t].usebit=1; //for(int i=0;i<5;i++)//調(diào)入此頁面后其他以在內(nèi)存中存在的頁面計數(shù)器加1 // { // if(p[i].flog==in) // p[i].count++; // } return(1); } else return(0); } void import(page p[])//調(diào)入頁面的函數(shù) { int t=rand()%5; //產(chǎn)生一個0-5的隨機(jī)數(shù),//if(p[t].flog==in) // { // printf(“tt%d頁面命中n”,t); // p[t].usebit=1; // } // if(p[t].flog==out) //如果此頁面未被調(diào)入內(nèi)存則立即調(diào)入 p[t].flog=in; capacity--; //調(diào)入后內(nèi)存空間減少一葉 for(int i=0;i<5;i++)//調(diào)入此頁面后其他以在內(nèi)存中存在的頁面計數(shù)器加1 { if(p[i].flog==in&&p[i].num!=t) p[i].count++; } printf(“頁面%d被調(diào)入內(nèi)存n”,t); } void port(page p[]) //調(diào)出頁面的函數(shù) ////////////////////////////////如果函數(shù)名定義為export則處錯誤 { int x=0,y;//x用來暫時存放計數(shù)器 中的最大值,y存放此頁面的頁面號 int z=-1; //用來判斷近期是否有未被訪問過的頁面 int g=0; for(int i=0;i<5;i++)//尋找計數(shù)器值最大的 頁面 { if(p[i].count>x) { x=p[i].count; y=i; } } for(int i=0;i<5;i++) { if(p[i].flog==in&&p[i].usebit==0) { z=i; g++; } } if(z==-1||g==3)//如果所有頁面均為1則按照FIFO算法置換頁面 //如果g=3則表明頁面使用位全為零,此時也按照FIFO算法置換頁面 { p[y].flog=out;//修改調(diào)入符號 p[y].count=0; capacity++; //調(diào)入后內(nèi)存空間增加一葉 p[y].usebit=0; for(int i=0;i<5;i++)//將所有頁面置0 p[i].usebit=0; printf(“ttt頁面%d被調(diào)出內(nèi)存n”,y); } else //如果有頁面為0則將此頁面置換出來 { p[z].flog=out;//修改調(diào)入符號 p[z].count=0; capacity++; //調(diào)入后內(nèi)存空間增加一葉 printf(“ttt頁面%d被調(diào)出內(nèi)存n”,z); } } main(){ int s; long t3,t1,t2; page pag[5];//定義五個頁面 ///////////////////如果這個定義在子函數(shù)之前那么不用通過參數(shù) 子函數(shù)便可以直接訪問 t3=time(NULL); initialize(pag); do { t1=time(NULL); s=use(pag); if(capacity>0&&s==0) import(pag); else { if(capacity==0&&s==0) { port(pag); import(pag); } } t2=time(NULL); while(t2-t1<1) { t2=time(NULL); } }while(t2-t3<20); system(“pause”);} 六,實驗結(jié)果 總結(jié) 通過本次試驗我對各種頁面置換算法有了更深入的了解,也使得自己認(rèn)識到平常學(xué)習(xí)到某些東西覺得懂了會了可是一旦實際動手操作起來就會發(fā)現(xiàn)總會存在這樣或者那樣的錯誤,只有多動手實際操作才會發(fā)現(xiàn)不足發(fā)現(xiàn)錯誤并且改正。查漏補(bǔ)缺提高自己的實際動手能力。 “計算機(jī)操作系統(tǒng)”課程設(shè)計大作業(yè) 一、題目: 頁面置換算法模擬實驗 二、目的 分別采用最佳(Optimal)置換算法、先進(jìn)先出(FIFO)頁面置換算法和最近最少使用(LRU)置換算法對用戶輸入的頁面號請求序列進(jìn)行淘汰和置換,從而加深對頁面置換算法的理解。 三、內(nèi)容和要求 請用C/C++語言編一個頁面置換算法模擬程序。用戶通過鍵盤輸入分配的物理內(nèi)存總塊數(shù),再輸入用戶邏輯頁面號請求序列,然后分別采用最佳(Optimal)置換算法、先進(jìn)先出(FIFO)頁面置換算法和最近最少使用(LRU)置換算法三種算法對頁面請求序列進(jìn)行轉(zhuǎn)換,最后按照課本P150頁圖4-26的置換圖格式輸出每次頁面請求后各物理塊內(nèi)存放的虛頁號,并算出每種算法的缺頁次數(shù)。最后評價三種頁面置換算法的優(yōu)缺點。 三種頁面置換算法的思想可參考教材P149-P152頁。 假設(shè)頁面號請求序列為4、3、2、1、4、3、5、4、3、2、1、5,當(dāng)分配給某進(jìn)程的物理塊數(shù)分別為3塊和4塊時,試用自己編寫的模擬程序進(jìn)行頁面轉(zhuǎn)換并輸出置換圖和缺頁次數(shù)。 四、提交內(nèi)容 本大作業(yè)每個人必須單獨完成,大作業(yè)以WORD附件形式提交。最后需提交的內(nèi)容包括:算法算法思路及流程圖、數(shù)據(jù)結(jié)構(gòu)說明、源程序(關(guān)鍵代碼需要注釋說明)、運(yùn)行結(jié)果截圖、心得體會及總結(jié)。 大作業(yè)嚴(yán)禁抄襲。發(fā)現(xiàn)抄襲一律以不及格論。 請大家嚴(yán)格按照大作業(yè)題目來編寫程序,不要上交以前布置的大作業(yè)。如果提交的大作業(yè)題目與本文檔要求不符,成績一律為不及格。 請大家按時在網(wǎng)院網(wǎng)上系統(tǒng)里提交大作業(yè),過了規(guī)定時間將無法再補(bǔ)交大作業(yè)。 頁面置換算法模擬實驗 算法算法思路 模擬FIFOOPTLRU這3種頁面置換算法,先分配所需的內(nèi)存空間,在根據(jù)已知的序列,分別根據(jù)不同的頁面算法去訪問已知序列,得出不同內(nèi)存空間的置換算法的缺頁數(shù)量??傮w流程圖 開始輸入內(nèi)存數(shù)執(zhí)行頁面置換FIFOLRUOPT顯示結(jié)果結(jié)束 數(shù)據(jù)結(jié)構(gòu)說明 源程序(關(guān)鍵代碼需要注釋說明)FIFO關(guān)鍵源碼 LRU關(guān)鍵源碼 OPT關(guān)鍵源碼 程序源碼 #include int bno;//定義塊號 int time;// 定義最近使用 int status;//定義命中狀態(tài) int order;//定義優(yōu)先級 }; int list[12]={4,3,2,1,4,2,5,2,3,2,1,5};// 已知序列 // 輸出方法 void output(int *a ,int n){ for(int i=0;i cout<<*a<<'t'; a++;} cout<<'n';} void fifo(int *list,int mem_num){ page p[N];// 定義記錄數(shù)組 int flag;int mem[M];// 定義內(nèi)存 int index =0;// 默認(rèn)下標(biāo) int lack=0;// 初始化內(nèi)存 for(int i=0;i mem[i]=0;} // 遍歷序列 for(i=0;i flag=0;// 設(shè)置默認(rèn)命中 0 for(int j=0;j if(list[i]==mem[j]){ // 檢測序列與已知內(nèi)存值,命中返回flag flag=1; break; } } if(flag==1){ // 判斷是否命中,則對 p 賦值 p[i].bno = j+1; p[i].pno = list[i]; p[i].status =1; }else{ p[i].pno = list[i]; p[i].status = 0; mem[index] = list[i]; p[i].bno = index+1;// 賦予 頁號 index =(index+1)%mem_num;// 每次取余 lack++; } } cout<<“FIFO算法:n”;cout<<“---**n”;cout<<“缺頁次數(shù):”<<'t'< cout<<“-----**n”;cout<<“序列號n”; cout<<“-----**n”;for(i=0;i cout<<“-----**n”;} for(i=mem_num;i } struct mem{ int order;//內(nèi)存優(yōu)先級 主要用于識別是否不常用 int pno;// 內(nèi)存頁號 int time;// 記錄是否最近使用 }; void lru(int *list,int mem_num){ page p[N];// 定義記錄數(shù)組 int flag;mem m[M];// 定義內(nèi)存 int index =0;// 默認(rèn)下標(biāo) int lack=0;int temp;int max=0;// 內(nèi)存賦值 for(int i=0;i m[i].pno=0; //默認(rèn)初始優(yōu)先級 0 m[i].order = 0;} for(i=0;i flag=0; for(int j=0;j if(list[i]==m[j].pno){ flag=1; index=j; //m[j].order++; p[i].order =m[j].order; break; } } if(flag==1){ //命中后,p[i].bno = index+1; p[i].pno = list[i]; p[i].status = 1; p[i].order--; temp = p[i].order; for(j=0;j if(p[j].order temp=p[j].order; index = p[j].bno; } } }else{ p[i].status=0; p[i].pno = list[i]; m[index].pno = list[i]; m[index].order = p[i].order; p[i].bno = index+1; for(j=0;j if(m[j].order>max){ index = j; } } index =(index+1)%mem_num;// 每次取余有效的下標(biāo) //max++; lack++; } } cout<<“LRU算法:n”;cout<<“---**n”;cout<<“缺頁次數(shù):”<<'t'< cout<<“-----**n”;cout<<“序列號n”; cout<<“-----**n”;for(i=0;i cout<<“-----**n”;} for(i=mem_num;i mem m[M];int flag=0;int index = 0;//下標(biāo) int max = N;int lack=0;for(int i=0;i m[i].pno=0; m[i].time = 0;//設(shè)置內(nèi)存使用頻率 } for(i=0;i flag=0; for(int j=0;j if(list[i]==m[j].pno){ flag=1; index = j; break; } } if(flag==1){ p[i].status =1; p[i].bno = index+1; p[i].pno = list[i]; for(j=0;j for(int g=i;g if(m[j].pno==list[g]){ m[j].time = N-g;//獲取到 最近使用 p[i].time = m[j].time; index = j; } } } }else{ p[i].status =0; p[i].pno = list[i]; m[index].pno = list[i]; m[index].time = N;//設(shè)置默認(rèn)不使用 p[i].bno =index+1; for(j=0;j if(m[j].time>max){ index = j; } } index =(index+1)%mem_num; lack++; } } cout<<“OPT算法:n”;cout<<“---**n”;cout<<“缺頁次數(shù):”<<'t'< cout<<“-----**n”;cout<<“序列號n”; cout<<“-----**n”;for(i=0;i cout<<“-----**n”;} for(i=mem_num;i void main(){ int m;cout << “===========================n”;cout << “請輸入內(nèi)存大小(3/4)n”;cin >> m;cout << “===========================n”;opt(list,m);fifo(list,m);lru(list,m); } 運(yùn)行結(jié)果截圖 FIFO、LRU、OPT運(yùn)行截圖(開辟3個內(nèi)存空間): FIFO、LRU、OPT運(yùn)行截圖(開辟4個內(nèi)存空間): 心得體會及總結(jié): 在開始做題目的時候,需要了解什么是FIOFOLRUOPT這3個頁面置換的知識點,同時參考了網(wǎng)絡(luò)上許多實現(xiàn)過程技巧,并在在紙上面簡單畫出頁面如何記錄如何與內(nèi)存置換,這樣子比較方便寫出算法。由于這次設(shè)計的時間比較倉促,其中不免會有些紕漏,比如在程序的實現(xiàn)上還不夠嚴(yán)謹(jǐn),出錯處理不夠完善等多方面問題,這些都有進(jìn)一步改善。同時,在這次編寫3個頁面算法的過程中,我學(xué)到了很多東西,無論在理論上還是實踐中,都得到不少的提高,這對以后的工作中會有一定的幫助。 操作系統(tǒng)課程第七次實驗報告 姓名 學(xué)號 系 計算機(jī) 任課教師 指導(dǎo)教師 評閱教師 實驗地點 綜合樓B102 實驗時間 2012-9-26 實驗課表現(xiàn) 出勤和個人表現(xiàn)Q1(15+15(組長評分)=30分) 得分: 實驗 總分 (Q1+Q2+Q3+Q4) 實驗完成情況Q2(45分(組長與教師評分的加權(quán)平均)) 得分: 實驗編號與實驗名稱: 實驗七、常用頁面置換算法模擬實驗 實驗?zāi)康模?/p> 通過模擬實現(xiàn)請求頁式存儲管理的幾種基本頁面置換算法,了解虛擬存儲技術(shù)的特點,掌握虛擬存儲請求頁式存儲管理中幾種基本頁面置換算法的基本思想和實現(xiàn)過程,并比較它們的效率。 實驗內(nèi)容及要求(詳見實驗講義與實驗指導(dǎo)書): 要求: 1)要求用你熟悉的程序設(shè)計語言編寫和調(diào)試一個頁面置換模擬程序;要求在主函數(shù)中測試。 2)實驗報告中必須包括:設(shè)計思想、數(shù)據(jù)定義(包括詳細(xì)說明)、處理流程(詳細(xì)算法描述和算法流程圖)、源代碼、運(yùn)行結(jié)果、體會等部分。 3)必須模擬本實驗內(nèi)容中提到的算法中的至少2種頁面置換算法。 4) 比較不同頁面置換算法的效率 內(nèi)容:編寫一個程序,使用以下頁面置換算法中的某2種分別模擬一個分頁系統(tǒng),并統(tǒng)計同一個頁面訪問序列情況下不同頁面置換算法引發(fā)的缺頁中斷次數(shù)。 1、第二次機(jī)會算法(Second Chance) 2、最近最少使用算法(Least Recently Used,LRU) 3、最不常用算法(Not Frequently Used,NFU) 4、最近未使用算法(Not Recently Used,NRU) 5、時鐘頁面置換算法 6、老化算法(aging) 頁框的數(shù)量固定為4,虛擬頁面數(shù)為8。實驗輸入為訪問頁面序列,比如0,1,3,2,7,1 實驗用到的軟件(:) DevC++,Visio 實驗內(nèi)容及關(guān)鍵步驟(代碼)Q3(15分) 得分: 流程圖:輸入頁面訪問序列 取訪問的頁號 查頁表 是否缺頁? 是 置缺頁標(biāo)志flag為’*’ 按算法不同淘汰一頁面 調(diào)入所訪問的頁面 否 FIFO算法流程圖 LRU算法流程圖: 函數(shù)關(guān)系解釋圖: 實現(xiàn)結(jié)果: 圖1 圖2 代碼: #include #include #define MEMORY_SIZE /*物理塊數(shù)*/ #define PROESS_SIZE /*頁面號引用串個數(shù)*/#include #include /*全局變量*/ int mSIZE=4; int pSIZE=8; static int memery[4]={0}; /*物理塊中的頁號*/ static int page[8]={0}; /*頁面號引用串*/ static int temp[8][4]={0}; /*輔助數(shù)組*/ /*置換算法函數(shù)*/ void FIFO(); void LRU(); void OPT(); void designBy(); /*輔助函數(shù)*/ void print(unsigned int t); /*主函數(shù)*/ int main() { int i,k,code; designBy(); system(“color 0A“); puts(“請依次輸入頁面號(8個):“); for(i=0;i scanf(“%1d“,&page[i]); system(“cls“); system(“color 0E“); do{ puts(“輸入的頁面號引用串為:“); for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(“%d\n“,page[i]); else printf(“%d “,page[i]); } } printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); printf(“* 請選擇頁面置換算法:\t\t\t *\n“); printf(“* ----------------------------------------- *\n“); printf(“* 1.先進(jìn)先出(FIFO) 2.最近最久未使用(LRU) *\n“); printf(“* 3.退出 *\n“); printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); printf(“請選擇操作:[ ]\b\b“); scanf(“%d“,&code); switch(code) { case 1: FIFO(); break; case 2: LRU(); break; case 3: system(“cls“); system(“color 0A“); exit(0); default: printf(“輸入錯誤,請重新輸入:“); } printf(“按任意鍵重新選擇置換算法:>>>“); getch(); system(“cls“); }while (code!=3); getch(); } void print(unsigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(“%d\n“,page[i]); else printf(“%d “,page[i]); } for(j=0;j { for(i=20*k;(i if(i>=j) printf(“ |%d|“,temp[i][j]); else printf(“ | |“); } for(i=mSIZE+20*k;(i { for(flag=0,l=0;l if(temp[i][l]==temp[i-1][l]) flag++; if(flag==mSIZE)/*頁面在物理塊中*/ printf(“ “); else printf(“ |%d|“,temp[i][j]); } /*每行顯示20個*/ if(i%20==0) continue; printf(“\n“); } } printf(“----------------------------------------\n“); printf(“缺頁次數(shù):%d\t\t“,t+mSIZE); printf(“缺頁率:%d/%d\n“,t+mSIZE,pSIZE); printf(“置換次數(shù):%d\t\t“,t); printf(“訪問命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE); printf(“----------------------------------------\n“); } /*先進(jìn)先出頁面置換算法*/ void FIFO() { int memery[10]={0}; int time[10]={0}; /*記錄進(jìn)入物理塊的時間*/ int i,j,k,m; int max=0; /*記錄換出頁*/ int count=0; /*記錄置換次數(shù)*/ /*前mSIZE個數(shù)直接放入*/ for(i=0;i { memery[i]=page[i]; time[i]=i; for(j=0;j temp[i][j]=memery[j]; } for(i=mSIZE;i { /*判斷新頁面號是否在物理塊中*/ for(j=0,k=0;j { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*如果不在物理塊中*/ { count++; /*計算換出頁*/ max=time[0]第二篇:頁面置換算法實驗報告(精選)
第三篇:頁面置換算法實驗報告
第四篇:頁面置換算法模擬
第五篇:操作系統(tǒng) 七次實驗報告 常用頁面置換算法模擬實驗