第一篇:計算機操作系統(tǒng) 課程設計報告 銀行家算法
《計算機操作系統(tǒng)》
課 程 設 計 報 告
題 目: 銀行家算法
班 級: XXXXXXXXXXXXXXXX 姓 名: XXM 學 號: XXXXXXXXXXXX 指導老師: XXXXXXXXXXXXXX 設計時間: XXXXXXXXXXXXXXX 一.設計目的
1、掌握死鎖概念、死鎖發(fā)生的原因、死鎖產生的必要條件;
2、掌握死鎖的預防、死鎖的避免;
3、深刻理解死鎖的避免:安全狀態(tài)和銀行家算法;
二.銀行家算法
1.簡介
銀行家算法是一種最有代表性的避免死鎖的算法。在避免死鎖方法中允許進程動態(tài)地申請資源,但系統(tǒng)在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統(tǒng)進入不安全狀態(tài),則分配,否則等待。為實現銀行家算法,系統(tǒng)必須設置若干數據結構。
2.數據結構
1)可利用資源向量Available 是個含有m個元素的數組,其中的每一個元素代表一類可利用的資源數目。如果Available[j]=K,則表示系統(tǒng)中現有Rj類資源K個。2)最大需求矩陣Max 這是一個n×m的矩陣,它定義了系統(tǒng)中n個進程中的每一個進程對m類資源的最大需求。如果Max[i,j]=K,則表示進程i需要Rj類資源的最大數目為K。3)分配矩陣Allocation 這也是一個n×m的矩陣,它定義了系統(tǒng)中每一類資源當前已分配給每一進程的資源數。如果Allocation[i,j]=K,則表示進程i當前已分得Rj類資源的 數目為K。4)需求矩陣Need 這也是一個n×m的矩陣,用以表示每一個進程尚需的各類資源數。如果Need[i,j]=K,則表示進程i還需要Rj類資源K個,方能完成其任務。Need[i,j]=Max[i,j]-Allocation[i,j].3.算法原理
操作系統(tǒng)按照銀行家制定的規(guī)則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統(tǒng)現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程本次申請的資源數是否超過了該資源所剩余的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。
三.算法實現
1.初始化
由用戶輸入數據,分別對可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。
2.銀行家算法
在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。
銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是,才分配。設進程cusneed提出請求REQUEST [i],則銀行家算法按如下規(guī)則進行判斷。(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],則轉(2);否則,出錯。(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],則轉(3);否則,出錯。(3)系統(tǒng)試探分配資源,修改相關數據: AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系統(tǒng)執(zhí)行安全性檢查,如安全,則分配成立;否則試探險性分配作廢,系統(tǒng)恢復原狀,進程等待。
3.安全性檢查算法
(1)設置兩個工作向量Work=AVAILABLE;FINISH(2)從進程集合中找到一個滿足下述條件的進程,FINISH==false;NEED<=Work;如找到,執(zhí)行(3);否則,執(zhí)行(4)(3)設進程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的進程Finish= true,則表示安全;否則系統(tǒng)不安全。
4.算法流程圖
1)初始化算法流程圖
2)銀行家算法流程圖:
3)安全性算法流程圖:
4.代碼(C語言)
#include
/*M個進程對N類資源最大資源需求量*/ int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系統(tǒng)可用資源數*/ int AVAILABLE[N]={10,5,7};/*M個進程對N類資源最大資源需求量*/ int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
/*M個進程已經得到N類資源的資源量 */ int
NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
/*M個進程還需要N類資源的資源量*/ int Request[N]={0,0,0};
void main(){
int i=0,j=0;char flag;
void showdata();void changdata(int);void rstordata(int);int chkerr(int);showdata();enter:{
printf(“請輸入需申請資源的進程號(從0到”);
printf(“%d”,M-1);
printf(“):”);
scanf(“%d”,&i);} if(i<0||i>=M){
printf(“輸入的進程號不存在,重新輸入!n”);
goto enter;}
err:{
printf(“請輸入進程”);
printf(“%d”,i);
printf(“申請的資源數n”);
printf(“類別: A B Cn”);printf(“ ”);
for(j=0;j { scanf(“%d”,&Request[j]); if(Request[j]>NEED[i][j]) { printf(“%d”,i); printf(“號進程”); printf(“申請的資源數 > 進程”); printf(“%d”,i); printf(“還需要”); printf(“%d”,j);printf(“類資源的資源量!申請不合理,出錯!請重新選擇!n”); goto err; } else { if(Request[j]>AVAILABLE[j]) { printf(“進程 ”); printf(“%d”,i); printf(“申請的資源數大于系統(tǒng)可用”); printf(“%d”,j); printf(“類資源的資源量!申請不合理,出錯!請重新選擇!n”); goto err; } } } } changdata(i);if(chkerr(i)){ rstordata(i); showdata();} else showdata(); printf(“n”); printf(“按'y'或'Y'鍵繼續(xù),否則退出n”); flag=getch(); if(flag=='y'||flag=='Y'){ goto enter; } else { exit(0);} } /*顯示數組*/ void showdata(){ int i,j;printf(“系統(tǒng)可用資源向量:n”);printf(“***Available***n”);printf(“資源類別: A B Cn”);printf(“資源數目:”);for(j=0;j printf(“%d ”,AVAILABLE[j]);} printf(“n”);printf(“n”);printf(“各進程還需要的資源量:n”);printf(“******Need******n”);printf(“資源類別: A B Cn”);for(i=0;i printf(“ ”); printf(“%d”,i); printf(“號進程:”); for(j=0;j { printf(“ %d ”,NEED[i][j]); } printf(“n”);} printf(“n”);printf(“各進程已經得到的資源量: n”);printf(“***Allocation***n”);printf(“資源類別: A B Cn”);for(i=0;i printf(“ ”); printf(“%d”,i); printf(“號進程:”); /*printf(“:n”);*/ for(j=0;j { printf(“ %d ”,ALLOCATION[i][j]); } printf(“n”); } printf(“n”);} /*系統(tǒng)對進程請求響應,資源向量改變*/ void changdata(int k){ int j; for(j=0;j AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j];} } /*資源向量改變*/ void rstordata(int k) { int j; for(j=0;j AVAILABLE[j]=AVAILABLE[j]+Request [j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j]; } } /*安全性檢查函數*/ int chkerr(int s){ int WORK,FINISH[M],temp[M];int i,j,k=0; for(i=0;i WORK=AVAILABLE[j]; i=s; printf(“n”); while(i { if(FINISH[i]==FALSE&&NEED[i][j]<=WORK) { printf(“系統(tǒng)不安全!本次資源申請不成功!n”); printf(“n”); return 1; } } } WORK=WORK+ALLOCATION[i][j]; FINISH[i]=TRUE; temp[k]=i;k++;i=0; printf(“n”); printf(“經安全性檢查,系統(tǒng)安全,本printf(”n“); printf(” 本次安全序列:n“);printf(”進程依次為“);for(i=0;i printf(”%d“,temp[i]); 次分配成功。n”);} else { i++;} } for(i=0;i printf(“-> ”);} printf(“n”);return 0;四.程序運行截圖 0號進程申請資源{1,2,3},各向量發(fā)生變化 0和進程繼續(xù)申請資源{2,2,0},各向量變化 2號進程申請資源,由于NEED[2]={9,0,2},前兩次申請不合理,系統(tǒng)處于不安全狀態(tài)太。第三次2號申請資源向量為{1,0,2},系統(tǒng)回到安全狀態(tài),并得出新的安全序列3-0-1-2-4。 五.心得體會 從此次的課程設計中,我收獲很多。首先也是最重要的一點是對處理機調度與死鎖有了深入的理解;其次,再次鞏固了C語言編程。 在用C語言設計和編寫銀行家算法和安全性檢查算法時遇到了一些困難都克服了。在使程序界面美觀、能夠持續(xù)循環(huán)運行時用了很多方法,花了比較多的時間。最后選擇用goto語句控制,我覺得在此實驗中比較好,代碼閱讀起來更加方便。 《操作系統(tǒng)》課程設計報告 課題: 銀行家算法 專業(yè) 計算機科學與技術 學生姓名 班級 計算機 學號 指導教師 信息工程學院 一、實驗要求和實驗目的實驗目的:本課程設計是學生學習完《操作系統(tǒng)原理》課程后,進行的一次全面的綜合訓練,通過課程設計,讓學生更好地掌握操作系統(tǒng)的原理及實現方法,加深對操作系統(tǒng)基礎理論和重要算法的理解,加強學生的動手能力。 實驗要求:從課程設計的目的出發(fā),通過設計工作的各個環(huán)節(jié),達到以下教學要求:兩人一組,每組從所給題目中任選一個(如自擬題目,需經指導教師同意),每個學生必須獨立完成課程設計,不能相互抄襲,同組者文檔不能相同;設計完成后,將所完成的工作交由指導教師檢查;要求寫出一份詳細的設計報告。 二、設計內容: 課題一、編制銀行家算法通用程序,并檢測所給狀態(tài)的系統(tǒng)安全性。 1)銀行家算法中的數據結構: 可利用資源向量Available。這是一個含有m個 元素的數組,其中的每一個元素代表一類可利用的資源數目,其初始值是系統(tǒng)中所配置的該類全部可用資源的數目,其數值隨該類資源的分配和回收而動態(tài)地改變。Available[j]=K,則表示系統(tǒng)中現有Rj 類資源K個。 最大需求矩陣Max。這是一個n*m的矩陣,它定義了系統(tǒng)中n個進程中的每一個進程對m類資源的最大需求。如果Max[i,j]=K,則表示進程i需要Rj類資源的最大數目為K。 1.分配矩陣Allocation。這也是一個n*m的矩陣,它定義了系統(tǒng)中每一類資料當前已分配給沒一進程的資源數。如果Allocation[i,j]=K,則表示進程i當前已分得Rj類資源的數目為K。需求矩陣Need。這也是一個n*m的矩陣,用以表示每一個進程尚需的各類資源數。如果Need[i,j]=K,則表示進程i還需要Rj類資源K個,方能完成其任務。 上述三個矩陣存在如下關系: Need[i,j]= Max[i,j]- Allocation[i,j] 2)銀行家算法 設Request[i] 是進程Pi的請求向量,如果Request[i,j]=K,表示進程Pi需要K個Rj類型的資源。當Pi發(fā)出資源請求后,系統(tǒng)按下述步驟進行檢查:如果Request[i,j]<= Need[i,j],便轉向步驟2;否則認為出錯,因為它所需要的資源數已超過它所宣布的最大值。 三、設計思路 設計思路A、設計進程對各在資源最大申請表示及初值確定。B、設定系統(tǒng)提供資源初始狀態(tài)。C、設定每次某個進程對各類資源的申請表示。D、編制程序,依據銀行家算法,決定其申請是否得到滿足。 四、詳細設計 1、初始化:由用戶輸入數據,分別對可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。 2、銀行家算法:在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是,才分配。它是最具有代表性的避免死鎖的算法。 設進程cusneed提出請求REQUEST [i],則銀行家算法按如下規(guī)則進行判斷。 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],則轉(2);否則,出錯。 (2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],則轉(3);否則,出錯。 銀行家算法的數據結構 假設有M個進程N類資源,則有如下數據結構: #define W #define R int M ; //總進程數 int N ; //資源種類 int ALL_RESOURCE[W]; //各種資源的數目總和 int MAX[W][R]; //M個進程對N類資源最大資源需求量 int AVAILABLE[R]; //系統(tǒng)可用資源數 int ALLOCATION[W][R]; //M個進程已經得到N類資源的資源量 int NEED[W][R]; //M個進程還需要N類資源的資源量 int Request[R]; //請求資源個數 3.“安全性檢測“算法 1)先定義兩個變量,用來表示推算過程的數據.F[n]=A[n],表示推算過程中,系統(tǒng)中剩余資源量的變化.J[n]=False表示推算過程中各進程是否假設“已完成“ 系統(tǒng)試探分配資源,修改相關數據: AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];、NEED[cusneed][i]-=REQUEST[cusneed][i]; 4、安全性檢查算法 1)設置兩個工作向量Work=AVAILABLE;FINISH 2)從進程集合中找到一個滿足下述條件的進程,FINISH==false; NEED<=Work; 如找到,執(zhí)行(3);否則,執(zhí)行(4) 3)設進程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。 Work+=ALLOCATION; Finish=true; GOTO 4)如所有的進程Finish= true,則表示安全;否則系統(tǒng)不安全。 安全狀態(tài): 在某時刻系統(tǒng)中所有進程可以排列一個安全序列:{P1,P2,`````Pn},剛稱此時,系統(tǒng)是安全的.所謂安全序列{P1,P2,`````Pn}是指對于P2,都有它所需要剩余資源數量不大于系統(tǒng)掌握的剩余的空間資源與所有Pi(j 最大需求 尚需 P1 P2 P3 4?????????????2 在每一次進程中申請的資源,判定一下,若實際分配的話,之后系統(tǒng)是否安全.銀行家算法的數據結構.五、代碼清單 #include #include #include #include #include #include const int MAX_P=20; const int MAXA=10; //定義A類資源的數量 const int MAXB=5; const int MAXC=7; typedef struct node{ int a; int b; int c; int remain_a; int remain_b; int remain_c; }bank; typedef struct node1{ char name[20]; int a; int b; int c; int need_a; int need_b; int need_c; }process; bank banker; process processes[MAX_P]; int quantity; //初始化函數 void initial() { int i; banker.a=MAXA; banker.b=MAXB; banker.c=MAXC; banker.remain_a=MAXA; banker.remain_b=MAXB; banker.remain_c=MAXC; for(i=0;i strcpy(processes[i].name,““); processes[i].a=0; processes[i].b=0; processes[i].c=0; processes[i].need_a=0; processes[i].need_b=0; processes[i].need_c=0; } } //新加作業(yè) void add() { char name[20]; int flag=0; int t; int need_a,need_b,need_c; int i; cout< cout<<“新加作業(yè)“< cout<<“請輸入新加作業(yè)名:“; cin>>name; for(i=0;i if(!strcmp(processes[i].name,name)){ flag=1; break; } } if(flag){ cout<<“錯誤,作業(yè)已存在“< } else{ cout<<“本作業(yè)所需A類資源:“; cin>>need_a; cout<<“本作業(yè)所需B類資源:“; cin>>need_b; cout<<“本作業(yè)所需C類資源:“; cin>>need_c; t=1; cout< if(need_a>banker.remain_a){ cout<<“錯誤,所需A類資源大于銀行家所剩A類資源“< t=0; } if(need_b>banker.remain_b){ cout<<“錯誤,所需B類資源大于銀行家所剩B類資源“< t=0; } if(need_c>banker.remain_c){ cout<<“錯誤,所需C類資源大于銀行家所剩C類資源“< t=0; } if(t){ strcpy(processes[quantity].name,name); processes[quantity].need_a=need_a; processes[quantity].need_b=need_b; processes[quantity].need_c=need_c; quantity++; cout<<“新加作業(yè)成功“< } else{ cout<<“新加作業(yè)失敗“< } } } //為作業(yè)申請資源 void bid() { char name[20]; int i,p; int a,b,c; int flag; cout< cout<<“要申請資源的作業(yè)名:“; cin>>name; p=-1; for(i=0;i if(!strcmp(processes[i].name,name)){ p=i; break; } } if(p!=-1){ cout<<“該作業(yè)要申請A類資源數量:“; cin>>a; cout<<“該作業(yè)要申請B類資源數量:“; cin>>b; cout<<“該作業(yè)要申請C類資源數量:“; cin>>c; flag=1; if((a>banker.remain_a)||(a>processes[p].need_a-processes[p].a)){ cout<<“錯誤,所申請A類資源大于銀行家所剩A類資源或該進程還需數量“< flag=0; } if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b)){ cout<<“錯誤,所申請B類資源大于銀行家所剩B類資源或該進程還需數量“< flag=0; } if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c)){ cout<<“錯誤,所申請C類資源大于銀行家所剩C類資源或該進程還需數量“< flag=0; } if(flag){ banker.remain_a-=a; banker.remain_b-=b; banker.remain_c-=c; processes[p].a+=a; processes[p].b+=b; processes[p].c+=c; cout<<“為作業(yè)申請資源成功“< } else{ cout<<“為作業(yè)申請資源失敗“< } } else{ cout<<“該作業(yè)不存在“< } } //撤消作業(yè) void finished() { char name[20]; int i,p; cout< cout<<“要撤消作業(yè)名:“; cin>>name; p=-1; for(i=0;i if(!strcmp(processes[i].name,name)){ p=i; break; } } if(p!=-1){ banker.remain_a+=processes[p].a; banker.remain_b+=processes[p].b; banker.remain_c+=processes[p].c; for(i=p;i processes[i]=processes[i+1]; } strcpy(processes[quantity-1].name,““); processes[quantity-1].a=0; processes[quantity-1].b=0; processes[quantity-1].c=0; processes[quantity-1].need_a=0; processes[quantity-1].need_b=0; processes[quantity-1].need_c=0; quantity--; cout<<“撤消作業(yè)成功“< } else{ cout<<“撤消作業(yè)失敗“< } } //查看資源情況 void view() { int i; cout< cout<<“銀行家所剩資源(剩余資源/總共資源)“< cout<<“A類:“< cout<<“ B類:“< cout<<“ C類:“< cout< if(quantity>0){ for(i=0;i cout<<“作業(yè)名:“< cout<<“A類:“< cout<<“ B類:“< cout<<“ C類:“< cout< } } else{ cout<<“當前沒有作業(yè)“< } } //顯示版權信息函數 void version() { cout< cout<<“ 銀行家算法 “< cout< } void main() { int chioce; int flag=1; initial(); version(); while(flag){ cout<<“1.新加作業(yè) 2.為作業(yè)申請資源 3.撤消作業(yè)“< cout<<“4.查看資源情況 0.退出系統(tǒng)“< cout<<“請選擇:“; cin>>chioce; switch(chioce){ case 1: add(); break; case 2: bid(); break; case 3: finished(); break; case 4: view(); break; case 0: flag=0; break; default: cout<<“選擇錯誤“< } } } 六、使用說明 運行環(huán)境C-FREE4.0,新建任務。將編制好的代碼輸入此運行環(huán)境中。 按F5:出現如上圖所示窗口。按照提示,新建一個作業(yè):wujun。為作業(yè)分配資源,A:3;B:4;C:5。輸入2,為作業(yè)分配資源。三種資源的數量分配分別為:A:3;B:5;C:4。輸入4,查看資源情況。出現出錯提示,所申請的B類資源超過銀行家所剩B類資源或作業(yè)申請資源失敗。輸入0,退出系統(tǒng)。 重新加入一個作業(yè):wujun1.并為作業(yè)分配資源分別為A:3;B:3;C:3,為該作業(yè)分配資源A:3;B:2;C:2.輸入4查看資源情況。 顯示輸出,銀行家算法所剩資源(剩余資源、總共資源)。 七、實驗心得 八、參考文獻 湯子瀛等.計算機操作系統(tǒng).西安電子科技大學出版社.2001年5月 蔣靜 徐志偉.操作系統(tǒng)原理?技術與編程『M』.北京:機械工業(yè)出版社,2004 實驗四 死鎖 一、實驗目的 當系統(tǒng)的總資源數m小于或等于所有進程對對資源的最大需求時,就可能產生 死鎖。死鎖會引起計算機系統(tǒng)的癱瘓。銀行家算法是在實現資源分配時避免死鎖的一個著名算法,該算法是在能確保系統(tǒng)處于安全狀態(tài)時才把資源分配給申請者。通過本實驗使學生能進一步理解死鎖的概念,并能選擇一個算法來避免死鎖。 二、實驗題目 系統(tǒng)中有m個同類資源被n個進程共享,每個進程對資源的最大需求數分別為S1, S2,…,Sn,且 Max(Si)<=m,(i=1,2,…n)。進程可以動態(tài)地申請資源和釋放資源。編寫一個程序,現銀行家算法,當系統(tǒng)將資源分配給某一進程而不會死鎖時,就分配之。否則,推遲分配,并顯示適當的信息。 三、數據結構 主要數據結構: Struct aa { void Print();//用于打印輸出表格的函數 void Input();//用于輸入的函數 void tryfenpei(int i);//試分配函數 void refenpei(int i);//恢復數據函數 void checksafe(int s);//安全檢測函數 }; 四、銀行家算法的流程圖 開始初始化資源類數c=3,進程數t=5初始化Available[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c]輸入進程數iInt f=0f 五、源代碼 #include void Print();//用于打印輸出表格的函數 void Input();//用于輸入的函數 void tryfenpei(int i);//試分配函數 void refenpei(int i);//恢復數據函數 void checksafe(int s);//安全檢測函數 //定義初始化數組 int Available[c], Max[t][c], Allocation[t][c], Need[t][c], Request[c]; int in;//用戶選擇的進程號 int main(int argc, char *argv[]){ int i;char ch='Y';cout<<“初始化數據如下:”< cout<<“試分配完成!”< cout<<“需要繼續(xù)實驗嗎?(y-繼續(xù) n終止)”;} else if(ch=='N'||ch=='n'){ cout<<“感謝您的使用,祝您愉快!”< void Print(){ int i,j;cout<<“ 進程個數 : ”< void Input(){ for(int j=0;j { for(int m=0;m void tryfenpei(int i){ for(int f=0;f //安全檢測函數 void checksafe(int s){ int Work, flag, temp[t], i,j,l=0,k=0;bool Finish[t];for(i=0;i } if(l==5)//一共有三類資源A B C,一條進程下面的安全性檢測只檢測了A類。如果A類通過了,那么還要判斷B類,C類。否則不用 { for(i=0;i } i=s;//s傳遞進來賦給i,s是用戶輸入的進程號(有主函數里的in傳遞進來)while(i if(Finish[i]==false&&Need[i][j]<=Work){ Work=Work+Allocation[i][j];Finish[i]=true;temp[k]=i;//cout<<“temp=”< 六、執(zhí)行結果: 七、實驗總結 通過本次實驗了解到用銀行家算法來預防死鎖是可靠的,但也是非常保守的,因為它限制了進程對資源的存取,從而降低了進程的并發(fā)運行程度。死鎖檢測并不限制進程對資源的申請,只要有,就分配,但這也可能造成死鎖。但由于死鎖并不是經常發(fā)生的,故大大提高了系統(tǒng)運行的效率。 總之,通過本實驗,使我進一步加深理解和掌握銀行家算法。 操作系統(tǒng)課程設計 (銀行家算法的模擬實現) 一、設計目的 1、進一步了解進程的并發(fā)執(zhí)行。 2、加強對進程死鎖的理解。 3、用銀行家算法完成死鎖檢測。 二、設計內容 給出進程需求矩陣C、資源向量R以及一個進程的申請序列。使用進程啟動拒絕和資源分配拒絕(銀行家算法)模擬該進程組的執(zhí)行情況。 三、設計要求 1、初始狀態(tài)沒有進程啟動。 2、計算每次進程申請是否分配,如:計算出預分配后的狀態(tài)情況(安全狀態(tài)、不安全狀態(tài)),如果是安全狀態(tài),輸出安全序列。 3、每次進程申請被允許后,輸出資源分配矩陣A和可用資源向量V。 4、每次申請情況應可單步查看,如:輸入一個空格,繼續(xù)下個申請。 四、算法原理 1、銀行家算法中的數據結構(1)、可利用資源向量Available,這是一個含有m個元素的數組,其中的每個元素代表一類可利用資源的數目,其初始值是系統(tǒng)中所配置的該類全部資源的數目,其數值隨該類資源的分配和回收而動態(tài)改變。如果Available[j]=K,則表示系統(tǒng)中現有Rj類資源K個。 (2)、最大需求矩陣Max,這是一個n*m的矩陣,它定義了系統(tǒng)中n個進程中的每一個進程對m類資源的最大需求。如果Max[i,j]=K,則表示進程i需要Rj類資源的最大數目為K。 (3)、分配矩陣Allocation。這也是一個n*m的矩陣,它定義了系統(tǒng)中每一類資源當前已分配給每一進程的資源數。如果Allocation[i,j]=K,則表示進程i當前已經分得Rj類資源的數目為K。 (4)、需求矩陣Need。這也是一個n*m的矩陣,用以表示每個進程尚需要的各類資源數。如果Need[i,j]=K,則表示進程i還需要Rj類資源K個,方能完成其任務。上述三個矩陣間存在以下關系: Need[i,j]=Max[i,j]-Allocation[i,j] 2、銀行家算法應用 模擬實現Dijkstra的銀行家算法以避免死鎖的出現,分兩部分組成:一是銀行家算法(掃描);二是安全性算法。 (1)銀行家算法(掃描) 設Requesti是進程Pi的請求向量,如果Requesti[j]=K,表示進程Pi需要K個Ri類型的資源。當Pi發(fā)出資源請求后,系統(tǒng)按下述步驟進行檢查: ①如果Requesti[j]<=Need[i,j],便轉向步驟②;否則認為出錯,因為它所需的資源數已經超過了它所宣布的最大值。 ②如果Requesti[j]<=Allocation[i,j],便轉向步驟③;否則表示尚無足夠資源,Pi需等待。 ③系統(tǒng)試探著把資源分配給進程Pi,并修改下面數據結構中的數值。 Available[j]=Available-Requesti[j]; Allocation[i,j]=Allocation[i,j]+Requesti[j]; Need[i,j]=Need[i,j]-Requesti[j]; ④系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。若安全,才正式將資源分配給進程Pi,已完成本次分配;否則,將本次的試探分配作廢,恢復原來資源的分配狀態(tài),讓進程Pi等待。 (2)安全性算法 系統(tǒng)所執(zhí)行的安全性算法可描述如下: ①設置兩個向量:一個是工作向量Work;它表示系統(tǒng)可提供給進程繼續(xù)運行所需要的各類資源的數目,它含有m個元素,在執(zhí)行安全性算法開始時,work=Available;另一個是Finish;它表示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成。開始時先做Finish[i]=false;當有足夠資源分配給進程時,再令Finish[i]=true; ②從進程集合中找到能滿足下述條件的進程: 一是Finish[i]==false;二是Need[i,j]<=Work[j];若找到,執(zhí)行步驟③,否則,執(zhí)行步驟④; ③當進程Pi獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應執(zhí)行: Work[j]=Work[j]+Allocation[i,j]; Finish[i]=true; go to step②; ④如果所有進程的 Finish[i]==true都滿足,則表示系統(tǒng)處于安全狀態(tài),否則系統(tǒng)處于不安全狀態(tài)。 五、設計思路 1、進程一開始向系統(tǒng)提出最大需求量; 2、進程每次提出新的需求(分期貸款)都統(tǒng)計是否超出它事先提出的最大需求量; 3、若正常,則判斷該進程所需剩余量(包括本次申請)是否超出系統(tǒng)所掌握的剩余資源量,若不超出,則分配,否則等待。 六、程序運行調試結果 1、程序初始化 2、檢測系統(tǒng)資源分配是否安全結果 七、小結 “銀行家算法的模擬實現”是本學期操作系統(tǒng)課程的課程設計。在設計此程序的過程中我們遇到過許多問題也學到了很多東西。通過這周的課程設計,我加深了對銀行家算法的理解,掌握了銀行家算法避免死鎖的過程和方法,理解了死鎖產生的原因和條件以及避免死鎖的方法。所編寫程序基本實現了銀行家算法的功能,并在其基礎上考慮了輸出顯示格式的美觀性,使界面盡可能友好。并且在編程時將主要的操作都封裝在函數中,這樣使程序可讀性增強,使程序更加清晰明了。在算法的數據結構設計上考慮了很長時間。在程序設計中先后參考了很多網絡資料也參考了一些別人寫的的程序綜合這些算法思想和自己的思路對程序做了很好的設計方式對一些算法的優(yōu)越性等也作了一些考慮。當然,在編寫和調試過程中我遇到了許多的問題,通過網上查詢資料、翻閱課本、向同學請教、多次調試等方法逐漸解決了大部分問題。讓我收獲很多,相信在今后的生活中也有一定幫助。 附:程序源代碼: #include int no1;//進程數 int no2;//資源數 int r;int allocation[m][m],need[m][m],available[m],max[m][m];char name1[m],name2[m];//定義全局變量 void main(){ void check();void print();int i,j,p=0,q=0;char c;int request[m],allocation1[m][m],need1[m][m],available1[m];printf(“**********************************************n”);printf(“* 銀行家算法的設計與實現 *n”);printf(“**********************************************n”);printf(“請輸入進程總數:n”);scanf(“%d”,&no1);printf(“請輸入資源種類數:n”);scanf(“%d”,&no2);printf(“請輸入Max矩陣:n”);for(i=0;i for(j=0;j scanf(“%d”,&max[i][j]);//輸入已知進程最大資源需求量 printf(“請輸入Allocation矩陣:n”);for(i=0;i for(j=0;j scanf(“%d”,&allocation[i][j]);//輸入已知的進程已分配的資源數 for(i=0;i for(j=0;j need[i][j]=max[i][j]-allocation[i][j];//根據輸入的兩個數組計算出need矩陣的值 printf(“請輸入Available矩陣n”);for(i=0;i scanf(“%d”,&available[i]);//輸入已知的可用資源數 print();//輸出已知條件 check();//檢測T0時刻已知條件的安全狀態(tài) if(r==1)//如果安全則執(zhí)行以下代碼 { do{ q=0;p=0;printf(“n請輸入請求資源的進程號(0~4):n”); for(j=0;j<=10;j++) { scanf(“%d”,&i); if(i>=no1) { printf(“輸入錯誤,請重新輸入:n”); continue; } else break; } printf(“n請輸入該進程所請求的資源數request[j]:n”); for(j=0;j scanf(“%d”,&request[j]); else //請求滿足條件 { for(j=0;j { available1[j]=available[j]; allocation1[i][j]=allocation[i][j]; need1[i][j]=need[i][j]; //保存原已分配的資源數,仍需要的資源數和可用的資源數 available[j]=available[j]-request[j]; allocation[i][j]+=request[j]; need[i][j]=need[i][j]-request[j];//系統(tǒng)嘗試把資源分配給請求的進程 } print(); check();//檢測分配后的安全性 if(r==0)//如果分配后系統(tǒng)不安全 { for(j=0;j { available[j]=available1[j]; allocation[i][j]=allocation1[i][j]; need[i][j]=need1[i][j];//還原已分配的資源數,仍需要的資源數和可用的資源數 } printf(“返回分配前資源數n”); print(); } } }printf(“n你還要繼續(xù)分配嗎?Y or N ?n”); //判斷是否繼續(xù)進行資源分配 for(j=0;j if(p) printf(“請求資源超過該進程資源需求量,請求失?。”);else { for(j=0;j if(request[j]>available[j])q=1;//判斷請求是否超過可用資源數 if(q) printf(“沒有做夠的資源分配,請求失??!n”); c=getche(); }while(c=='y'||c=='Y');} } void check()//安全算法函數 { int k,f,v=0,i,j;int work[m],a[m];bool finish[m];r=1;for(i=0;i finish[i]=false;// 初始化進程均沒得到足夠資源數并完成for(i=0;i k=no1;do{ for(i=0;i { if(finish[i]==false) { f=1; for(j=0;j if(need[i][j]>work[j]) f=0; if(f==1)//找到還沒有完成且需求數小于可提供進程繼續(xù)運行的資源數的進程 { finish[i]=true; a[v++]=i;//記錄安全序列號 for(j=0;j work[j]+=allocation[i][j];//釋放該進程已分配的資源 } } } k--;//每完成一個進程分配,未完成的進程數就減1 }while(k>0);f=1;for(i=0;i if(finish[i]==false) { f=0; break; } } if(f==0)//若有進程沒完成,則為不安全狀態(tài) { printf(“系統(tǒng)處在不安全狀態(tài)!”); r=0;} else { printf(“n系統(tǒng)當前為安全狀態(tài),安全序列為:n”); for(i=0;i printf(“p%d ”,a[i]);//輸出安全序列 } } void print()//輸出函數 { int i,j;printf(“n”);printf(“*************此時刻資源分配情況*********************n”);printf(“進程名/號 | Max | Allocation | Need |n”);for(i = 0;i < no1;i++) { printf(“ p%d/%d ”,i,i); for(j = 0;j < no2;j++){printf(“%d ”,max[i][j]);} for(j = 0;j < no2;j++) {printf(“ %d ”,allocation[i][j]);} for(j = 0;j < no2;j++) {printf(“ %d ”,need[i][j]);} printf(“n”); } printf(“n”); printf(“各類資源可利用的資源數為:”); for(j = 0;j < no2;j++) {printf(“ %d”,available[j]);} } printf(“n”); (程序結束) 課程設計報告書 課程名稱: 操作系統(tǒng)原理 題 目: 編程序模擬銀行家算法 系 名: 信息工程系 專業(yè)班級: 軟件 姓 名: 學 號: 指導教師: 2013年 X 月 X 日 學院信息工程系 課 程 設 計 任 務 書 課程名稱: 操作系統(tǒng)原理課程設計 指導教師: 班級名稱: 軟件 開課系、教研室: 軟件與信息安全 一、課程設計目的與任務 操作系統(tǒng)課程設計是《操作系統(tǒng)原理》課程的后續(xù)實踐課程,旨在通過一周的實踐訓練,加深學生對理論課程中操作系統(tǒng)概念,原理和方法的理解,加強學生綜合運用操作系統(tǒng)原理、Linux系統(tǒng)、C語言程序設計技術進行實際問題處理的能力,進一步提高學生進行分析問題和解決問題的能力,包含系統(tǒng)分析、系統(tǒng)設計、系統(tǒng)實現和系統(tǒng)測試的能力。 學生將在指導老師的指導下,完成從需求分析,系統(tǒng)設計,編碼到測試的全過程。 二、課程設計的內容與基本要求 1、課程設計題目 編程序模擬銀行家算法 2、課程設計內容 本課程設計要求在Linux操作系統(tǒng),GCC編譯環(huán)境下開發(fā)。 銀行家算法是避免死鎖的一種重要方法,本實驗要求用用c/c++語言在Linux操作系統(tǒng)環(huán)境下編寫和調試一個簡單的銀行家算法程序。加深了解有關資源申請、避免死鎖等概念,并體會和了解死鎖和避免死鎖的具體實施方法。 思想:將一定數量的資金供多個用戶周轉使用,當用戶對資金的最大申請量不超過現存資金時可接納一個新客戶,客戶可以分期借款,但借款總數不能超過最大的申請量。銀行家對客戶的借款可以推遲支付,但是能夠使客戶在有限的時間內得到借款,客戶得到所有的借款后能在有限的時間內歸還。用銀行家算法分配資源時,測試進程對資源的最大需求量,若現存資源能滿足最大需求就滿足當前進程的申請,否則推遲分配,這樣能夠保證至少有一個進程可以得到所需的全部資源而執(zhí)行到結束,然后歸還資源,若OS能保證所有進程在有限的時間內得到所需資源則稱系統(tǒng)處于安全狀態(tài)。 3、設計報告撰寫格式要求: 1設計題目與要求 設計思想 3系統(tǒng)結構 數據結構的說明和模塊的算法流程圖 使用說明書(即用戶手冊):內容包含如何登錄、退出、讀、寫等操作說明 運行結果和結果分析(其中包括實驗的檢查結果、程序的運行情況) 自我評價與總結 附錄:程序清單,注意加注釋(包括關鍵字、方法、變量等),在每個模塊前加注釋; 三、課程設計步驟及時間進度和場地安排 本課程設計將安排在第15周,教育技術中心。具體安排如下: 第一天 下發(fā)任務書,學生查閱資料 第二天 系統(tǒng)設計和原型開發(fā) 第三,四天 系統(tǒng)功能實現 第五天 系統(tǒng)調試 測試 打包和驗收 四、課程設計考核及評分標準 課程設計考核將綜合考慮學生考勤和參與度,系統(tǒng)設計方案正確性,系統(tǒng)設計和開發(fā)效果以及課程設計報告書的質量。具體評分標準如下: 設置六個評分點 (1)設計方案正確,具有可行性、創(chuàng)新性; 25分 (2)系統(tǒng)開發(fā)效果較好; 25分 (3)態(tài)度認真、刻苦鉆研、遵守紀律; 10分 (4)設計報告規(guī)范、課程設計報告質量高、參考文獻充分 20分 (5)課程設計答辯概念清晰,內容正確 10分 (6)課程設計期間的課堂考勤、答疑與統(tǒng)籌考慮。 10分 按上述六項分別記分后求和,總分按五級記分法記載最后成績。 優(yōu)秀(100~90分),良好(80~89分),中等(70~79分),及格(60~69分),不及格(0~59分) 1.題目要求與實驗目的1.1 實驗目的: 1.1.1進一步理解利用銀行家算法避免死鎖的問題; 1.1.2在了解和掌握銀行家算法。 1.1.3理解和掌握安全序列、安全性算法 1.2 設計題目: 編程序模擬銀行家算法 1.3 要求 : 本實驗要求用用 c/c語言在Linux 操作系統(tǒng)環(huán)境下編寫和調試一個簡單的銀行家算法程序。加深了解有關資源申請、避免死鎖等概念,并體會和了解死鎖和避免死鎖的具體實施方法。 1.4 實驗內容 : 1.4.1編寫安全性算法; 1.4.2編寫銀行家算法,并編制銀行家算法通用程序,將調試結果顯示在計算機屏幕上,再檢測和筆算的一致性。 設計思想 將一定數量的資金供多個用戶周轉使用,當用戶對資金的最大申請量不超過現存資金時可接納一個新客戶,客戶可以分期借款,但借款總數不能超過最大的申請量。銀行家對客戶的借款可以推遲支付,但是能夠使客戶在有限的時間內得到借款,客戶得到所有的借款后能在有限的時間內歸還。 用銀行家算法分配資源時,測試進程對資源的最大需求量,若現存資源能滿足最大需求就滿足當前進程的申請,否則推遲分配,這樣能夠保證至少有一個進程可以得到所需的全部資源而執(zhí)行到結束,然后歸還資源,若OS能保證所有進程在有限的時間內得到所需資源則稱系統(tǒng)處于安全狀態(tài)。 3.需求分析 3.1問題描述:利用銀行家算法模擬計算機系統(tǒng)分配資源的過程。 3.2要求: 3.2.11、以課本例題中數據為例,模擬資源分配過程。 3.2.2、系統(tǒng)中資源種類,各類資源數目,進程申請資源數目可任意輸入,模擬資源分配過程。 4.系統(tǒng)結構 初始化函數init()開始 輸入進程的數目m 輸入資源種類n 輸入每個進程最多所需的各種資源數 輸入每個進程分配的資源數 輸入各個資源現有數目 初始化函數init()結束 輸入提示: 輸入有誤重新輸入 圖 5.數據結構的說明和模塊的算法流程圖 5.1 數據結構: ①可利用資源向量 Available 是個含有 m 個元素的數組,其中的每一個元素代表一類可利用的資源數目。如果 AvailablejK,則表示系統(tǒng)中現有 Rj 類資源 K 個。 ②最大需求矩陣 Max 這是一個 n×m的矩陣,它定義了系統(tǒng)中 n 個進程中的每一個進程對 m 類資源的最大需求。如果 MaxijK,則表示進程 i 需要 Rj 類資源的最大數目為 K。 ③分配矩陣 Allocation 這也是一個 n×m的矩陣,它定義了系統(tǒng)中每一類資源當前已分配給每一進程的資源數。如果 AllocationijK,則表示進程 i 當前已分得 Rj 類資源的數目為 K。 ④需求矩陣 Need。 這也是一個 n×m的矩陣,用以表示每一個進程尚需的各類資源數。如果NeedijK,則表示進程 i 還需要 Rj 類資源 K 個,才可以完成其任務。 5.2 程序流程圖: ①、系統(tǒng)主要過程流程 預分配 安全? 實際分配打印輸出 退出系統(tǒng) Request[i]>Available[i]? Request[i]>need[i]? 提出申請 打印輸出此時刻資源分配情況 進入系統(tǒng) 輸入: 1.繼續(xù)分配 2.退出 進入初始化 ②、安全性算法流程圖 調用safty()函數 Work[]=Available[],Finish[]=False Need[]<=work[]且Finsh[]=Falsse? Work[]=work[]+Alloccation[],Finish[]=Ture 所有進程的Finsh[]=Ture? 實際分配輸出安全序列并打印出 輸出提示系統(tǒng)不安全 調用結束 用戶手冊 6.1 首先在終端中使用 vi 編輯器建立 c的源文件 6.2 然后使用 gcc 編輯器編譯生成可執(zhí)行文件 6.3 使用命令./當前名字,來執(zhí)行 7.運行結果和結果分析 7.1 運行結果: 申請成功如圖 2,申請失敗如圖 3: 圖 申請金額在需求范圍之內同意 圖 申請金額在需求范圍之外拒絕 7.2 結果分析 首先是自己定義 個用戶所需的金額數,銀行可以給用戶貸款的總金額數是100,用戶 Id 號的范圍是在0 到 4,超過 之后的id 請求貸款,會顯示拒絕提示信息,每個客戶的貸款數量必須是在之前定義的范圍之內,如果超出,也會出現錯誤提示,只有在規(guī)定的用戶 id 和在客戶所要求金額的范圍之內請求,才會給予貸款,并且輸出安全序列號。 8.自我評價與總結 一周的課程設計結束了。在這一周里,我收獲很多,以前都是在自己的教室由我們自己的老師進行講課,這次學校沒有這樣做,而是請的校外的老師給我們做課程設計,讓我們體會一下真正的公司是怎樣做業(yè)務的。在這一周里我做一個模擬銀行家算法。我覺得在著手設計前設計的思路是很重要的。只有思路清晰才能進行下一階段的設計。這樣才能完成整個程序的設計,完成整個文報告的書寫。 課程設計這幾天學到的東西還真不少。以前不清楚的現在都暴露出來了。以前認為學了沒用的東西現在也用到了。這次的課程設計使我進一步了解了調度與死鎖的問題。以及有關資源申請的問題、避免死鎖的具體實施方法。深入了解了銀行家算法的資源申請和資源分配的過程及原則。保證系統(tǒng)處于安全狀態(tài)。 經過本周的課程設計,我對操作系統(tǒng)的掌握又進了一步,收獲了很多知識。,終于我了由于對 c 語言不夠熟練,在試驗過程中,進行了反復的修改和調試,解銀行家算法的基本原理,并且在此次的課程設計中我又復習了一下 c 語言,加深了對它的了解,而且在課程設計的過程中我們同樣學會了如何簡單的操作與使用 Linux 操作系統(tǒng),學習到了許多 Linux 操作系統(tǒng)中常用的一些密令。 這次的設計數據是通過一道實際的題目來體現銀行家算法避免死鎖的問題,先用銀行家算法給其中一個進程分配資源,看它所請求的資源是否大于它的需求量,才和系統(tǒng)所能給的資源相比較.讓進程形成一個安全隊列看系統(tǒng)是否安全.再利用安全性算法檢查此時系統(tǒng)是否安全。 操作系統(tǒng)的基本特征是并發(fā)與共享。系統(tǒng)允許多個進程并發(fā)執(zhí)行,并且共享系統(tǒng)的軟、硬件資源。為了最大限度的利用計算機系統(tǒng)的資源,操作系統(tǒng)應采用動態(tài)分配的策略,但是這樣就容易因資源不足,分配不當而引起“死鎖”。而我本次課程設計就是得用銀行家算法來避免“死鎖”。銀行家算法就是一個分配資源的過程,使分配的序列不會產生死鎖。此算法的中心思想是:按該法分配資源時,每次分配后總存在著一個進程,如果讓它單獨運行下去,必然可以獲得它所需要的全部資源,也就是說,它能結束,而它結束后可以歸還這類資源以滿足其他申請者的需要。 通過這次實驗,我體會到銀行家算法的重要性,銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我來學習借鑒。 附錄: 主要源程序 參考文獻 [1] 張堯學主編.計算機操作系統(tǒng)教程(第三版).北京:清華大學出版社,2006 [2] 張堯學編.計算機操作系統(tǒng)教程(第三版)習題解答與實驗指導.北京:清華大學出版社,2006 [3] 湯子瀛主編.計算機操作系統(tǒng)(第三版).西安:西安電子科技大學出版社,2001 [4] 張坤等編.操作系統(tǒng)實驗教程.北京:清華大學出版社,2008 [5] 張麗芬等編.操作系統(tǒng)實驗教程.北京:清華大學出版社,2006 [6] 屠祁等編.操作系統(tǒng)基礎(第三版).北京:清華大學出版社,2000 [7] 馮耀霖等編.操作系統(tǒng).西安:西安電子科技大學出版社,2001 [8] 左萬歷.計算機操作系統(tǒng)教程(第二版).北京:高等教育出版社,2004 [9]譚浩強.《C語言程序設計》.北京:清華大學出版社2003 [8] 龐麗華.《操作系統(tǒng)原理》(第四版).北京.華中科技大學出版社 2002 設計過程中質疑(或答辯)記載: 1.銀行家算法的主要思想是什么? 答:一個進程進入系統(tǒng)時分配資源之前,判斷系統(tǒng)是否是安全的,即看它所請求的資源是否大于它的最大需求量,若正常,則判斷該進程所需剩余剩余量(包括本次申請)是否超出系統(tǒng)所掌握的剩余資源量,若不超出,則分配,否則等待。 2.銀行家算法的主要問題是什么? 答:要求每個進程必須事先知道資源的最大需求量,而且,在系統(tǒng)運行過程中,考查每個進程對各類資源的申請需花費較多的時間。 3.在銀行家算法中各個資源存在什么關系? 答:該進程所需要的資源數NEED[m][n]=MAX[m][n](該進程所需要的最多的資源數)-----ALLOCATION[m][n](該進程所占有的資源數) 指導教師評語: 簽名: ****年**月**日第二篇:銀行家算法《操作系統(tǒng)》課程設計報告
第三篇:操作系統(tǒng)銀行家算法實驗報告
第四篇:操作系統(tǒng)課程設計(銀行家算法的模擬實現)
第五篇:操作系統(tǒng)課程設計編程序模擬銀行家算法