操作系統(tǒng)實驗報告doc_第1頁
操作系統(tǒng)實驗報告doc_第2頁
操作系統(tǒng)實驗報告doc_第3頁
操作系統(tǒng)實驗報告doc_第4頁
操作系統(tǒng)實驗報告doc_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

本文格式為Word版,下載可任意編輯——操作系統(tǒng)實驗報告doc實

試驗課程:

計算機操作系統(tǒng)

學生姓名:

張虹

號:

6100409033

專業(yè)班級:

電氣信息類III091班

02022年年212月月818日

目錄

操作系統(tǒng)安裝及其接口環(huán)境2編程實現(xiàn)銀行家安全算法7進程調度算法的實現(xiàn)16存儲管理的模擬實現(xiàn)22

告南昌大學試驗報告操作系統(tǒng)安裝及其接口環(huán)境學生姓名:

張虹

號:

6100409033

專業(yè)班級:

電Ⅲ091班

試驗類型:□驗證■綜合□設計□創(chuàng)新

試驗日期:

試驗成績:

一、試驗目的熟悉Windows//Linux操作系統(tǒng)的安裝過程與安裝方法,并把握該操作系統(tǒng)所提供的用戶接口環(huán)境,并為后續(xù)試驗做好編程環(huán)境準備。

二、試驗內容1、熟悉Windows//Linux操作系統(tǒng)的安裝過程與安裝方法,并把握該操作系統(tǒng)所提供的用戶接口環(huán)境,通過系統(tǒng)提供的用戶管理程序、查看系統(tǒng)中的用戶狀況、進程、線程、內存使用狀況等,學會使用它進行監(jiān)視進程的狀況、系統(tǒng)資源的使用狀況及用戶狀況。并為后續(xù)試驗做好編程環(huán)境準備。

2、用C語言編寫一小段程序,使其可以通過某個系統(tǒng)調用來獲得OS提供的某種服務。

三、試驗要求1.了解所安裝的操作系統(tǒng)對軟硬件資源的具體要求;2.機器最低硬件配置要求;3.操作系統(tǒng)所提供的用戶接口環(huán)境的熟悉;4.了解主要BIOSCMOS參數的含義及其設置方法;5.把握程序編寫中系統(tǒng)調用的方法。

四、主要試驗步驟1、可以通過Vmwareworkstation虛擬機來模擬并記錄安裝Windows和Linux的過程,主要要準備光盤(虛擬機也可使用光盤鏡像ISO文件或精靈虛擬光驅),若計算機已經裝有一個操作系統(tǒng),則在安裝之前要注意:假如是使用光盤用電腦自帶光驅安裝,則安裝之前必需設定計算機的BIOS,讓計算機從光驅啟動;若是使用USB光驅或者是U盤引導,則要設定BIOS使計算機從USB接口啟動。安裝系統(tǒng)主要需要輸入序列號,設定管理員及使用者姓名和身份密碼。用戶可以選擇要安裝的系統(tǒng)程序(Linux為軟件包),或者也可以在安裝完后在操縱面板的添加/刪除程序中選擇。安裝方法一般來說使用光盤直接安裝,將光盤放入光驅中,沒有光驅的電腦可以使用USB光驅或者使用U盤安裝。

2、熟悉查看用戶的接口環(huán)境可以使用系統(tǒng)自帶的管理程序,操作如下:

"右擊我的電腦'"管理'"設備管理器',也可以"右擊我的電腦'"屬性'"硬件'"設備管理器',進入設備管理器可以看到計算機的設備狀況,包括計算機的各個接口。

3、查看系統(tǒng)中的用戶狀況、進程、線程、內存使用狀況,可進行如下操作:

"右擊我的電腦'"管理'"本地用戶和組'"用戶',這樣就可以查看系統(tǒng)中的用戶狀況,并可以對用戶進行添加、刪除、禁用、修改等操作。

使用任務管理器可以看到系統(tǒng)中活動的用戶、系統(tǒng)中的進程、線程和內存的使用狀況,進行的操作如下:

