下面是范文網(wǎng)小編整理的頁(yè)面置換算法實(shí)驗(yàn)報(bào)告精選3篇(操作系統(tǒng)頁(yè)面置換算法實(shí)驗(yàn)報(bào)告總結(jié)),供大家品鑒。
頁(yè)面置換算法實(shí)驗(yàn)報(bào)告精選1
軟
件
學(xué)
院
上
機(jī)
實(shí)
驗(yàn)
報(bào)
告
課程名稱:
操作系統(tǒng)原理
實(shí)驗(yàn)項(xiàng)目:
虛擬內(nèi)存頁(yè)面置換算法
實(shí)
驗(yàn)
室:
地獄 018
姓
名 :
死神
學(xué)
號(hào):
專業(yè)班級(jí) :
實(shí)驗(yàn)時(shí)間:
2015/12 / 13
實(shí)驗(yàn)成績(jī) 評(píng)閱教師
一、
實(shí)驗(yàn)?zāi)康眉耙?/p>
通過(guò)這次實(shí)驗(yàn),加深對(duì)虛擬內(nèi)存頁(yè)面置換概念得理解,進(jìn)一步掌握先進(jìn)先出 FIFO、最佳置換OPI 與最近最久未使用LRU 頁(yè)面置換算法得實(shí)現(xiàn)方法。結(jié)合 Linux 得內(nèi)層得分析方法查瞧內(nèi)存得分配過(guò)程及 linux kernel 得內(nèi)存管理機(jī)制 二、實(shí)驗(yàn)性質(zhì)
設(shè)計(jì)性 三、實(shí)驗(yàn)學(xué)時(shí)
學(xué)時(shí) 四、實(shí)驗(yàn)環(huán)境
實(shí)驗(yàn)環(huán)境1、實(shí)驗(yàn)環(huán)境:
C 與C++程序設(shè)計(jì)學(xué)習(xí)與實(shí)驗(yàn)系統(tǒng) 2、知識(shí)準(zhǔn)備:(1)使用 Linux得基本命令;(2)了解 Linux vmstat、free、top等命令查瞧linux系統(tǒng)得內(nèi)存分配情況;(3)
掌握虛擬內(nèi)存頁(yè)面置換算法 FIFO 等基本算法理論。
五、
實(shí)驗(yàn)內(nèi)容及步驟
假設(shè)有n個(gè)進(jìn)程分別在 T1, … ,Tn時(shí)刻到達(dá)系統(tǒng),它們需要得服務(wù)時(shí)間分別為S1,… ,Sn。分別采用先來(lái)先服務(wù) FCFS 與短作業(yè)優(yōu)先 SJF 進(jìn)程調(diào)度算法進(jìn)行調(diào)度,計(jì)算每個(gè)進(jìn)程得完成時(shí)間、周轉(zhuǎn)時(shí)間與帶權(quán)周轉(zhuǎn)時(shí)間,并且統(tǒng)計(jì) n 個(gè)進(jìn)程得平均周轉(zhuǎn)時(shí)間與平均帶權(quán)周轉(zhuǎn)時(shí)間。
步驟
通過(guò)已知最小物理塊數(shù)、頁(yè)面?zhèn)€數(shù)、頁(yè)面訪問(wèn)序列、及采用置換方式可以得出頁(yè)面置換得缺頁(yè)次數(shù)與缺頁(yè)率,及每次缺頁(yè)時(shí)物理塊中存儲(chǔ)。
1.輸入得形式
?int
PageOrder[MaxNumber];//頁(yè)面序列 int
PageNum,LackNum=0,BlockNum;//頁(yè)面?zhèn)€數(shù),缺頁(yè)次數(shù),最小物理塊數(shù) 2、輸出得形式 double
LackPageRat(yī)e//缺頁(yè)率 缺頁(yè)個(gè)數(shù) 每次缺頁(yè)時(shí)物理塊中存儲(chǔ)
程序所能達(dá)到得功能 模擬先進(jìn)先出 FIFO、最佳置換 OPI與最近最久未使用 LRU頁(yè)面置換算法得工作過(guò)程.假設(shè)內(nèi)存中分配給每個(gè)進(jìn)程得最小物理塊數(shù)為m,在進(jìn)程運(yùn)行過(guò)程中要訪問(wèn)得頁(yè)面?zhèn)€數(shù)為 n,頁(yè)面訪問(wèn)序列為P1, …,Pn,分別利用不同得頁(yè)面置換算法調(diào)度進(jìn)程得頁(yè)面訪問(wèn)序列,給出頁(yè)面訪問(wèn)序列得置換過(guò)程,計(jì)算每種算法缺頁(yè)次數(shù)與缺頁(yè)率。測(cè)試數(shù)據(jù),包括正確得輸入及其輸出結(jié)果與含有錯(cuò)誤得輸入及其輸出結(jié)果。
程序中用到得所有抽象數(shù)據(jù)類型得定義、主程序得流程以及各程序模塊之間得層次(調(diào)用)關(guān)系.int
PageOrder[MaxNumber];//頁(yè)面序列 int
PageCount[MaxNumber]={0};//計(jì)算內(nèi)存內(nèi)數(shù)據(jù)離下一次出現(xiàn)得距離 int
PageNum,LackNum=0,BlockNum;//頁(yè)面?zhèn)€數(shù),缺頁(yè)次數(shù),最小物理塊數(shù) double
LackPageRate=0; bool found=false;
六、實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析
運(yùn)行截圖:
圖6、1
圖6、2
圖6、3 七、實(shí)驗(yàn)總結(jié)
這次試驗(yàn),讓我加深了對(duì)虛擬內(nèi)存頁(yè)面置換算法得理解,進(jìn)一步掌握先進(jìn)先出 FIFO、最佳置換 OPI 與最近最久未使用 LRU 頁(yè)面置換算法得實(shí)現(xiàn)方法。熟悉 Linux需要經(jīng)過(guò)大量得實(shí)驗(yàn)、改進(jìn)與思考,在編寫(xiě)代碼得過(guò)程中遇到了一些問(wèn)題要積極面對(duì)并通過(guò)討論上網(wǎng)或者問(wèn)老師解決。通過(guò)這次試驗(yàn)我了解了虛擬內(nèi)存置換算法得一些知識(shí),就是我對(duì)于所學(xué)習(xí)得專業(yè)知識(shí)得到了更好得鞏固與提升。
附錄 源程序清單 #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++)//遍歷已存儲(chǔ),判斷就是否缺頁(yè) { ? ?? if(module[j]==PageOrder[i]) { ?? found=true; ? ? break; ? } ?? } ? if(found==false)//缺頁(yè),選擇替換 { ? for(j=0;j〈BlockNum;j++) //計(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〈〈“該算法缺頁(yè)次數(shù)為:"<〈LackNum<<endl; Cout<<”該算法缺頁(yè)率為:"〈<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++)//遍歷已存儲(chǔ),判斷就是否缺頁(yè) { ? if(module[j]==PageOrder[i]) ? { ? ;eurt=dnuof?? ? break; } } if(found==false)//缺頁(yè),選擇替換 { ? ;]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〈〈“該算法缺頁(yè)次數(shù)為:”<<LackNum< Cout<<”該算法缺頁(yè)率為:"< 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++)//遍歷已存儲(chǔ),判斷就是否缺頁(yè) { ? 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)//缺頁(yè),選擇替換 { ? ;]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<〈“該算法缺頁(yè)次數(shù)為:"< Cout〈<”該算法缺頁(yè)率為:”〈<LackPageRate*100〈<“%’<<endl;} int main() { int PageOrder[MaxNumber];//頁(yè)面序列 int PageCount[MaxNumber]={0};//計(jì)算內(nèi)存內(nèi)數(shù)據(jù)離下一次出現(xiàn)得距離 int PageNum,LackNum=0,BlockNum;//頁(yè)面?zhèn)€數(shù),缺頁(yè)次數(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<<”請(qǐng)輸入頁(yè)面?zhèn)€數(shù):”; ;muNegaP >>nic?;“數(shù)塊理物小最入輸請(qǐng)”〈〈tuoc? ;muNkcolB>>nic? cout<〈”請(qǐng)輸入頁(yè)面序列:”< for(i=0;i〈PageNum;i++) ;]i[redrOegaP>〉nic? }?;”:URL-3,IPO—2,OFIF-1:法算擇選請(qǐng)"< 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ù)繼擇選請(qǐng)"< } } 計(jì)算機(jī)體系結(jié)構(gòu) 實(shí)驗(yàn)報(bào)告 班級(jí):計(jì)科姓名:張華敏學(xué)號(hào): 0902班 0 fIFU算法 一,實(shí)驗(yàn)內(nèi)容: 編寫(xiě)一段程序來(lái)模擬頁(yè)面置換算法中的FIFU算法的實(shí)現(xiàn) 二,算法設(shè)計(jì): 設(shè)置一個(gè)產(chǎn)生隨機(jī)數(shù)的函數(shù)rand()產(chǎn)生隨機(jī)數(shù)來(lái)模擬程序所需訪問(wèn)的頁(yè)面的標(biāo)號(hào),如果頁(yè)面需要被訪問(wèn)則把頁(yè)面中的一個(gè)標(biāo)志位設(shè)為in表示他已經(jīng)被調(diào)入內(nèi)存,如果再次需要訪問(wèn)此頁(yè)面是只需檢查此頁(yè)面的標(biāo)志位是否為in就可判斷它是否已經(jīng)存在在內(nèi)存中了,如果已經(jīng)存在則可直接使用,如果不存在則需調(diào)入,在調(diào)入新頁(yè)面是先檢查內(nèi)存空間是否已滿,如果未滿則直接調(diào)入,如果已經(jīng)滿了則需選擇一個(gè)頁(yè)面將其調(diào)出,調(diào)出時(shí)就把頁(yè)面的標(biāo)志位設(shè)為out。選擇頁(yè)面的規(guī)則是:將進(jìn)入內(nèi)存時(shí)間最久的頁(yè)面調(diào)出去,為了達(dá)到這一目的,在頁(yè)面中設(shè)置一個(gè)計(jì)數(shù)器,每當(dāng)有新頁(yè)面調(diào)入內(nèi)存時(shí)則將內(nèi)存中已經(jīng)存在的頁(yè)面計(jì)數(shù)器自動(dòng)加一,調(diào)出頁(yè)面時(shí)就選擇那個(gè)計(jì)數(shù)器最大值的頁(yè)面,調(diào)出后重新將計(jì)數(shù)器設(shè)為零。三,遇到的問(wèn)題及解決方案: 在做此實(shí)驗(yàn)時(shí)遇到了一些小問(wèn)題,如在C語(yǔ)言中函數(shù)名定義為export()則會(huì)報(bào)錯(cuò)。在調(diào)用有返回值的函數(shù)是如果直接int s=use(pag)則會(huì)運(yùn)行出錯(cuò),要先分開(kāi)寫(xiě)如:int s,s=use(pag).四,源代碼 頭文件.cpp #include<> #include<> int t;//全局變量,用來(lái)盛放rand()函數(shù)產(chǎn)生的隨機(jī)數(shù) enum boolean{in,out};//定義一個(gè)枚舉類型 /////////如果把in,out換成 true,false則會(huì)處錯(cuò)誤 typedef struct { int num;//頁(yè)面編號(hào) char content;//頁(yè)面內(nèi)容 enum boolean flog;//判斷此頁(yè)面是否頁(yè)調(diào)入,調(diào)入為true,否則為false;int count;//頁(yè)面計(jì)數(shù)器 int usebit;//使用位,被使用過(guò)值為1,否則為0 }page; #include<> #include<> #include<> #include“頭文件.cpp” int capacity=3;//設(shè)置內(nèi)存最多可以容納的頁(yè)面數(shù) void initialize(page p[])//初始化頁(yè)面函數(shù) { for(int i=0;i<5;i++)//初始化頁(yè)面,頁(yè)面內(nèi)容分別為小寫(xiě)字母 abcde,計(jì)數(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)生一個(gè)0-5的隨機(jī)數(shù),if(p[t].flog==in){ printf(“tt%d頁(yè)面命中n”,t);//for(int i=0;i<5;i++)//調(diào)入此頁(yè)面后其他以在內(nèi)存中存在的頁(yè)面計(jì)數(shù)器加1 // { // if(p[i].flog==in)// p[i].count++;// } return(1);} else return(0);} void import(page p[])//調(diào)入頁(yè)面的函數(shù) { /* int t=rand()%5;//產(chǎn)生一個(gè)0-5的隨機(jī)數(shù),if(p[t].flog==in)printf(“tt%d頁(yè)面命中n”,t);*/ // if(p[t].flog==out)//如果此頁(yè)面未被調(diào)入內(nèi)存則立即調(diào)入 p[t].flog=in;capacity--;//調(diào)入后內(nèi)存空間減少一葉 for(int i=0;i<5;i++)//調(diào)入此頁(yè)面后其他以在內(nèi)存中存在的頁(yè)面計(jì)數(shù)器加1 { if(p[i].flog==in&&p[i].num!=t)p[i].count++;} printf(“頁(yè)面%d被調(diào)入內(nèi)存n”,t);} void port(page p[])//調(diào)出頁(yè)面的函數(shù),,,,,,,,,,,如果函數(shù)名定義為export則處錯(cuò)誤 { int x=0,y;//x用來(lái)暫時(shí)存放計(jì)數(shù)器 中的最大值,y存放此頁(yè)面的頁(yè)面號(hào) for(int i=0;i<5;i++)//尋找計(jì)數(shù)器值最大的 頁(yè)面 { if(p[i].count>x){ x=p[i].count;y=i;} } P[y].flog=out;//修改調(diào)入符號(hào) p[y].count=0;capacity++;//調(diào)入后內(nèi)存空間增加一葉 printf(“ttt頁(yè)面%d被調(diào)出內(nèi)存n”,y);} main(){ int s;long t3,t1,t2;page pag[5];//定義五個(gè)頁(yè)面,,,,,,,,,,,如果這個(gè)定義在子函數(shù)之前那么不用通過(guò)參數(shù) 子函數(shù)便可以直接訪問(wèn) t3=time(NULL);initialize(pag);do { t1=time(NULL);s=use(pag);//,,,,,,,,,,,,,,如果這里寫(xiě)成int s=use(pag)則會(huì)運(yùn)行出錯(cuò) //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”);} 五,測(cè)試結(jié)果: LFU算法 一,實(shí)驗(yàn)內(nèi)容: 編寫(xiě)一段程序來(lái)模擬頁(yè)面置換算法中的LFU算法的實(shí)現(xiàn) 二,算法設(shè)計(jì): 設(shè)置一個(gè)產(chǎn)生隨機(jī)數(shù)的函數(shù)rand()產(chǎn)生隨機(jī)數(shù)來(lái)模擬程序所需訪問(wèn)的頁(yè)面的標(biāo)號(hào),如果頁(yè)面需要被訪問(wèn)則把頁(yè)面中的一個(gè)標(biāo)志位設(shè)為in表示他已經(jīng)被調(diào)入內(nèi)存,如果再次需要訪問(wèn)此頁(yè)面是只需檢查此頁(yè)面的標(biāo)志位是否為in就可判斷它是否已經(jīng)存在在內(nèi)存中了,如果已經(jīng)存在則可直接使用,如果不存在則需調(diào)入,在調(diào)入新頁(yè)面是先檢查內(nèi)存空間是否已滿,如果未滿則直接調(diào)入,如果已經(jīng)滿了則需選擇一個(gè)頁(yè)面將其調(diào)出,調(diào)出時(shí)就把頁(yè)面的標(biāo)志位設(shè)為out。選擇頁(yè)面的規(guī)則是:將最近一段時(shí)間未被訪問(wèn)過(guò)的頁(yè)面調(diào)出。為了達(dá)到這一目的在頁(yè)面中設(shè)置一個(gè)標(biāo)志位,如果頁(yè)面在近期只要被訪問(wèn)過(guò)則將該標(biāo)志位設(shè)置為1(默認(rèn)為0),在選擇調(diào)出頁(yè)面時(shí)只需將標(biāo)志位為0的頁(yè)面調(diào)出即可。三,遇到的問(wèn)題及解決方案: 未遇到什么問(wèn)題 四,實(shí)驗(yàn)感悟: 遇到問(wèn)題后上網(wǎng)查資料和有效,及時(shí)查不到自己想要的但是也可從相關(guān)結(jié)果中獲得啟發(fā)給自己靈感來(lái)想到解決問(wèn)題的方法.四,源代碼 #include<> #include<> #include<> #include“頭文件.cpp” int capacity=3; //設(shè)置內(nèi)存最多可以容納的頁(yè)面數(shù) void initialize(page p[]) //初始化頁(yè)面函數(shù) { for(int i=0;i<5;i++) //初始化頁(yè)面,頁(yè)面內(nèi)容分別為小寫(xiě)字母 abcde,計(jì)數(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)生一個(gè)0-5的隨機(jī)數(shù),if(p[t].flog==in) { Printf(“tt%d頁(yè)面命中n”,t); P[t].usebit=1; //for(int i=0;i<5;i++)//調(diào)入此頁(yè)面后其他以在內(nèi)存中存在的頁(yè)面計(jì)數(shù)器加1 // { // if(p[i].flog==in) // P[i].count++; // } return(1); } else return(0); } void import(page p[])//調(diào)入頁(yè)面的函數(shù) { int t=rand()%5; //產(chǎn)生一個(gè)0-5的隨機(jī)數(shù),//if(p[t].flog==in) // { // Printf(“tt%d頁(yè)面命中n”,t); // P[t].usebit=1; // } // if(p[t].flog==out) //如果此頁(yè)面未被調(diào)入內(nèi)存則立即調(diào)入 P[t].flog=in; Capacity--; //調(diào)入后內(nèi)存空間減少一葉 for(int i=0;i<5;i++)//調(diào)入此頁(yè)面后其他以在內(nèi)存中存在的頁(yè)面計(jì)數(shù)器加1 { if(p[i].flog==in&&p[i].num!=t) P[i].count++; } Printf(“頁(yè)面%d被調(diào)入內(nèi)存n”,t); } void port(page p[]) //調(diào)出頁(yè)面的函數(shù) ////////////////////////////////如果函數(shù)名定義為export則處錯(cuò)誤 { int x=0,y;//x用來(lái)暫時(shí)存放計(jì)數(shù)器 中的最大值,y存放此頁(yè)面的頁(yè)面號(hào) int z=-1; //用來(lái)判斷近期是否有未被訪問(wèn)過(guò)的頁(yè)面 int g=0; for(int i=0;i<5;i++)//尋找計(jì)數(shù)器值最大的 頁(yè)面 { 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)//如果所有頁(yè)面均為1則按照FIFO算法置換頁(yè)面 //如果g=3則表明頁(yè)面使用位全為零,此時(shí)也按照FIFO算法置換頁(yè)面 { P[y].flog=out;//修改調(diào)入符號(hào) P[y].count=0; Capacity++; //調(diào)入后內(nèi)存空間增加一葉 P[y].usebit=0; for(int i=0;i<5;i++)//將所有頁(yè)面置0 P[i].usebit=0; Printf(“ttt頁(yè)面%d被調(diào)出內(nèi)存n”,y); } else //如果有頁(yè)面為0則將此頁(yè)面置換出來(lái) { P[z].flog=out;//修改調(diào)入符號(hào) P[z].count=0; Capacity++; //調(diào)入后內(nèi)存空間增加一葉 Printf(“ttt頁(yè)面%d被調(diào)出內(nèi)存n”,z); } } main(){ int s; Long t3,t1,t2; Page pag[5];//定義五個(gè)頁(yè)面 ///////////////////如果這個(gè)定義在子函數(shù)之前那么不用通過(guò)參數(shù) 子函數(shù)便可以直接訪問(wèn) 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”);} 六,實(shí)驗(yàn)結(jié)果 總結(jié) 通過(guò)本次試驗(yàn)我對(duì)各種頁(yè)面置換算法有了更深入的了解,也使得自己認(rèn)識(shí)到平常學(xué)習(xí)到某些東西覺(jué)得懂了會(huì)了可是一旦實(shí)際動(dòng)手操作起來(lái)就會(huì)發(fā)現(xiàn)總會(huì)存在這樣或者那樣的錯(cuò)誤,只有多動(dòng)手實(shí)際操作才會(huì)發(fā)現(xiàn)不足發(fā)現(xiàn)錯(cuò)誤并且改正。查漏補(bǔ)缺提高自己的實(shí)際動(dòng)手能力。 操作系統(tǒng)課程第七次實(shí)驗(yàn)報(bào)告 姓名 學(xué)號(hào) 系 計(jì)算機(jī) 任課教師 指導(dǎo)教師 評(píng)閱教師 實(shí)驗(yàn)地點(diǎn) 綜合樓B102 實(shí)驗(yàn)時(shí)間 2012-9-26 實(shí)驗(yàn)課表現(xiàn) 出勤和個(gè)人表現(xiàn)Q1(15+15(組長(zhǎng)評(píng)分)=30分) 得分: 實(shí)驗(yàn) 總分 (Q1+Q2+Q3+Q4) 實(shí)驗(yàn)完成情況Q2(45分(組長(zhǎng)與教師評(píng)分的加權(quán)平均)) 得分: 實(shí)驗(yàn)編號(hào)與實(shí)驗(yàn)名稱: 實(shí)驗(yàn)七、常用頁(yè)面置換算法模擬實(shí)驗(yàn) 實(shí)驗(yàn)?zāi)康模?/p> 通過(guò)模擬實(shí)現(xiàn)請(qǐng)求頁(yè)式存儲(chǔ)管理的幾種基本頁(yè)面置換算法,了解虛擬存儲(chǔ)技術(shù)的特點(diǎn),掌握虛擬存儲(chǔ)請(qǐng)求頁(yè)式存儲(chǔ)管理中幾種基本頁(yè)面置換算法的基本思想和實(shí)現(xiàn)過(guò)程,并比較它們的效率。 實(shí)驗(yàn)內(nèi)容及要求(詳見(jiàn)實(shí)驗(yàn)講義與實(shí)驗(yàn)指導(dǎo)書(shū)): 要求: 1)要求用你熟悉的程序設(shè)計(jì)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)頁(yè)面置換模擬程序;要求在主函數(shù)中測(cè)試。 2)實(shí)驗(yàn)報(bào)告中必須包括:設(shè)計(jì)思想、數(shù)據(jù)定義(包括詳細(xì)說(shuō)明)、處理流程(詳細(xì)算法描述和算法流程圖)、源代碼、運(yùn)行結(jié)果、體會(huì)等部分。 3)必須模擬本實(shí)驗(yàn)內(nèi)容中提到的算法中的至少2種頁(yè)面置換算法。 4) 比較不同頁(yè)面置換算法的效率 內(nèi)容:編寫(xiě)一個(gè)程序,使用以下頁(yè)面置換算法中的某2種分別模擬一個(gè)分頁(yè)系統(tǒng),并統(tǒng)計(jì)同一個(gè)頁(yè)面訪問(wèn)序列情況下不同頁(yè)面置換算法引發(fā)的缺頁(yè)中斷次數(shù)。 1、第二次機(jī)會(huì)算法(Second Chance) 2、最近最少使用算法(Least recently Used,LRU) 3、最不常用算法(Not frequently Used,NFU) 4、最近未使用算法(Not recently Used,NRU) 5、時(shí)鐘頁(yè)面置換算法 6、老化算法(aging) 頁(yè)框的數(shù)量固定為4,虛擬頁(yè)面數(shù)為8。實(shí)驗(yàn)輸入為訪問(wèn)頁(yè)面序列,比如0,1,3,2,7,1 實(shí)驗(yàn)用到的軟件(:) devC++,Visio 實(shí)驗(yàn)內(nèi)容及關(guān)鍵步驟(代碼)Q3(15分) 得分: 流程圖:輸入頁(yè)面訪問(wèn)序列 取訪問(wèn)的頁(yè)號(hào) 查頁(yè)表 是否缺頁(yè)? 是 置缺頁(yè)標(biāo)志flag為’*’ 按算法不同淘汰一頁(yè)面 調(diào)入所訪問(wèn)的頁(yè)面 否 fIFO算法流程圖 LRU算法流程圖: 函數(shù)關(guān)系解釋圖: 實(shí)現(xiàn)結(jié)果: 圖1 圖2 代碼: #include <> #include <> #define mEMORY_SIZE /*物理塊數(shù)*/ #define PROESS_SIZE /*頁(yè)面號(hào)引用串個(gè)數(shù)*/#include <> #include <> /*全局變量*/ int mSIZE=4; int PSIZE=8; static int memery[4]={0}; /*物理塊中的頁(yè)號(hào)*/ static int Page[8]={0}; /*頁(yè)面號(hào)引用串*/ 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(“請(qǐng)依次輸入頁(yè)面號(hào)(8個(gè)):“); for(i=0;i scanf(“%1d“,&page[i]); system(“cls“); system(“color 0E“); do{ Puts(“輸入的頁(yè)面號(hào)引用串為:“); 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(“* 請(qǐng)選擇頁(yè)面置換算法:\t\t\t *\n“); Printf(“* ----------------------------------------- *\n“); Printf(“* 1.先進(jìn)先出(FIFO) 2.最近最久未使用(LRU) *\n“); Printf(“* 3.退出 *\n“); Printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); Printf(“請(qǐng)選擇操作:[ ]\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(“輸入錯(cuò)誤,請(qǐng)重新輸入:“); } 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)/*頁(yè)面在物理塊中*/ Printf(“ “); else Printf(“ |%d|“,temp[i][j]); } /*每行顯示20個(gè)*/ if(i%20==0) Continue; Printf(“\n“); } } Printf(“----------------------------------------\n“); Printf(“缺頁(yè)次數(shù):%d\t\t“,t+mSIZE); Printf(“缺頁(yè)率:%d/%d\n“,t+mSIZE,pSIZE); Printf(“置換次數(shù):%d\t\t“,t); Printf(“訪問(wèn)命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE); Printf(“----------------------------------------\n“); } /*先進(jìn)先出頁(yè)面置換算法*/ void fIFO() { int memery[10]={0}; int time[10]={0}; /*記錄進(jìn)入物理塊的時(shí)間*/ int i,j,k,m; int max=0; /*記錄換出頁(yè)*/ int Count=0; /*記錄置換次數(shù)*/ /*前mSIZE個(gè)數(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 { /*判斷新頁(yè)面號(hào)是否在物理塊中*/ for(j=0,k=0;j { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*如果不在物理塊中*/ { Count++; /*計(jì)算換出頁(yè)*/ max=time[0]頁(yè)面置換算法實(shí)驗(yàn)報(bào)告精選2
頁(yè)面置換算法實(shí)驗(yàn)報(bào)告精選3