大學實驗報告_第1頁
大學實驗報告_第2頁
大學實驗報告_第3頁
大學實驗報告_第4頁
大學實驗報告_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗報告實驗課程:學生姓名:學號:專業(yè)班級:2009年1目錄實驗一編程實現(xiàn)銀行家安全算法………………3實驗二存儲管理的模擬實現(xiàn)………13實驗三磁盤調(diào)度算法的模擬實現(xiàn)…20 南昌大學實驗報告(1)編程實現(xiàn)銀行家安全算法學生姓名:學號:專業(yè)班級:實驗類型:□驗證□綜合■設計□創(chuàng)新實驗日期:11.5,11.12實驗成績:一、實驗目的通過實驗加強對銀行家安全算法的理解和掌握。二、實驗內(nèi)容熟悉避免死鎖發(fā)生的方法,死鎖與安全序列的關系,編程實現(xiàn)銀行家算法,要求輸出進程的安全序列。三、實驗要求1、需寫出設計說明;2、設計實現(xiàn)代碼及說明3、運行結(jié)果;四、主要實驗步驟1、學習、理解好課本中銀行家算法的實例;2、根據(jù)課本中銀行家算法的描述,畫出程序流程圖;3、按照程序流程圖,用C語言編程并實現(xiàn)。4、上機運行編寫的程序,檢驗并且修正直至能夠得到正確的結(jié)果。輸出提示:輸入有誤,請從新輸入初始化函數(shù)Init()開始輸入進程的數(shù)目m輸出資源的種類n輸入每個進程最多所需的各資源數(shù)輸入每個進程已分配的各資源數(shù)輸入各個資源現(xiàn)有的數(shù)目初始化函數(shù)Init()結(jié)束流程圖:輸出提示:輸入有誤,請從新輸入初始化函數(shù)Init()開始輸入進程的數(shù)目m輸出資源的種類n輸入每個進程最多所需的各資源數(shù)輸入每個進程已分配的各資源數(shù)輸入各個資源現(xiàn)有的數(shù)目初始化函數(shù)Init()結(jié)束銀行家算法C語言程序:#include"iostream.h"#include"stdio.h"#define P_NUM 0X03#define MAX_available 0xAstructPCB{charstate;//狀態(tài)intrequest;//請求資源intmax;//最大需求量intneed;//需求量intallocation;//已經(jīng)分配量};voidrandomallocation(structPCBp[],intav);boolsafecheck(structPCBp[],intav);voidbankallocation(structPCBp[],intav);voidshow(structPCBp[],intav);voidmain(){structPCBprocess[P_NUM];//分配3個進程空間inti;intj;intk;intavailable=MAX_available;//可利用資源向量; printf("\t\t銀行家調(diào)度算法\n");printf("初始狀態(tài)最大的可利用資源MAX_available為:\n",MAX_available);for(i=0;i<5;i++)//為每個進程分配最大需求量{ printf("p%d->max:",i); scanf("%d",&process[i].max);if(process[i].max>MAX_available){printf("錯誤!最大需求量超過了可利用資源總量,請重新輸入!\n");i--;}else{do{ printf("\np%d->allocation:\n",i); scanf("%d",&process[i].allocation);}while((process[i].allocation>process[i].max)||(available-process[i].allocation<0));available=available-process[i].allocation;process[i].need=process[i].max-process[i].allocation;process[i].request=0;process[i].state='R';}//else}//forshow(process,available);printf("\n1--隨機分配算法2--銀行家算法\n");do{printf("請選擇:\n"); scanf("%d",&i);}while(!((i==1)||(i==2)));if(i==1)randomallocation(process,available);else{do{if(safecheck(process,available)==false){printf("\n當前為不安全狀態(tài)!\n");printf("1--退出2--重置");do{printf("\n請選擇:\n");cin>>k;}while((k!=1)&&(k!=2));if(k==2){available=MAX_available;for(j=0;j<5;j++){ printf("p%d->allocation:\n",j);//cin>>process[j].allocation; scanf("%d",&process[j].allocation);available=available-process[j].allocation;}//for(j=0;j<5;j++)}//if(k==2)}//if(safecheck(process,available)==false)else{k=0;break;}}while(k==2);//doif(k==1)return;elseif(k==0)bankallocation(process,available);}//else}//endmainvoidshow(structPCBp[],intav){inti;printf("\navailable=",av);printf("\nnumbermaxneedallocationstate\n");for(i=0;i<5;i++){printf("%d\t%d\t%d\t%d\t%d\n",i,p[i].max,p[i].need,p[i].allocation,p[i].state);}}voidrandomallocation(structPCBp[],intav){inti=0;intj=0;intw;inte;while(1){if(i==5)i=i-5;while(1){if(i==5)i=i-5;elseif(p[i].state=='R'){do{ printf("\np%d->request:\n",i); scanf("%d",&p[i].request);}while(p[i].request>(p[i].max-p[i].allocation));break;}elsei++;}if(p[i].request<=av){av=av-p[i].request;p[i].allocation=p[i].allocation+p[i].request;p[i].request=0;if(p[i].max==p[i].allocation){av=av+p[i].allocation;p[i].state='E';p[i].allocation=0;p[i].request=0;}j=0;while(j<5){if((p[j].request<=av)&&(p[j].state=='W')){av=av+p[j].allocation;p[j].request=0;p[j].state='E';p[j].allocation=0;}if((p[j].max<av+p[j].allocation)&&(p[j].state=='W')){p[j].state='R';}j++;}show(p,av);}else{p[i].state='W';show(p,av);}w=0;e=0;for(j=0;j<5;j++){if(p[j].state=='W')w++;elseif(p[j].state=='E')e++;elsebreak;}if(((w+e)==5)&&(w!=0)){printf("發(fā)生死鎖!\n");return;}elseif(e==5){printf("三個進程順利執(zhí)行完!\n");return;}i++;}}voidbankallocation(structPCBp[],intav)//銀行家算法函數(shù){ intorder[5];intk; intj=0;intrequest;intf;inti;show(p,av);while(1){request=0;k=-1;do{if(k!=-1) printf("不是安全狀態(tài)!\n");av=av+request;p[k].allocation=p[k].allocation-request;do{ printf("p->NO.:"); scanf("%d",&k);}while(p[k].state!='R');do{ printf("p->request:"); scanf("%d",&request);}while(request>(p[k].need));if(request>av){p[k].request=request;p[k].state='W';break;}p[k].allocation=p[k].allocation+request;av=av-request;}while(safecheck(p,av)!=true);if(p[k].allocation==p[k].max){p[k].state='E';av=av+p[k].allocation;p[k].allocation=0;p[k].need=0; order[j]=k;}for(i=0;i<5;i++){if((p[i].state=='W')&&(p[i].request<=av)){if(safecheck(p,av)==true){p[i].allocation=p[i].request+p[i].allocation;av=av-p[i].request;p[i].request=0;p[i].state='R';if(p[i].max==p[i].allocation){p[i].state='E';av=av+p[i].allocation;p[i].allocation=0;}}else{printf("\n不是安全狀態(tài)!原請求資源量無效。\n");p[i].request=0;p[i].state='R';}}}show(p,av);f=0;for(i=0;i<5;i++){if(p[i].state=='E')f++;}if(f==5){printf("**********所有進程順利執(zhí)行完!**********\n");printf("安全序列為:");for(i=0;i<5;i++) { inttemp; temp=order[i]; //cout<<"p"<<temp<<""; printf("p%d",temp); }//for printf("\n");break;}//if j++;}}boolsafecheck(structPCBp[],intav){boolfinish[5];intorder[5];inti;intj=0;intf=0;intk=0;intwork;inttemp;work=av;for(i=0;i<5;i++){order[i]=0;if(p[i].state=='E') {finish[i]=true;}else {finish[i]=false;}}//forwhile(k<5){for(i=0;i<5;i++){if((p[i].state=='W')&&(p[i].request<=work)&&(finish[i]==false)){temp=p[i].allocation;p[i].allocation=p[i].request+p[i].allocation;}//ifif(((p[i].allocation+work)>=p[i].max)&&(finish[i]==false)){work=p[i].allocation+work;finish[i]=true;order[j]=i;j++;if(p[i].state=='W') {p[i].allocation=temp;}}//if}//fork++;}//whilefor(i=0;i<5;i++){if(finish[i]==true) {f++;} }//for(i=0;i<5;i++)if(f==3) { returntrue; }elsereturnfalse;}五、實驗數(shù)據(jù)及處理結(jié)果六、實驗體會或?qū)Ω倪M實驗的建議通過這次實驗我對用銀行家算法實現(xiàn)資源分配有了一定的熟悉,對銀行家算法的步驟和相關數(shù)據(jù)結(jié)構(gòu)用法有了更深的理解,加深了解了死鎖產(chǎn)生的條件和原因。通過編程實現(xiàn)銀行家算法來預防死鎖,加深了對課堂上所授內(nèi)容的理解。在此實驗中為了便于檢驗算法正確與否,采取的數(shù)據(jù)為課本上所用到的數(shù)據(jù),在程序中也可以手動輸入資源,并且所有數(shù)據(jù)都放在外部文件中,這樣就不用每次都需要輸入數(shù)據(jù),減少了麻煩,同時也提高了程序的安全性,也提高了自己再次使用文件、寫文件的能力。七、參考資料《計算機操作系統(tǒng)》 南昌大學實驗報告(2)存儲管理的模擬實現(xiàn)學生姓名:學號:實驗類型:□驗證□綜合■設計□創(chuàng)新實驗日期:11.19,11.26,12.3實驗成績:一、實驗目的存儲管理的主要功能之一是合理地分配空間。請求頁式管理是一種常用的虛擬存儲管理技術(shù)。本實驗的目的是通過請求頁式存儲管理中頁面置換算法模擬設計,了解虛擬存儲技術(shù)的特點,掌握請求頁式管理的頁面置換算法。二、實驗內(nèi)容編程實現(xiàn)頁面置換算法,要求輸出頁面的置換過程,具體可以編程實現(xiàn)OPT、FIFO和LRU算法。三、實驗要求1、需寫出設計說明;2、設計實現(xiàn)代碼及說明3、運行結(jié)果;四、主要實驗步驟1、學習、理解好課本中頁式存儲管理中頁面置換算法的實例;2、根據(jù)課本中頁式存儲管理中頁面置換算法的描述,畫出程序流程圖;3、按照程序流程圖,用C語言編程并實現(xiàn)。4、上機運行編寫的程序,檢驗并且修正直至能夠得到正確的結(jié)果。流程圖C語言程序:

main()

{

intcunchufangwenyemian[4];/*存儲訪問的頁面*/

intcunchujisuanguocheng[3][4];/*存儲計算過程;*/

intcunchushifoumingzhong[4];/*存儲是否被命中*/

intlie,hang;/*循環(huán)變量列,行*/

intshifoumingzhong;/*在前一列的位置,沒有則為0;*/

intwenmenyemiangeshu=4;/*訪問頁面的個數(shù)*/

/*第一步,初始化*/

/*輸入訪問的頁面,存到存儲訪問的頁面的數(shù)組中*/

for(lie=0;lie<4;lie++)

{

printf("\n請輸入第%d個頁面:",lie);

scanf("%d",&cunchufangwenyemian[lie]);

}

/*初始化計算過程數(shù)組*/

for(lie=0;lie<4;lie++)

{

for(hang=0;hang<3;hang++)

{

cunchujisuanguocheng[hang][lie]=-1;

}

}

/*初始化是否沒有命中的數(shù)組*/

for(lie=0;lie<4;lie++)

{

cunchushifoumingzhong[lie]=0;

}

/*第二步,計算*/

/*察看是否命中*/

for

(wenmenyemiangeshu=0;wenmenyemiangeshu<4;wenmenyemiangeshu++)

{

/*對于某一列進行處理*/

lie=wenmenyemiangeshu;

if(lie==0)/*如果為第一列*/

{

cunchujisuanguocheng[0][lie]=cunchufangwenyemian[lie];

/*將頁面落下來*/

cunchushifoumingzhong[0]=0;

/*是否命中為0,不命中*/

}else

{/*如果不為第一列*/

shifoumingzhong=0;

/*假設沒命中*/

for(hang=0;hang<3;hang++)

{

if(

cunchujisuanguocheng[hang][lie-1]==cunchufangwenyemian[lie])

{

shifoumingzhong=hang+1;/*如果相同,則是否命中為命中的位置*/

}

}

cunchushifoumingzhong[lie]=shifoumingzhong;/*存儲命中位置*/

}

if(lie!=0)

{

if((shifoumingzhong!=0))/*是否命中*/

{/*如果命中,則不變*/

for(hang=0;hang<3;hang++)

{

cunchujisuanguocheng[hang][lie]=cunchujisuanguocheng[hang][lie-1];/*將上一列復制過來*/

}

}else

{/*如果沒有命中,則向下移一位,新的進來*/

for(hang=2;hang>0;hang--)

{

cunchujisuanguocheng[hang][lie]=cunchujisuanguocheng[hang-1][lie-1];/*將上一列逐個下移復制過來*/

}

cunchujisuanguocheng[0][lie]=cunchufangwenyemian[lie];/*最上面的等于新進來的*/

}

}

}

/*第三步,輸出*//*輸出訪問序列*/

for(lie=0;lie<4;lie++)

{

printf("%d

",cunchufangwenyemian[lie]);

}

printf("\n");/*輸出計算過程*/

for(hang=0;hang<3;hang++)

{

for(lie=0;lie<4;lie++)

{

printf("%d

",cunchujisuanguocheng[hang][lie]);

}

printf("\n");

}/*輸出是否命中*/

for(lie=0;lie<4;lie++)

{

printf("%d

",cunchushifoumingzhong[lie]);

}

}五、實驗數(shù)據(jù)及處理結(jié)果六、實驗體會或?qū)Ω倪M實驗的建議通過這次實驗,對請求頁式存儲管理中頁面置換算法有了一定的熟悉,對通過請求頁式存儲管理中頁面置換算法模擬設計有了更深的了解,對虛擬存儲技術(shù)的特點,請求頁式管理的頁面置換算法等有了更加深刻的了解。加深了對課堂上所講授的OPT、FIFO和LRU三種算法的理解。七、參考資料《計算機操作系統(tǒng)》南昌大學實驗報告(3)磁盤調(diào)度算法的模擬實現(xiàn)學生姓名:學號:專業(yè)班級:實驗類型:□驗證□綜合■設計□創(chuàng)新實驗日期:12.10,12.17,12.24實驗成績:一、實驗目的通過實驗加強對磁盤調(diào)度算法的理解和掌握。二、實驗內(nèi)容編寫程序?qū)崿F(xiàn)磁盤調(diào)度算法,具體可以編寫程序?qū)崿F(xiàn)FCFS算法、SSTF算法、SCAN算法和CSCAN算法之二。三、實驗要求1、需寫出設計說明;2、設計實現(xiàn)代碼及說明3、運行結(jié)果;四、主要實驗步驟1、學習、理解好課本中FCFS算法、SSTF算法、SCAN算法和CSCAN算法的實例;2、根據(jù)課本中FCFS算法、SSTF算法、SCAN算法和CSCAN算法的描述,畫出程序流程圖;3、按照程序流程圖,用C語言編程并實現(xiàn)。4、上機運行編寫的程序,檢驗并且修正直至能夠得到正確的結(jié)果。流程圖C語言程序://