"右擊任務欄'"任務管理器',或者直接在鍵盤上使用ctrl+alt+delete的快捷鍵開啟任

務管理器。在任務管理器中,點擊"進程'就可以看見當前計算機在運行的進程及該進程的用戶、CPU占用率和內存使用狀況。點擊"性能'即可看見計算機當前CPU的使用、CPU使用記錄、PF使用率、頁面文件使用記錄和線程數。點擊"用戶'就可以看見當前計算機活動的用戶。

4、調用系統(tǒng)服務:

開啟MicrosoftVisualC++6.0,新建C++SourseFile,寫入以下代碼:

#includestdlib.hvoidmain(){

system(date);}保存,使用工具編譯,得到結果。

五、試驗數據及處理結果安裝WindowsXpSp2的過程:

安裝UbuntuLinux10.04的過程:

以下是計算機Xs19的狀況,Xs19中WindowsXp的設備管理器:

Xs19中WindowsXp的用戶狀況:

Xs19的任務管理器:

調度服務的結果:

六、試驗體會或對改進試驗的建議感覺這個試驗不是光靠把握書上內容就能做的,平日的實踐也是十分重要的,假如對計算機十分熟悉的話,這個試驗做起來難度很小。在做的時候基本上可以完成,中間碰見一個問題,就是對計算機有的系統(tǒng)服務不熟悉,所以要用C語言編程時感覺有點不知所措。

七、參考資料《計算機操作系統(tǒng)》(第三版)

《計算機操作系統(tǒng)試驗指導書》

告南昌大學試驗報告編程實現(xiàn)銀行家安全算法學生姓名:

張虹

號:

6100409033

專業(yè)班級:

電Ⅲ091班

試驗類型:□驗證■綜合□設計□創(chuàng)新

試驗日期:

試驗成績:

一、試驗目的通過試驗加強對銀行家安全算法的理解和把握。

二、試驗內容熟悉避免死鎖發(fā)生的方法,死鎖與安全序列的關系,編程實現(xiàn)銀行家算法,要求輸出進程的安全序列。

三、試驗要求1、需寫出設計說明;2、設計實現(xiàn)代碼及說明3、運行結果;四、主要試驗步驟1、分析銀行家算法結構;2、畫出銀行家算法的流程圖,即設計說明;3、根據畫出的流程圖使用C語言編寫相應的代碼(代碼過長,放到最終);程序主要由main函數和以下幾個函數組成:

voidinput();用戶輸入銀行家算法的初始數據;voidoutput();輸出當前系統(tǒng)資源分派狀況;voidchange();當請求資源滿足要求時,進行分派,系統(tǒng)資源發(fā)生改變;intcheck();安全性算法,檢查是否存在安全序列;voidoutputsafe();輸出安全序列的資源分派表。

4、檢查代碼,將編出的代碼編譯、鏈接,驗證其正確性。

開始輸入銀行家算法初始數據執(zhí)行安全性算法數據是否正確是否存在安全序列輸入進程Pi發(fā)出的請求向量請求資源是否小于需求資源系統(tǒng)將資源分派給Pi執(zhí)行算法的是否為初始數據終止資源分派無效,恢復分派前的系統(tǒng)資源狀況輸出當前資源分派表NNYYNNYYNNYY輸出安全序列的資源狀況是否有進程發(fā)出請求向量NNYYNNYY請求資源是否小于系統(tǒng)資源YY進程Pi需等待NNYY

五、試驗數據及處理結果

六、試驗體會或對改進試驗的建議體會:編寫銀行家算法需要較好分析能力,C語言也要把握的很好,而且需要細心和極大地耐心。我的程序在最開始編出來的第一份代碼編譯時大大小小一堆錯誤,有些是一個小錯誤導致了下面全錯,這些小錯誤在一百多行里找起來十分吃力。然后小錯誤全部找出來以后,再編譯,錯誤沒有了,但是得到的結果卻是錯誤的,這樣又要開始一行一行分析,看是哪里出了問題。到最終得到了想要的結果以后,程序還需要修飾,至少要輸出要簡單明朗,要讓別人一運行這個程序就知道自己在什么時候該輸入什么數據,數據是什么作用,而不是只有自己知道輸進去的是什么東西。

