![操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第1頁](http://file4.renrendoc.com/view10/M03/15/3D/wKhkGWWcsvOAHF_fAAC85HPNQYY111.jpg)
![操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第2頁](http://file4.renrendoc.com/view10/M03/15/3D/wKhkGWWcsvOAHF_fAAC85HPNQYY1112.jpg)
![操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第3頁](http://file4.renrendoc.com/view10/M03/15/3D/wKhkGWWcsvOAHF_fAAC85HPNQYY1113.jpg)
![操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第4頁](http://file4.renrendoc.com/view10/M03/15/3D/wKhkGWWcsvOAHF_fAAC85HPNQYY1114.jpg)
![操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第5頁](http://file4.renrendoc.com/view10/M03/15/3D/wKhkGWWcsvOAHF_fAAC85HPNQYY1115.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGE銀行家算法課程設(shè)計(jì)報(bào)告PAGE5/20目錄一、需求分析…………………2二、系統(tǒng)概要設(shè)計(jì)……………2三、系統(tǒng)詳細(xì)設(shè)計(jì)………………4四、系統(tǒng)主要源代碼……………5五、系統(tǒng)測試及調(diào)試……………5六.、心得體會……………………8七、參考文獻(xiàn)……………………9八、附錄…………9
操作系統(tǒng)課程設(shè)計(jì)報(bào)告課設(shè)內(nèi)容簡介:銀行家算法的模擬實(shí)現(xiàn)。一、需求分析控制工作流程,管理資源,為用戶服務(wù),是操作系統(tǒng)的主要功能。在資源管理中,操作系統(tǒng)的任務(wù)是使各種系統(tǒng)資源得到充分合理的應(yīng)用,解決用戶作業(yè)因資源而產(chǎn)生的矛盾,并合理的讓用戶再合適的時(shí)間內(nèi)得到其應(yīng)有的服務(wù)?,F(xiàn)代操作系統(tǒng)引入了多道程序設(shè)計(jì)技術(shù),允許鎖個(gè)進(jìn)程同時(shí)駐留內(nèi)存并發(fā)執(zhí)行。若干個(gè)進(jìn)程將不可避免地競爭系統(tǒng)資源,如果操作系統(tǒng)不能夠協(xié)調(diào)多個(gè)進(jìn)程對系統(tǒng)資源的競爭與共享,將會導(dǎo)致執(zhí)行結(jié)果異常,系統(tǒng)不穩(wěn)定、失效等多種問題,從而產(chǎn)生死鎖,產(chǎn)生死鎖的原因可分為兩種:(1)競爭資源引起死鎖(2)進(jìn)程推進(jìn)順序不當(dāng)引起死鎖。銀行家算法是一種代表性的避免死鎖的算法,在進(jìn)程申請資源的時(shí)候,系統(tǒng)調(diào)用銀行家算法來檢測此次分配會不會導(dǎo)致死鎖的產(chǎn)生,及判斷此次分配的安全性。若檢測到此次分配是安全的則分配給申請進(jìn)程所申請的資源,若檢測到此次分配是不安全的,則相應(yīng)的進(jìn)程等待。二、系統(tǒng)概要設(shè)計(jì)(1)系統(tǒng)主要功能:系統(tǒng)運(yùn)用銀行家算法先對用戶提出的計(jì)算機(jī)系統(tǒng)資源請求進(jìn)行合法性檢查,再進(jìn)行預(yù)分配,利用安全性檢查算法進(jìn)行安全性檢查,后決定是否給相應(yīng)進(jìn)程動(dòng)態(tài)分配資源。(2)系統(tǒng)模塊功能結(jié)構(gòu):(3)運(yùn)行環(huán)境要求:相關(guān)工具:MicrosoftVisualC++6.(4)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)及相關(guān)說明:
(1)、可利用資源向量
INT
AVAILABLE[M]
M為資源的類型。
(2)、最大需求矩陣
INT
MAX[N][M]
N為進(jìn)程的數(shù)量。
(3)、已分配矩陣
INT
ALLOCATION[N][M]
(4)、還需求矩陣
INT
NEED[N][N]
(5)、申請各類資源數(shù)量intRequest[x];//
(6)、工作向量
intWork[x];
(7)、intFinish[y];//表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,非0為是
三、系統(tǒng)詳細(xì)設(shè)計(jì)
(1)、系統(tǒng)初始化。輸入進(jìn)程數(shù)量,資源種類,各進(jìn)程已分配、還需求各資源數(shù)量,各資源可用數(shù)量等
(2)、輸入用戶的請求三元組(I,J,K),為進(jìn)程I申請K個(gè)J類資源。
(3)、檢查用戶的請求是否小于還需求的數(shù)量,條件是K<=NEED[I,J]。如果條件不符則提示重新輸
入,即不允許索取大于需求量
(4)、檢查用戶的請求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K<=AVALIABLE[I,J]。如果條件不
符則申請失敗,阻塞該進(jìn)程,重新進(jìn)行進(jìn)程動(dòng)態(tài)資源申請(使用goto語句)
(5)、進(jìn)行資源的預(yù)分配,語句如下:
AVALIBLE[I][J]=AVALIBLE[I][J]-K;
ALLOCATION[I][J]=ALLOCATION[I][J]+K;
NEED[I][J]=NEED[I][J]-K;
(6)、系統(tǒng)調(diào)用安全性檢查算法(safe()函數(shù))進(jìn)行檢查,如果檢查通過,則不用回收,否則進(jìn)行
回收,進(jìn)程資源申請失敗進(jìn)入等待。
4、安全性檢查算法(safe()子函數(shù))
(1)、設(shè)置兩個(gè)臨時(shí)變量。
(2)、在進(jìn)程中查找符合以下條件的進(jìn)程。
條件1:FINISH[I]=0
條件2:NEED[I][J]〈=WORK[J]
(3)、如果查找成功則進(jìn)行資源的模擬回收,語句如下:
WORK[J]=WORK[J]+ALLOCATION[I][J];
FINISH[I]=1或查找到的順序號
(4)、如果查找不成功,則檢查所有進(jìn)程的FINISH[],如果有一個(gè)為0,則系統(tǒng)不為0,返回不成功
標(biāo)志。否則返回成功標(biāo)志。四、系統(tǒng)主要原代碼見附錄!!五、系統(tǒng)測試及調(diào)試5.1
5.3
出現(xiàn)問題及解決方案:本程序考慮了程序功能實(shí)現(xiàn)、格式顯示合理化、輸入錯(cuò)誤異常處理等各個(gè)方面的設(shè)計(jì),盡可能使程序設(shè)計(jì)的更加完美。在長期的設(shè)計(jì)調(diào)試過程中遇到過許多問題,通過網(wǎng)上搜索、查詢資料、調(diào)試試驗(yàn)等方法一一解決。下面大致羅列一些主要問題:5.3.1關(guān)于輸入錯(cuò)誤的異常處理:數(shù)字判斷在調(diào)試程序過程中我們都知道在要求輸入整型數(shù)據(jù)時(shí),如不小心鍵入字母符號等,則程序立即出錯(cuò);還有如在要求輸入一個(gè)字符時(shí),如果不小心輸入為了字符串,則也會出錯(cuò)(此時(shí)多鍵入的字符被保留在緩沖區(qū)內(nèi),當(dāng)下次要求屏幕輸入時(shí)先從緩沖區(qū)取出導(dǎo)致出錯(cuò))。因此設(shè)計(jì)了一個(gè)判斷函數(shù)intshuzi(intn);
進(jìn)行處理此類輸入異常錯(cuò)誤。此函數(shù)主要設(shè)計(jì)思路為:定義一個(gè)動(dòng)態(tài)字符串指針,輸入后判斷每個(gè)輸入的字符是否在’0’—‘9’之間來判斷是否輸入的為數(shù)字字符,然后按照字符ASCII碼值與數(shù)字值的關(guān)系將輸入的字符轉(zhuǎn)換為整數(shù)。而對于字符輸入的問題,可以定義為一個(gè)動(dòng)態(tài)字符串指針然后只取輸入的第一個(gè)字符內(nèi)容。5.3.2關(guān)于某些判斷算法優(yōu)劣問題:在程序中很多地方都會用到循環(huán)判斷是否符合條件的算法,在設(shè)計(jì)這些算法時(shí)有很多方法,而有的算法可以更節(jié)省時(shí)間。如下安全性算法中尋找尋找符合Finish[i]==0條件的進(jìn)程的例子:/*算法一:
for(j=0;j<m;j++)
if(Work[j]>=Need[i][j])counter=counter+1;//記數(shù)
if(counter==m){…*/
//算法二:
for(j=0;j<m;j++)
if(Work[j]>=Need[i][j]);
//可用大于等于需求
else{
counter=1;
break;
}
if(counter!=1){…顯然算法二要優(yōu)于算法一。本程序中還有很多類似的地方。這里主要考慮的是一個(gè)程序的優(yōu)化設(shè)計(jì)問題。六、心得體會在設(shè)計(jì)此程序的過程中,我遇到過許多問題,也學(xué)到了很多東西。本程序的設(shè)計(jì)實(shí)現(xiàn)主要是用C++語言實(shí)現(xiàn),通過對程序算法的設(shè)計(jì)優(yōu)化、輸出顯示的格式設(shè)計(jì)、輸入過程中的異常處理等一些設(shè)計(jì)過程中的問題的考慮解決,在C++學(xué)習(xí)上也有了很大的進(jìn)步。程序設(shè)計(jì)過程中開始遇到的最大的問題是算法的結(jié)構(gòu)設(shè)計(jì)問題,課本上只給了設(shè)計(jì)要求及簡單的算法,要真正實(shí)現(xiàn)還需要考慮很多方面。在算法的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)上考慮了很長時(shí)間。在程序設(shè)計(jì)中先后參考了很多網(wǎng)絡(luò)資料,也參考了一些別人寫的的程序,綜合這些算法思想和自己的思路對程序做了很好的設(shè)計(jì)方式,對一些算法的優(yōu)越性等也作了一些考慮。此外考慮最多的就是異常錯(cuò)誤處理的設(shè)計(jì)。一個(gè)好的程序必須能在各種環(huán)境下都有其相應(yīng)的處理方式,至少能應(yīng)對一些常見的可能發(fā)生的錯(cuò)誤。在課程設(shè)計(jì)過程中遇到了許多問題,也向同宿舍的同學(xué)做了一些請教一起討論,也因此從他們身上學(xué)到了許多東西。七、參考文獻(xiàn)[1]湯子瀛等.《計(jì)算機(jī)操作系統(tǒng)》.西安:西安電子科技大學(xué)出版社,2006.10.[2]劉璟等.《高級語言c++程序設(shè)計(jì)》.北京:高等教育出版社,2006.03.[3]胡志剛、譚長庚.計(jì)算機(jī)操作系統(tǒng).中南大學(xué)出版社.2005.7[4]張堯?qū)W.計(jì)算機(jī)操作系統(tǒng)教程(第二版).清華大學(xué)出版社.2000.8八、附錄#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>//===定義全局變量===
constintx=50,y=100;
intAvailable[x];
intAllocation[y][y];
intMax[y][y];
intNeed[y][y];
intRequest[x];
intWork[x];
intFinish[y];
intp[y];inti,j;
intn,m;
//n為進(jìn)程的數(shù)量,m為資源種類數(shù)
intl=0,counter=0;
//函數(shù)聲明
intshuzi(intsz);
voidchushihua();
//系統(tǒng)初始化函數(shù)
voidsafe();
//安全性算法函數(shù)
voidbank();
//銀行家算法函數(shù)
voidshowdata();
//===數(shù)字判斷函數(shù)===
intshuzi(intsz){
char*temp;
temp=newchar;
intlen;
sz=0;//清零
chars;//
do{
//gets(temp);
//getline(cin,temp)
cin>>temp;
len=strlen(temp);
for(inti=0;i<len;i++){
s=*(temp+i);
if(s<'0'||s>'9'){
cout<<"抱歉,輸錯(cuò)了!你輸入的是數(shù)字嗎?!\n\n";
cout<<"請重新輸入:";
break;
}
}
}while(s<'0'||s>'9');
for(inti=0;i<len;i++){
/
intt=1;
for(intj=1;j<len-i;j++)t*=10;
sz+=(*(temp+i)-48)*t;
}
returnsz;
}
//===系統(tǒng)初始化函數(shù)===
voidchushihua(){
//===系統(tǒng)初始化輸入===
cout<<"%%程序開始,系統(tǒng)初始化輸入%%"<<endl;
//<<endl
cout<<"==============================================================="<<endl<<endl;
cout<<"請輸入進(jìn)程的數(shù)量:"
n=shuzi(n);
cout<<"請輸入資源種類數(shù):";
m=shuzi(m);
cout<<endl<<endl<<"請輸入各種資源可利用的數(shù)量("<<m<<"種):"<<endl;
cout<<endl;
for(j=0;j<m;j++){
cout<<"
輸入資源"<<j<<"可利用的數(shù)量Available["<<j<<"]:";
Available[j]=shuzi(Available[j]);
Work[j]=Available[j];
//初始化Work[j]
//
cout<<endl;
}
//system("cls");
//清屏
cout<<endl;
cout<<"請輸入各進(jìn)程當(dāng)前已分配的資源數(shù)量Allocation["<<n<<"]["<<m<<"]:"<<endl<<endl;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cout<<"
請輸入進(jìn)程"<<i<<"當(dāng)前已分配的資源"<<j<<"數(shù)量:";
Allocation[i][j]=shuzi(Allocation[i][j]);
}
cout<<endl;
Finish[i]=0;//初始化Finish[i]
//break;
}
cout<<endl<<endl;
cout<<"請輸入各進(jìn)程對各類資源的最大需求數(shù)Max["<<n<<"]["<<m<<"]:"<<endl<<endl;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cout<<"
請輸入進(jìn)程"<<i<<"對資源"<<j<<"的最大需求數(shù):";
Max[i][j]=shuzi(Max[i][j]);
if(Max[i][j]>=Allocation[i][j])
//
Need[i][j]=Max[i][j]-Allocation[i][j];
//計(jì)算還需求量
else
Need[i][j]=0;
}
cout<<endl;
}
cout<<endl<<"%%初始化完成!%%"<<endl;
}//===安全性算法函數(shù)===
voidsafe(){
l=0;
for(i=0;i<n;){
//i++
if(Finish[i]==0){
//尋找Finish[i]==0的進(jìn)程
條件一
counter=0;
//記數(shù)器
for(j=0;j<m;j++)
if(Work[j]>=Need[i][j]);
//可用大于等于需求
else{
counter=1;
break;
}
if(counter!=1){//進(jìn)程的每類資源量都符合條件Work[j]>=Need[i][j]
條件二
p[l]=i;
//存儲安全序列
Finish[i]=1;
for(j=0;j<m;j++){
Work[j]=Work[j]+Allocation[i][j];
}
l=l+1;
i=-1;
}
}
i++;
}
}
//===顯示分配情況函數(shù)===
voidshowdata()//函數(shù)showdata,輸出當(dāng)前資源分配情況
{
inti,j;//局部變量
intAll[y];//各種資源的總數(shù)量
intl2;//局部變量
l1,
cout<<"==============================================================="<<endl<<endl;
cout<<"%%系統(tǒng)當(dāng)前狀態(tài)如下:%%"<<endl<<endl;cout<<"%%各種資源的總數(shù)量(all):"<<endl;
for(j=0;j<m;j++){
cout<<"資源"<<j<<":";
All[j]=Available[j];
for(i=0;i<n;i++){
All[j]+=Allocation[i][j];
cout<<All[j]<<"
";
if((j+1)%5==0)cout<<endl;
//每行顯示五個(gè)
&&j!=0
}
cout<<endl<<endl;
cout<<"%%系統(tǒng)目前各種資源可用的數(shù)為(available):"<<endl;
for(j=0;j<m;j++){
cout<<"資源"<<j<<":"<<Available[j]<<"
";
if((j+1)%5==0)cout<<endl;//每行最多顯示五個(gè)
&&j!=0
}
cout<<endl<<endl;
cout<<"%%各進(jìn)程已經(jīng)得到的資源量(allocation):"<<endl;
//
l1=0;
//歸零
for(i=0;i<=m/5;i++){
for(j=i*5;j<i*5+5&&j<m;j++)cout<<"
資源"<<j;
cout<<endl;
for(l2=0;l2<n;l2++){
cout<<"進(jìn)程"<<l2<<":";
for(j=i*5;j<i*5+5&&j<m;j++)cout<<Allocation[l2][j]<<"
";
cout<<endl;
}
}
cout<<endl;
cout<<"%%各進(jìn)程還需要的資源量(need):"<<endl;
//<<endl
//l1=0;
for(i=0;i<=m/5;i++){
//設(shè)計(jì)每行顯示五種資源
for(j=i*5;j<i*5+5&&j<m;j++)cout<<"
資源"<<j;
cout<<endl;
for(l2=0;l2<n;l2++){
cout<<"進(jìn)程"<<l2<<":";
for(j=i*5;j<i*5+5&&j<m;j++)cout<<Need[l2][j]<<"
";
cout<<endl;
}
}
//===銀行家算法函數(shù)===
voidbank(){
cout<<"==============================================================="<<endl<<endl;
cout<<"%%以下開始為進(jìn)程進(jìn)行資源分配申請%%"<<endl<<endl;
//===申請資源===
intk=0;//用于輸入進(jìn)程編號
boolr=false;
//初值為假,輸入Y繼續(xù)申請則置為真
do{
//輸入請求
cout<<"請輸入申請資源的進(jìn)程編號(輸入0--"<<n-1<<"之間):";
k=shuzi(k);
cout<<endl;
while(k>n-1){//輸入異常處理
cout<<endl<<"您輸入了錯(cuò)誤的進(jìn)程號,請重新輸入!"<<endl;
cout<<endl<<"請輸入申請資源的進(jìn)程編號(輸入0--"<<n-1<<"之間):";
k=shuzi(k);
cout<<endl;
}
cout<<endl<<"請輸入該進(jìn)程申請各類資源的數(shù)量:"<<endl;
for(j=0;j<m;j++){
do{
cout<<"進(jìn)程"<<k<<"申請資源["<<j<<"]的數(shù)量:";
Request[j]=shuzi(Request[j]);
cout<<endl;
if(Request[j]>Need[k][j]){
cout<<"申請大于需要量!!!"<<endl;
cout<<"您申請資源"<<j<<"的數(shù)量為"<<Request[j]<<",大于進(jìn)程"<<k<<"對該資源需求量"<<Need[k][j]<<"。"<<endl;
cout<<"請重新輸入!!!"<<endl;
}
else
if(Request[j]>Available[j]){
cout<<"\n沒有那么多資源,目前可利用資源"<<j<<"數(shù)量為"<<Available[j]<<",本次申請不成功,進(jìn)程等待!!!"<<endl;
Finish[k]=0;
//該進(jìn)程等待
gotoppp;
}
}while(Request[j]>Need[k][j]);
//Request[j]>Available[j]||
}
//改變Avilable、Allocation、Need的值
for(j=0;j<m;j++){
Available[j]=Available[j]-Request[j];
Allocation[k][j]=Allocation[k][j]+Request[j];
Need[k][j]=Need[k][j]-Request[j];
Work[j]=Available[j];
}
//判斷當(dāng)前狀態(tài)的安全性
safe();
//調(diào)用安全性算法函數(shù)
if(l<n){
l=0;
cout<<"\n當(dāng)前狀態(tài)不安全,不予分配!!!!!!"<<endl;
//恢復(fù)數(shù)據(jù)
for(j=0;j<m;j++){
Available[j]=Available[j]+Request[j];
Allocation[k][j]=Allocation[k][j]-Request[j];
Need[k][j]=Need[k][j]+Request[j];
Work[j]=Available[j];
}
for(i=0;i<n;i++)
Finish[i]=0;
/
}
else{
//
system("cls");
l=0;
cout<<"\n申請資源成功!!!"<<endl;//===========================================
/*
for(j=0;j<m;j++)if(Need[k][j]==0)l=l+1;
if(l==m){
//此處借用l做下計(jì)數(shù)器
for(j=0;j<m;j++){
Available[j]=Available[j]+Max[k][j];
Allocation[k][j]=0;
}
}
l=0;
//歸零
//===========================================
cout<<"\n安全的狀態(tài)!!!"<<endl;
cout<<"安全序列為:
";
cout<<endl<<"進(jìn)程"<<"("<<p[0]<<")";
Finish[0]=0;
for(i=1;i<n;i++){
cout<<"==>>"<<"進(jìn)程"<<"("<<p[i]<<")";
Finish[i]=0;//所有進(jìn)程置為未分配狀態(tài)
}
cout<<endl<<endl;
}
showdata();
//顯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度戶外廣告牌施工及品牌推廣服務(wù)合同
- 亮化工程管理服務(wù)合同
- 瑜伽館合作合同協(xié)議書
- 地產(chǎn)項(xiàng)目居間協(xié)議書房產(chǎn)轉(zhuǎn)讓全文
- 第三方公司擔(dān)保合同
- 采購商品代理合同
- 2025年博爾塔拉貨車上崗證理論模擬考試題庫
- 2025年南通下載貨運(yùn)從業(yè)資格證模擬考試
- 2025年青海運(yùn)輸從業(yè)資格證考試試題庫
- 2025年合肥道路運(yùn)輸從業(yè)資格證考試題和答案
- GB/T 39274-2020公共安全視頻監(jiān)控?cái)?shù)字視音頻編解碼技術(shù)測試規(guī)范
- GB/T 23800-2009有機(jī)熱載體熱穩(wěn)定性測定法
- T-SFSF 000012-2021 食品生產(chǎn)企業(yè)有害生物風(fēng)險(xiǎn)管理指南
- 2023年上海市閔行區(qū)精神衛(wèi)生中心醫(yī)護(hù)人員招聘筆試題庫及答案解析
- 水庫工程施工組織設(shè)計(jì)
- 氣流粉碎機(jī)課件
- 梁若瑜著-十二宮六七二象書增注版
- SJG 74-2020 深圳市安裝工程消耗量定額-高清現(xiàn)行
- 2017年安徽省中考數(shù)學(xué)試卷及答案解析
- GB∕T 41097-2021 非公路用旅游觀光車輛使用管理
- 礦山安全知識培訓(xùn)PPT課件
評論
0/150
提交評論