t1.cpp

:

定義控制臺應用程序的入口點。

#include

"stdafx.h"

#include"math.h"

#include"stdlib.h"

#include"string.h"

struct

Head

{

int

nPosition;

bool

bVisited;

};

void

Visit(struct

Head

*pHead)

{

printf("visite

cy:%d\n",pHead->nPosition);

pHead->bVisited=true;

}

int

ReadInputKeyboard(struct

Head

*pHead,int

*pCurrentPosition,int

nMaxNumber)

{

int

i;

printf("please

input

Current

position:");

scanf("%d",pCurrentPosition);

printf("please

input

will

visit

position:");

for(i=0;i<nMaxNumber;i++)

{

scanf("%d",&pHead[i].nPosition);

pHead[i].bVisited=false;

if(pHead[i].nPosition<0)

break;

}

return

i;

}

int

ReadInputFile(struct

Head

*pHead,int

*pCurrentPosition,int

nMaxNumber)

{

int

i;

char

szFileName[256],*q,*p,szTemp[20];

printf("please

input

filename:");

scanf("%s",szFileName);

FILE

*pFile=fopen(szFileName,"r");

if(pFile==NULL)

{

printf("open

file

%s

error",szFileName);

return

-1;

}

for(i=0;!feof(pFile)

&&i<nMaxNumber;)

{

p=szFileName;

fgets(p,256,pFile);

while(q=strchr(p,','))

{

memset(szTemp,0,sizeof(szTemp)*sizeof(char));

strncpy(szTemp,p,q-p);

p=q+1;

if(i==0)

*pCurrentPosition=atoi(szTemp);

else

{

pHead[i-1].nPosition=atoi(szTemp);

pHead[i-1].bVisited=false;

}

i++;

}

memset(szTemp,0,sizeof(szTemp)*sizeof(char));

pHead[i-1].nPosition=atoi(p);

pHead[i-1].bVisited=false;

//i++;

}

fclose(pFile);

return

i;

}

int

FifoVisit(int

nCurrentPosition,struct

Head

*pHead,int

nNumber)

{

//FCFS算法

int

nHaveVisited=0;

int

nMoveDistance=0;

int

i;

while(nHaveVisited<nNumber)

{

for(i=0;i<nNumber;i++)

{

if(pHead[i].bVisited)

continue;

Visit(&pHead[i]);

nHaveVisited++;

nMoveDistance+=abs(nCurrentPosition-pHead[i].nPosition);

nCurrentPosition=pHead[i].nPosition;

}

}

printf("the

sum

of

move

distance:%d\n",nMoveDistance);

return

nMoveDistance;

}

int

SsfoVisit(int

nCurrentPosition,struct

Head

*pHead,int

nNumber)

{

//

SSTF算法

int

nHaveVisited=0;

int

nMoveDistance=0;

int

nMinDistance=0;

int

nMinIndex=0;

int

i;

while(nHaveVisited<nNumber)

{

nMinDistance=0xffff;

nMinIndex=0;

//找最小值

for(i=0;i<nNumber;i++)

{

if(pHead[i].bVisited)

continue;

if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition))

{

nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);

nMinIndex=i;

}

}

//訪問

Visit(&pHead[nMinIndex]);

nHaveVisited++;

nMoveDistance+=nMinDistance;

nCurrentPosition=pHead[nMinIndex].nPosition;

}

printf("the

sum

of

move

distance:%d\n",nMoveDistance);

return

nMoveDistance;

}

int

DtVisit(int

nCurrentPosition,bool

bOut,struct

Head

*pHead,int

nNumber)

{

//SCAN算法

int

nHaveVisited=0;

int

nMoveDistance=0;

int

nMinDistance=0;

int

nMinIndex=

溫馨提示

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

評論

0/150

提交評論