七、參考資料《計算機操作系統(tǒng)》《C程序設計》《C語言程序設計_現(xiàn)代方法》八、試驗代碼#includestdio.h#includestdlib.h#includestring.hintmax[5][3];

//開始定義銀行家算法中需要用到的數據intallocation[5][3];intneed[5][3];intavailable[3];intrequest[5][3];char*finish[5];intsafe[5];intn,i,m;intk=0;

intj=0;intwork[3];intworks[5][3];voidstart();//表示程序開始voidend();//表示程序終止voidinput();//輸入數據voidoutput();//輸出數據voidchange();//系統(tǒng)分派資源,原有資源狀況改變voidoutputsafe();//輸出安全序列的資源分派狀況intcheck();//安全性算法voidmain()

//主程序開始{

start();

for(;j==0;)

//確認輸入數據的正確性,若輸入錯誤,重新輸入

{

input();

printf(以下為進程資源狀況,請確認其是否正確:\n);

output();

printf(數據是否無誤:\n正確:輸入\n錯誤:輸入\n請輸入:);

scanf(%d,j);

}

printf(數據確認無誤,算法繼續(xù)。\n);

if(check()==0)

//若check函數返回值為,表示輸入的初始數據找不到安全序列,無法進行下一步,程序終止

{

end();

exit(0);

}

for(;j==1;)

//當有多個進程請求資源時,循環(huán)開始

{

printf(請輸入請求資源的進程i(0、、、、):);

//輸入發(fā)出請求向量的進程及請求向量

scanf(%d,i);

printf(請輸入進程P%d的請求向量Request%d:,i,i);

for(n=0;n3;n++)

scanf(%d,request[i][n]);

for(;request[i][0]need[i][0]||request[i][1]need[i][1]||request[i][2]need[i][2];)//若請求向量大于需求資源,則認為是輸入錯誤,要求重新輸入

{

printf(數據輸入有誤,請重試!\n請輸入進程P%d的請求向量Request%d:,i,i);

for(n=0;n3;n++)

scanf(%d,request[i][n]);

}

if(request[i][0]=available[0]request[i][1]=available[1]request[i][2]=available[2])

//判斷系統(tǒng)是否有足夠資源提供分派

{

printf(系統(tǒng)正在為進程P%d分派資源\n,i);

change();

//分派資源

j=0;

}

else

printf(系統(tǒng)沒有足夠的資源,進程P%d需要等待。\n,i);

if(j==0)

//j=0表示系統(tǒng)有足夠資源分派的狀況

{

printf(當前系統(tǒng)資源狀況如下:\n);

//輸出分派資源后的系統(tǒng)資源分派狀況

output();

if(check()==0)

//若找不到安全系列,則之前的資源分派無效

{

printf(本次資源分派作廢,恢復原來的資源分派狀態(tài)。\n);

for(m=0;m3;m++)

//恢復分派資源前的系統(tǒng)資源狀態(tài)

{

available[m]+=request[i][m];

allocation[i][m]-=request[i][m];

need[i][m]+=request[i][m];

}

output();

//輸出系統(tǒng)資源狀態(tài)

}

}

printf(是否還有進程請求資源?\n是:輸入\n否:輸入\n請輸入:);

scanf(%d,j);

//若還有進程請求資源,j=1,之前的for循環(huán)條件滿足

}

end();}voidline()

//美化程序,使程序運行時更加明朗美觀{

printf(\n);}

voidstart()

//表示銀行家算法開始{

line();

printf(

銀行家算法開始\n);

printf(

DesignedbyZhangHong\n);

line();}

voidend()

//表示銀行家算法終止

{

line();

printf(

銀行家算法終止,感謝使用\n);

line();}

voidinput()

//輸入銀行家算法起始各項數據{

for(n=0;n5;n++)

{

printf(請輸入進程P%d的相關信息:\n,n);

printf(Max:);

for(m=0;m3;m++)

scanf(%d,max[n][m]);

printf(Allocation:);

for(m=0;m3;m++)

scanf(%d,allocation[n][m]);

for(m=0;m3;m++)

need[n][m]=max[n][m]-allocation[n][m];

}

printf(請輸入系統(tǒng)可利用資源數Available:);

for(m=0;m3;m++)

scanf(%d,available[m]);}

voidoutput()

//輸出系統(tǒng)現(xiàn)有資源狀況{

line();

printf(資源狀況

Max

Allocation

Need

Available\n);

printf(進程

A

B

C

A

B

C

A

B

C

A

B

C\n);

line();

for(n=0;n5;n++)

{

printf(P%d%9d%3d%3d%5d%3d%3d%6d%3d%3d,n,max[n][0],max[n][1],max[n][2],allocation[n][0],allocation[n][1],allocation[n][2],need[n][0],need[n][1],need[n][2]);

if(n==0)

printf(%6d%3d%3d\n,available[0],available[1],available[2]);

else

printf(\n);

}

line();}

voidchange()

//當Request[i,j]=Available[j]時,系統(tǒng)把資源分派給進程P[i],Available[j]和Need[i,j]發(fā)生改變{

for(m=0;m3;m++)

{

available[m]-=request[i][m];

allocation[i][m]+=request[i][m];

need[i][m]-=request[i][m];

}}

voidoutputsafe()

//輸出安全序列的資源分派表{

printf(該安全序列的資源分派圖如下:\n);

line();

printf(資源狀況

Work

Need

AllocationWork+Allocation

Finish\n);

printf(進程

A

B

C

A

B

C

A

B

C

A

B

C\n);

line();

for(n=0;n5;n++)

printf(P%d%9d%3d%3d%5d%3d%3d%5d%3d%3d%6d%3d%3d%12s\n,safe[n],works[safe[n]][0],works[safe[n]][1],works[safe[n]][2],need[safe[n]][0],need[safe[n]][1],need[safe[n]][2],allocation[safe[n]][0],allocation[safe[n]][1],allocation[safe[n]][2],works[safe[n]][0]+allocation[safe[n]][0],works[safe[n]][1]+allocation[safe[n]][1],works[safe[n]][2]+allocation[safe[n]][2],finish[n]);

line();}

intcheck()

//安全性算法{

printf(開始執(zhí)行安全性算法\n);

for(m=0;m3;m++)

//數組work和finish初始化

work[m]=available[m];

for(n=0;n5;n++)

{

finish[n]=false;

safe[n]=0;

}

k=0;

for(m=0;m5;m++)

for(n=0;n5;n++)

if(strcmp(finish[n],false)==0need[n][0]=work[0]need[n][1]=work[1]need[n][2]=work[2])

//查找可以分派資源但尚未分派到資源的進程

{

safe[k]=n;

//以數組safe[k]記錄下來各個進程得到分派的資源的順序

works[safe[k]][0]=work[0];

works[safe[k]][1]=work[1];

works[safe[k]][2]=work[2];

work[0]+=allocation[n][0];

//進程執(zhí)行后釋放出分派給它的資源

work[1]+=allocation[n][1];

work[2]+=allocation[n][2];

finish[n]=ture;//finish[n]變?yōu)橐允驹撨M程完成本次分

k++;

}

for(m=0;m5;m++)

//判斷是否所有進程分派資源完成

{

if(strcmp(finish[m],false)==0)

{

printf(找不到安全序列,系統(tǒng)處于擔心全狀態(tài)。\n);

return0;

//找不到安全序列,終止check函數,返回

}

else

if(m==4)

//此處m=4表示所有數組finish的所有元素都為ture

{

printf(找到安全序列P%d-P%d-P%d-P%d-P%d,系統(tǒng)是安全的\n,safe[0],safe[1],safe[2],safe[3],safe[4]);

j=1;

outputsafe();

//輸出安全序列的資源分派表

}

}

return1;}

告南昌大學試驗報告

進程調度算法的實現(xiàn)學生姓名:

張虹

號:

6100409033

專業(yè)班級:

電Ⅲ091班

試驗類型:□驗證■綜合□設計□創(chuàng)新

試驗日期:

試驗成績:

一、試驗目的通過試驗加強對進程調度算法的理解和把握。

二、試驗內容編寫程序實現(xiàn)進程調度算法,具體可以編寫程序實現(xiàn)先來先服務算法或優(yōu)先度高者調度算法。

三、試驗要求1、需寫出設計說明;2、設計實現(xiàn)代碼及說明3、運行結果;四、主要試驗步驟1、分析試驗內容,畫出算法流程圖;2、根據流程圖寫出試驗代碼;3、編譯代碼,驗證結果正確與否;4、對程序進行修改,得到最終結果。

流程圖如下:

開始系統(tǒng)隨機產生數據將數據依照到達時間從小到大排序用戶輸入數據進程到達時前一個進程是否已經完成完成時間=服務時間+前一個進程完成時間完成時間=服務時間+到達時間周轉時間=完成時間-到達時間帶權周轉時間=完成時間/服務時間是否所有進程已完成計算輸出結果終止YNYNYN

五、試驗數據及處理結果

六、試驗體會或對改進試驗的建議在做這個試驗的時候,一開始以為很簡單,只要做簡單的加減乘除就行了,但是細心做過以后發(fā)現(xiàn)需要考慮好多狀況。譬如說輸入進程到達時間的時候,要是亂序的該怎么辦?還有到達時間和服務時間等等定義的都是整型變量,但是帶權周轉時間確會得到小數,此時就需要用到強制轉換。在做系統(tǒng)產生隨機數的時候也要考慮隨機數的范圍,如到達時間可以為0,但是服務時間卻不能為0,否則帶權周轉時間的計算會出錯。

七、參考資料《計算機操作系統(tǒng)》《計算機操作系統(tǒng)試驗指導書》《C程序設計》《C語言程序設計_現(xiàn)代方法》八、試驗代碼#includestdio.h

#includestdlib.h#includetime.h#defineN5

//進程個數,可改變intrt[N];

//到達時間intst[N];

//服務時間intct[N];

//完成時間intcyt[N];//周轉時間floatrct[N];//帶權周轉時間floatav[2];//平均數intn,m;voidstart();//表示程序開始voidend();//表示程序終止voidinput();//輸入數據voidrandom();//系統(tǒng)隨機產生數據voidordination();//對數據按到達時間進行排序voidfcfs();//先來先服務計算voidoutput();//輸出結果voidmain(){

start();

intwhich;

intc=1;

for(;c==1;)

{

for(;;)

{

printf(輸入數據還是由系統(tǒng)隨機產生數據?\n1、輸入數據\t2、系統(tǒng)隨機產生數據\n請輸入:);

scanf(%d,which);

if(which==1)

{

input();

break;

}

else

if(which==2)

{

random();

break;

}

else

printf(輸入錯誤,請重新輸入!);

}

ordination();

//進程依照到達時間進行排序

fcfs();

output();

printf(繼續(xù)輸入,退出輸入。請輸入:);

scanf(%d,c);

}

end();}voidline()

//美化程序,使程序運行時更加明朗美觀{

printf(\n);}voidstart()

//表示FCFS算法開始{

line();

printf(

FCFS算法開始\n);

printf(

DesignedbyZhangHong\n);

line();}voidend()

//表示FCFS算法終止{

line();

printf(

FCFS算法終止,感謝使用\n);

line();}voidinput(){

printf(請輸入%d個進程的到達時間:,N);

for(n=0;nN;n++)

scanf(%d,rt[n]);

printf(請輸入%d個進程對應的服務時間:,N);

for(n=0;nN;n++)

scanf(%d,st[n]);}voidrandom(){

srand((unsigned)time(NULL));

for(n=0;nN;n++)

{

rt[n]=rand()%100;

for(m=0;mn;m++)

if(n!=0rt[n]==rt[m])

{

rt[n]=rand()%100;

m=0;

}

st[n]=rand()%98+1;

for(m=0;mn;m++)

if(n!=0st[n]==st[m])

{

st[n]=rand()%98+1;

m=0;

}

}}voidordination()

//重新排序,應對出現(xiàn)輸入的到達時間為亂序的狀況{

inttemp;

for(n=0;nN;n++)

for(m=0;mN-n-1;m++)

if(rt[m+1]rt[m])

{

temp=rt[m+1];

rt[m+1]=rt[m];

rt[m]=temp;

temp=st[m+1];

st[m+1]=st[m];

st[m]=temp;

}}voidfcfs()

//執(zhí)行fcfs算法{

av[0]=0;

av[1]=0;

ct[0]=rt[0]+st[0];

for(n=1;nN;n++)

{

if(ct[n-1]=rt[n])

//考慮當前一個進程完成而后一個進程還沒有到達的狀況

ct[n]=ct[n-1]+st[n];

else

ct[n]=rt[n]+st[n];

}

for(n=0;nN;n++)

cyt[n]=ct[n]-rt[n];

for(n=0;nN;n++)

rct[n]=(float)cyt[n]/(float)st[n];

for(n=0;nN;n++)

{

av[0]+=(float)cyt[n]/N;

av[1]+=rct[n]/N;

}}voidoutput()

//輸出結果{

line();

printf(進程名\t);

for(n=0;nN;n++)

printf(\t%c,65+n);

printf(\t平均\n到達時間);

for(n=0;nN;n++)

printf(\t%d,rt[n]);

printf(\n服務時間);

for(n=0;nN;n++)

printf(\t%d,st[n]);

printf(\n完成時間);

for(n=0;nN;n++)

printf(\t%d,ct[n]);

printf(\n周轉時間);

for(n=0;nN;n++)

printf(\t%d,cyt[n]);

printf(\t%0.1f,av[0]);

printf(\n帶權周轉時間);

for(n=0;nN;n++)

printf(\t%0.1f,rct[n]);

printf(\t%0.1f,av[1]);

printf(\n);

line();}

南昌大學試驗報告

存儲管理的模擬實現(xiàn)學生姓名:

張虹

號:

6100409033

專業(yè)班級:

電Ⅲ091班

試驗類型:□驗證■綜合□設計□創(chuàng)新

試驗日期:

試驗成績:

一、

試驗目的存儲管理的主要功能之一是合理地分派空間。請求頁式管理是一種常用的虛擬存儲管理技術。本試驗的目的是通過請求頁式存儲管理中頁面置換算法模擬設計,了解虛擬存儲技術的特點,把握請求頁式管理的頁面置換算法。

二、

試驗內容1.過隨機數產生一個指令序列,共320條指令。其地址按下述原則生成:

①50%的指令是順序執(zhí)行的;②25%的指令是均勻分布在前地址部分;③25%的指令是均勻分布在后地址部分;具體的實施方法是:

A.在[0,319]的指令地址之間隨機選區(qū)一起點M;B.順序執(zhí)行一條指令,即執(zhí)行地址為M+1的指令;C.在前地址[0,M+1]中隨機選取一條指令并執(zhí)行,該指令的地址為M;D.順序執(zhí)行一條指令,其地址為M+1;E.在后地址[M+2,319]中隨機選取一條指令并執(zhí)行;F.重復AE,直到執(zhí)行320次指令。

2.指令序列變換成頁地址流,設:

(1)

頁面大小為1K;(2)

用戶內存容量為4頁到32頁;(3)

用戶虛存容量為32K。

在用戶虛存中,按每K存放10條指令排列虛存地址,即320條指令在虛存中的存放方式為:

第0條第9條指令為第0頁(對應虛存地址為[0,9]);第10條第19條指令為第1頁(對應虛存地址為[10,19]);。。。。。。。。。。。。。。。。。。。。。

第310條第319條指令為第31頁(對應虛存地址為[310,319]);按以上方式,用戶指令可組成32頁。

3.計算并輸出下述各種算法在不同內存容量下的命中率。

A.FIFO先進先出的算法B.LRU最近最少使用算法C.LFU最少訪問頁面算法三、

試驗要求1、需寫出設計說明;2、設計實現(xiàn)代碼及說明3、運行結果;

四、

主要試驗步驟1、分析算法結構;2、畫出算法的流程圖,即設計說明;3、根據畫出的流程圖使用C語言編寫相應的代碼(代碼過長,放到最終);程序主要由main函數和以下幾個函數組成:

voidinitialization();初始化內存數據voidFIFO();FIFO先進先出算法;voidLRU();LRU最久未使用算法;voidLFU();LFU最近最久未使用算法;4、檢查代碼,將編出的代碼編譯、鏈接,驗證其正確性。

開始按要求產生320個隨機數將隨機數轉換成頁面用戶內存容量ii==44ii32??FIFO頁面置換算法LRU頁面置換算法LFU頁面置換算法ii==ii++11終止NNYY頁面置換算法整體結構

開始內存數據初始化,物理塊00mmii中頁面停留時間time[[mm]=mm++11nn==00用戶內存中是否已存在要調用的頁面用戶內存中是否存在空物理塊NN將頁面調入空物理塊中,該物理塊time[[mm]=00對比所有物理塊的time[[mm]],找到最大值,將頁面調入最大值所在物理塊,該物理塊time[[mm]=00所有已經存入頁面的內存time[[mm]++,nn++NNYYYYnn320??終止將頁面pp[[nn]]調入內存YYNNFIFO頁面置換算法

開始內存數據初始化,物理塊00mmii中頁面停留時間time[[mm]=mm++11nn==00用戶內存中是否已存在要調用的頁面用戶內存中是否存在空物理塊NN將頁面調入空物理塊中,該物理塊time[[mm]=00對比所有物理塊的time[[mm]],找到最大值,將頁面調入最大值所在物理塊,該物理塊time[[mm]=00所有已經存入頁面的內存time[[mm]++,nn++NNYYYYnn320??終止將頁面pp[[nn]]調入內存YYNN存在該頁面的物理塊timg[[mm]=00LRU頁面置換算法

開始內存數據初始化,物理塊00mmii中頁面停留時間time[[mm]=mm++11nn==00nn50??將頁面pp[[nn]]調入內存對比物理塊中頁面在之前的50次調用中出現(xiàn)的次數,將頁面pp[[nn]]調入使用最少的頁面占用的物理塊nn320??終止依照LRU頁面置換算法調入頁面nn++YYNNYYNNLFU頁面置換算法

五、

試驗數據及處理結果

六、

試驗體會或對改進試驗的建議我做試驗的時候,主要的難度是在幾個特別狀況的處理上,如LRU內存中的頁面都是之前沒有調用過的,那怎么辦,還有就是LFU中還沒有達到"一定時間間隔'的條件時怎么辦?另外就是由于試驗使用的是系統(tǒng)產生的隨機數,所以難以驗證明驗結果的正確性。

試驗產生隨機指令的方法是:

1、在[0,319]的指令地址之間隨機選區(qū)一起點M;2、順序執(zhí)行一條指令,即執(zhí)行地址為M+1的指令;3、在前地址[0,M+1]中隨機選取一條指令并執(zhí)行,該指令的地址為M;4、順序執(zhí)行一條指令,其地址為M+1;5、在后地址[M+2,319]中隨機選取一條指令并執(zhí)行;6、重復AE,直到執(zhí)行320次指令。

那么,產生的第一個隨機起點M指令是否執(zhí)行?這對結果影響對比大,若起點M執(zhí)行,那么命中率至少能提高0.2以上!

七、

參考資料《計算機操作系統(tǒng)》《計算機操作系統(tǒng)試驗指導書》《C程序設計》《C語言程序設計_現(xiàn)代方法》《計算機操作系統(tǒng)教程習題解答與試驗指導(其次版)》八、

試驗代碼#includestdio.h#includestdlib.h#includetime.h#defineN320#defineM32#defineR32#defineruntime100//程序運行次數,保證結果的確切性intrun;floataverage[3][32];//取平均數,使結果更加確切ints,i;//s表示產生的隨機數,i表示物理塊數intm,n,h;//循環(huán)專用intk,g,f;intsum;//缺頁次數floatr;//rate命中率intp[N];//page頁數inta[N];//執(zhí)行的指令intpb[M];//physicalblock用戶內存容量(物理塊)

voidFIFO();voidLRU();voidLFU();voidline();voidstart();voidend();voidmain(){

start();

srand((int)time(NULL));//以計算機當前時間作為隨機數種子

for(run=0;runruntime;run++)//共產生"runtime'次隨機數,保證結果的確切性

{

for(n=0;nN;n+=3)

{

s=rand()%N+0;//隨機產生一條指令

a[n]=s+1;//順序執(zhí)行一條指令

s=rand()%(a[n]+1);//執(zhí)行前地址指令M`

a[n+1]=s+1;

s=rand()%(N-a[n+1]-1)+(a[n+1]+1);

a[n+2]=s;

}

for(n=0;nN;n++)

p[n]=a[n]/10;//得到指令相對的頁數

for(i=4;i=32;i++)

{

FIFO();

LRU();

LFU();

}

}

printf(物理塊數\tFIFO\t\tLRU\t\tLFU\n);

line();

for(i=4;i=32;i++)

{

printf(\n

%2d:,i);

for(m=0;m3;m++)

printf(\t\t%6.4f,average[m][i]);//輸出"runtime'次運行后的平均數

}

end();}voidinitialization()//用戶內存及相關數據初始化{

for(n=0;nM;n++)

pb[n]=-1;

sum=0;

r=0;

k=0;

g=-1;

f=-1;}

voidFIFO()//先進先出置換算法{

inttime[M];//定義進入內存時間長度數組

intmax;//max表示進入內存時間最久的,即最先進去的

initialization();

for(m=0;mi;m++)

time[m]=m+1;

for(n=0;nN;n++)

{

k=0;

for(m=0;mi;m++)

if(pb[m]==p[n])//表示內存中已有當前要調入的頁面

{

g=m;

break;

}

for(m=0;mi;m++)

if(pb[m]==-1)//用戶內存中存在空的物理塊

{

f=m;

break;

}

if(g!=-1)

g=-1;

else

{

if(f==-1)//找到最先進入內存的頁面

{

max=time[0];

for(m=0;mi;m++)

if(time[m]max)

{

max=time[m];

k=m;

}

pb[k]=p[n];

time[k]=0;//該物理塊中頁面停留時間置零

sum++;//缺頁數+1

}

else

{

pb[f]=p[n];

time[f]=0;

sum++;

f=-1;

}

}

for(m=0;mipb[m]!=-1;m++)

time[m]++;//物理塊中現(xiàn)有頁面停留時間+1

/*if(n==0i==6)

printf(\n);

if(i==6n=30)

{

printf(%d,p[n]);

for(m=0;mi;m++)

printf(%d,pb[m]);

printf(\n);

}*/

}

r=1-(float)sum/N;

average[0][i]+=r/runtime;}

voidLRU()//最近最少使用算法{

inttime[M];

intmax;

initialization();

for(m=0;mi;m++)

time[m]=m+1;

for(n=0;nN;n++)

{

k=0;

for(m=0;mi;m++)

if(pb[m]==p[n])

{

g=m;

break;

}

for(m=0;mi;m++)

if(pb[m]==-1)

{

f=m;

break;

}

if(g!=-1)

{

time[g]=0;

g=-1;

}

else

{

if(f==-1)

{

max=time[0];

for(m=0;mi;m++)

if(time[m]max)

{

k=m;

max=time[m];

}

pb[k]=p[n];

time[k]=0;

sum++;

}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論