第一篇:銀行家算法_實驗報告
課程設計報告
課程設計名稱 共享資源分配與銀行家算法
系(部)
專業班級
姓
名
學
號
指導教師
年 月 日
、目
錄
一、課程設計目的和意義...................................................................................3
二、方案設計及開發過程..............................................................................................3
1.課題設計背景.................................................................................................................3 2.算法描述
............................................................................................................................3 3.數據結構
............................................................................................................................4 4.主要函數說明.................................................................................................................4 5.算法流程圖......................................................................................................................5
三、調試記錄與分析
四、運行結果及說明
..............................................................................................6
1.執行結果.........................................................................................................................6 2.結果分析.........................................................................................................................7
五、課程設計總結...................................................................................................8
、一、程設計目的和意義
計算機科學與技術專業學生學習完《計算機操作系統》課程后,進行的一次全面的綜合訓練,其目的在于加深催操作系統基礎理論和基本知識的理解,加強學生的動手能力.銀行家算法是避免死鎖的一種重要方法。通過編寫一個模擬動態資源分配的銀行家算法程序,進一步深入理解死鎖、產生死鎖的必要條件、安全狀態等重要概念,并掌握避免死鎖的具體實施方法
二、方案設計及開發過程
1.課題設計背景
銀行家算法又稱“資源分配拒絕”法,其基本思想是,系統中的所有進程放入進程集合,在安全狀態下系統受到進程的請求后試探性的把資源分配給他,現在系統將剩下的資源和進程集合中其他進程還需要的資源數做比較,找出剩余資源能滿足最大需求量的進程,從而保證進程運行完成后還回全部資源。這時系統將該進程從進程集合中將其清除。此時系統中的資源就更多了。反復執行上面的步驟,最后檢查進程的集合為空時就表明本次申請可行,系統處于安全狀態,可以實施本次分配,否則,只要進程集合非空,系統便處于不安全狀態,本次不能分配給他。請進程等待
2.算法描述
1)如果Request[i] 是進程Pi的請求向量,如果Request[i,j]=K,表示進程Pi需要K個Rj類型的資源。當Pi發出資源請求后,系統按下述步驟進行檢查: 如果Requesti[j]<= Need[i,j],便轉向步驟2;否則認為出錯,因為它所需要的資源數已超過它所宣布的最大值。
2)如果Requesti[j]<=Available[j],便轉向步驟3,否則,表示尚無足夠資源,進程Pi須等待。
3)系統試探著把資源分配給進程Pi,并修改下面數據結構中的數值: Available[j]:=Available[j]-Requesti[j];Allocation[i,j]:=Allocation[i,j]+Requesti[j];Need[i,j]:=Need[i,j]-Requesti[j];
、4)系統執行安全性算法,檢查此次資源分配后,系統是否處于安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則,將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程pi等待。
3.數據結構
1.可利用資源向量AVAILABLE。這是一個含有M個元素的數組,其中的每一個元素代表一類可利用的資源數目,其3初始值是系統中所配置的該類全部可哦那個資源的數目,其數值隨該類資源的分配和回收而動態的改變。
2.最大需求矩陣MAX。這是一個M*N的矩陣,它定義了系統中N個進程中的每一個進程對M類資源的最大需求。
3.分配矩陣ALLOCATION。這也是一個M*N的矩陣,它定義了系統中每一類資源當前已分配給每一進程的資源數。
4.需求矩陣NEED。這也是一個M*N的矩陣,用以表示每一個進程尚需的各類資源數。5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]
4.主要函數說明
主要的常量變量
#define W 10 //最大進程數W=10 #define R 20 //最大資源總數R=20 int AVAILABLE[R];//可利用資源向量 int MAX[W][R];//最大需求矩陣 int ALLOCATION[W][R];//分配矩陣 int NEED[W][R];//需求矩陣 int Request[R];//進程請求向量
void changdata(int k);//進程請求資源數據改變 int chksec(int s);//系統安全性的檢測
主要模塊
void inputdata()void showdata()void changdata(int k)void restoredata(int k)int chksec(int s)int chkmax(int s)
、5.算法流程圖
三、調試記錄與分析
調試通過,程序未出錯
、四、運行結果及說明
1.執行結果
、2.結果分析
銀行家算法就是當接收到一個系統資源的分配后找到一個安全序列,使得進程間不會發生死鎖,若發生死鎖則讓進程等待。
、五、課程設計總結
通過本次銀行家算法實驗,加深了我對銀行家算法的了解,掌握了如何利用銀行家算法避免死鎖。實驗中遇到點問題,通過查閱資料、詢問老師順利解決。通過這次的實踐,使我的理論知識更加的牢固。
附錄
程序源碼:
#include
void changdata(int k);//進程請求資源數據改變 void restoredata(int k);//數據恢復 int chksec(int s);//系統安全性的檢測 int chkmax(int s);//檢測最大需求
void bank();//檢測分配的資源是否合理
int main(){ int i,j;inputdata();//安全性算法 for(i=0;i
、cout<<“錯誤提示:經安全性檢查發現,系統的初始狀態不安全!!n”< { int i=0,j=0,p;cout<<“請輸入總進程數:”< 、for(j=0;j do{ cin>>ALLOCATION[i][j]; if(ALLOCATION[i][j]>MAX[i][j]) cout< }while(ALLOCATION[i][j]>MAX[i][j]);} } cout< NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for(j=0;j AVAILABLE[j]=0;} } } void showdata()//銀行家算法 { int i,j;cout<<“各種資源的總數量,即向量all_resource為:”< cout< 、cout< cout< 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 restoredata(int k)//數據恢復 { int j;for(j=0;j ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j];} } int chksec(int s)//系統安全性的檢測 { int WORK,FINISH[W];int i,j,k=0;for(i=0;i FINISH[i]=FALSE;for(j=0;j WORK=AVAILABLE[j]; 、i=s;do { if(FINISH[i]==FALSE&&NEED[i][j]<=WORK) { WORK=WORK+ALLOCATION[i][j]; FINISH[i]=TRUE; i=0; }else { i++; } }while(i if(FINISH[i]==FALSE) { return 1; } } return 0;} int chkmax(int s)//檢測最大需求 { int j,flag=0;for(j=0;j if(MAX[s][j]==ALLOCATION[s][j]) { flag=1; AVAILABLE[j]=AVAILABLE[j]+MAX[s][j]; MAX[s][j]=0; } } return flag;} void bank(){ int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){ i=-1;while(i<0||i>=M){ cout<<“請輸入需申請資源的進程號(從P0到P”< cin>>i;if(i<0||i>=M) 、cout<<“輸入的進程號不存在,重新輸入!”< cin>>Request[j];if(Request[j]>NEED[i][j]) { cout<<“進程P”< cout<<“申請不合理,出錯!請重新選擇!”< flag='N'; break; } else { if(Request[j]>AVAILABLE[j]) { cout<<“進程P”< cout<<“申請不合理,出錯!請重新選擇!”< flag='N'; break; } } } if(flag=='Y'||flag=='y'){ changdata(i); if(chksec(i)) { cout< cout<<“該分配會導致系統不安全!!本次資源申請不成功,不予分配!!”< cout< restoredata(i); } else { cout< cout<<“經安全性檢查,系統安全,本次分配成功,且資源分配狀況如下所示:”< cout< showdata(); if(chkmax(i)) {cout<<“在資源分配成功之后,由于該進程所需的某些資源的最大需求量已經滿足,”< cout<<“因此在進程結束后系統將回收這些資源!”< showdata(); 、} } } cout< 計算機操作系統實驗報告 何美西109253030212 一、實驗名稱:銀行家算法 二、實驗目的:銀行家算法是避免死鎖的一種重要方法,通過編寫一個簡單的銀行家算法程序,加深了解有關資源申請、避免死鎖等概念,并體會和了解死鎖和避免死鎖的具體實施方法。 三、問題分析與設計: 1、算法思路:先對用戶提出的請求進行合法性檢查,即檢查請求是否大于需要的,是否大于可利用的。若請求合法,則進行預分配,對分配后的狀態調用安全性算法進行檢查。若安全,則分配;若不安全,則拒絕申請,恢復到原來的狀態,拒絕申請。 2、銀行家算法步驟:(1)如果Requesti<or =Need,則轉向步驟(2);否則,認為出錯,因為它所需要的資源數已超過它所宣布的最大值。 (2)如果Request<or=Available,則轉向步驟(3);否則,表示系統中尚無足夠的資源,進程必須等待。 (3)系統試探把要求的資源分配給進程Pi,并修改下面數據結構中的數值: Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系統執行安全性算法,檢查此次資源分配后,系統是否處于安全狀態。 3、安全性算法步驟: (1)設置兩個向量 ①工作向量Work。它表示系統可提供進程繼續運行所需要的各類資源數目,執行安全算法開始時,Work=Allocation;②布爾向量Finish。它表示系統是否有足夠的資源分配給進程,使之運行完成,開始時先做Finish[i]=false,當有足夠資源分配給進程時,令Finish[i]=true。 (2)從進程集合中找到一個能滿足下述條件的進程: ①Finish[i]=false ②Need (3)當進程P獲得資源后,可順利執行,直至完成,并釋放出分配給它的資源,故應執行: Work=Work+Allocation;Finish[i]=true;轉向步驟(2)。(4)如果所有進程的Finish[i]=true,則表示系統處于安全狀態;否則,系統處于不安全狀態。 4、流程圖: 系統主要過程流程圖 銀行家算法流程圖 安全性算法流程圖 四、實驗代碼: #include int Allocation[100][100]={0};//系統已分配資源 int Need[100][100]={0};//還需要資源 int Request[100]={0};//請求資源向量 int temp[100]={0};//存放安全序列 int Work[100]={0};//存放系統可提供資源 int p[100]={0};int q[100][100]={0};int z[100][100]={0};int M=100;//作業的最大數為100 int N=100;//資源的最大數為100 int gg=1;void showdata()//顯示資源矩陣 { int i,j;cout< int changdata(int i)//進行資源分配 { int j;for(j=0;j for(i=0;i cout< }//變分配數 Finish[i]=True;temp[k]=i;cout<<“ ”;cout<<“true”<<“ ”;cout< for(i=0;i Allocation[i][j]=Allocation[i][j]-Request[j];; Need[i][j]=Need[i][j]+Request[j]; } cout< return 0;} } cout< cout<<“安全序列為:”;for(i=0;i cout< { cout< { //出錯 cout< int main()//主函數 { int t=1,i,j,number,choice,m,n,flag;char ming;cout<<“*****************銀行家算法的設計與實現*****************”< showdata();//顯示各種資源 safe();//用銀行家算法判定系統是否安全 while(1){ if(t==1){ cout< t=0;} else break;cout< } return 1;} 五、程序執行結果: cin>>t;cout< 六、實驗總結 多個進程同時運行時,系統根據各類系統資源的最大需求和各類系統的剩余資源為進程安排安全序列,使得系統能快速且安全地運行進程,不至發生死鎖。銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來學習借鑒。 09信管(2)班 何美西 109253030212 計算機操作系統實驗報告 一、實驗名稱:銀行家算法 二、實驗目的:銀行家算法是避免死鎖的一種重要方法,通過編寫一個簡單的銀行家算法程序,加深了解有關資源申請、避免死鎖等概念,并體會和了解死鎖和避免死鎖的具體實施方法。 三、問題分析與設計: 1、算法思路:先對用戶提出的請求進行合法性檢查,即檢查請求是否大于需要的,是否大于可利用的。若請求合法,則進行預分配,對分配后的狀態調用安全性算法進行檢查。若安全,則分配;若不安全,則拒絕申請,恢復到原來的狀態,拒絕申請。 2、銀行家算法步驟:(1)如果Requesti<or =Need,則轉向步驟(2);否則,認為出錯,因為它所需要的資源數已超過它所宣布的最大值。 (2)如果Request<or=Available,則轉向步驟(3);否則,表示系統中尚無足夠的資源,進程必須等待。 (3)系統試探把要求的資源分配給進程Pi,并修改下面數據結構中的數值: Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系統執行安全性算法,檢查此次資源分配后,系統是否處于安全狀態。 3、安全性算法步驟: (1)設置兩個向量 ①工作向量Work。它表示系統可提供進程繼續運行所需要的各類資源數目,執行安全算法開始時,Work=Allocation;②布爾向量Finish。它表示系統是否有足夠的資源分配給進程,使之運行完成,開始時先做Finish[i]=false,當有足夠資源分配給進程時,令Finish[i]=true。 (2)從進程集合中找到一個能滿足下述條件的進程: ①Finish[i]=false ②Need (3)當進程P獲得資源后,可順利執行,直至完成,并釋放出分配給它的資源,故應執行: Work=Work+Allocation;Finish[i]=true;轉向步驟(2)。 (4)如果所有進程的Finish[i]=true,則表示系統處于安全狀態;否則,系統處于不安全狀態。 4、流程圖: 系統主要過程流程圖 銀行家算法流程圖 安全性算法流程圖 四、實驗代碼: //#define M 5 //#define N 3 #include void line()//美化程序,使程序運行時更加明朗美觀 { printf(“-----------------n”);} void start()//表示銀行家算法開始 { line();printf(“ 銀行家算法開始n”);printf(“--死鎖避免方法 line();} void end()//表示銀行家算法結束 { line();printf(” 銀行家算法結束,謝謝使用n“);line();} void input()//輸入銀行家算法起始各項數據 { for(n=0;n<5;n++) { printf(”請輸入進程P%d的相關信息:n“,n); printf(”Max:“); for(m=0;m<1;m++) scanf(”%d“,&max[n][m]); printf(”Allocation:“); for(m=0;m<1;m++) scanf(”%d“,&allocation[n][m]); n”); } for(m=0;m<1;m++) need[n][m]=max[n][m]-allocation[n][m];printf(“請輸入系統可利用資源數Available:”);for(m=0;m<1;m++) } void output()//輸出系統現有資源情況 { line();printf(“資源情況 Max Allocation Need Availablen”);printf(“進程 A A A A n”);line();for(n=0;n<5;n++){ printf(“P%d%3d%3d%3d”,n,max[n][0],allocation[n][0],need[n][0]); } line();} void change()//當Request[i,j]<=Available[j]時,系統把資源分配給進程P[i],Available[j]和Need[i,j]發生改變 { for(m=0;m<1;m++){ if(n==0)else printf(“n”); printf(“%3d%3dn”,available[0]);scanf(“%d”,&available[m]); } } available[m]-=request[i][m];allocation[i][m]+=request[i][m];need[i][m]-=request[i][m];void outputsafe()//輸出安全序列的資源分配表 { printf(“該安全序列的資源分配圖如下:n”);line();printf(“資源情況 Work Need Allocation Work+Allocation Finishn”);printf(“進程 A A A A n”);line();for(n=0;n<5;n++) printf(“P%d%9d%3d%3d%5d%12sn”,safe[n],works[safe[n]][0],need[safe[n]][0],allocation[safe[n]][0],works[safe[n]][0]+allocation[safe[n]][0],finish[n]);line();} int check()//安全性算法 { printf(“開始執行安全性算法……n”);for(m=0;m<1;m++)//數組work和finish初始化 work[m]=available[m];for(n=0;n<5;n++){ } finish[n]=“false”;safe[n]=0;k=0;for(m=0;m<5;m++)for(n=0;n<5;n++) if(strcmp(finish[n],“false”)==0 && need[n][0]<=work[0])//查找可以分配資源但尚未分配到資源的進程 { safe[k]=n;//以數組safe[k]記下各個進程得到 分配的資源的順序 works[safe[k]][0]=work[0]; 放出分配給它的資源 work[0]+=allocation[n][0];//進程執行后釋 finish[n]=“ture”;//finish[n]變為1以示該進 程完成本次分 } k++;for(m=0;m<5;m++)//判斷是否所有進程分配資源完成{ 0 素都為ture } else if(m==4)//此處m=4表示所有數組finish的所有元if(strcmp(finish[m],“false”)==0){ printf(“找不到安全序列,系統處于不安全狀態。n”);return 0;//找不到安全序列,結束check函數,返回 { printf(“找到安全序列P%d->P%d->P%d->P%d->P%d,系統是安全的n”,safe[0],safe[1],safe[2],safe[3],safe[4]); } return 1;} void main()//主程序開始 { start();for(;j==0;)//確認輸入數據的正確性,若輸入錯誤,重新輸入 { 入:“); } printf(”數據確認無誤,算法繼續。n“);if(check()==0)//若check函數返回值為0,表示輸入的初始數據找不到安全序列,無法進行下一步,程序結束 { } for(;j==1;)//當有多個進程請求資源時,循環開始 { printf(”請輸入請求資源的進程i(0、1、2、3、4):“);//輸入發出請求向量的進程及請求向量 end();exit(0);input();printf(”以下為進程資源情況,請確認其是否正確:n“);output();printf(”數據是否無誤:n正確:輸入1n錯誤:輸入0n請輸 } j=1; outputsafe();//輸出安全序列的資源分配表 scanf(“%d”,&j); scanf(“%d”,&i);printf(“請輸入進程P%d的請求向量Request%d:”,i,i);for(n=0;n<1;n++) scanf(“%d”,&request[i][n]); for(;request[i][0]>need[i][0];)//若請求向量大于需求資源,則認為是輸入錯誤,要求重新輸入 { printf(“數據輸入有誤,請重試!n請輸入進程P%d的請求向量Request%d:”,i,i); 提供分配 n“,i); } if(request[i][0]<=available[0])//判斷系統是否有足夠資源 for(n=0;n<1;n++) scanf(”%d“,&request[i][n]);{ } else printf(”系統沒有足夠的資源,進程P%d需要等待。printf(“系統正在為進程P%d分配資源……n”,i);change();//分配資源 j=0;if(j==0)//j=0表示系統有足夠資源分配的情況 { printf(“當前系統資源情況如下:n”);//輸出分配資源后的系統資源分配情況 分配無效 output(); if(check()==0)//若找不到安全系列,則之前的資源 { printf(“本次資源分配作廢,恢復原來的資源分配 狀態。n”); 資源狀態 輸入:“); for(m=0;m<1;m++)//恢復分配資源前的系統 } } { } output();//輸出系統資源狀態 available[m]+=request[i][m];allocation[i][m]-=request[i][m];need[i][m]+=request[i][m];printf(”是否還有進程請求資源?n是:輸入1n否:輸入0n請 scanf(“%d”,&j);//若還有進程請求資源,j=1,之前的for循環條件滿足 } end();} 五、程序執行結果: 六、實驗總結 多個進程同時運行時,系統根據各類系統資源的最大需求和各類系統的剩余資源為進程安排安全序列,使得系統能快速且安全地運行進程,不至發生死鎖。銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來學習借鑒。 實驗四 死鎖 一、實驗目的 當系統的總資源數m小于或等于所有進程對對資源的最大需求時,就可能產生 死鎖。死鎖會引起計算機系統的癱瘓。銀行家算法是在實現資源分配時避免死鎖的一個著名算法,該算法是在能確保系統處于安全狀態時才把資源分配給申請者。通過本實驗使學生能進一步理解死鎖的概念,并能選擇一個算法來避免死鎖。 二、實驗題目 系統中有m個同類資源被n個進程共享,每個進程對資源的最大需求數分別為S1, S2,…,Sn,且 Max(Si)<=m,(i=1,2,…n)。進程可以動態地申請資源和釋放資源。編寫一個程序,現銀行家算法,當系統將資源分配給某一進程而不會死鎖時,就分配之。否則,推遲分配,并顯示適當的信息。 三、數據結構 主要數據結構: 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<<“需要繼續實驗嗎?(y-繼續 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=”< 六、執行結果: 七、實驗總結 通過本次實驗了解到用銀行家算法來預防死鎖是可靠的,但也是非常保守的,因為它限制了進程對資源的存取,從而降低了進程的并發運行程度。死鎖檢測并不限制進程對資源的申請,只要有,就分配,但這也可能造成死鎖。但由于死鎖并不是經常發生的,故大大提高了系統運行的效率。 總之,通過本實驗,使我進一步加深理解和掌握銀行家算法。 實驗三 銀行家算法 (1)死鎖產生的原因和必要條件是什么? 原因: a)系統資源不足; b)進程運行推進的順序不合適; c)資源分配不當。 如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪戰、有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。 必要條件: a)互斥條件:一個資源每次只能被一個進程使用; b)請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放; c)不剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪; d)循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。 (2)銀行家算法中的安全性檢查時,Work[j]+Allocation[i,j]的含義是什么? work[j]表示當前系統可用的第j類資源,Allocation[i][j]表示當前已經分配給進程i使用的第j類資源數量。Work[j]= Work[j]+ Allocation[i,j]這句的意思是目前進程已經利用手上資源完成相關工作了,這些已分配的資源可以重新歸還系統了,所以系統可用的第j類資源work[j]就增加了,增加量就是當前進程想要歸還的資源量Allocation[i][j]。 (3)為什么銀行家算法能有效避免死鎖的發生?算法的主要思想是什么? 操作系統按照銀行家制定的規則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執行中繼續申請資源時,先測試該進程本次申請的資源數是否超過了該資源所剩余的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。 銀行家算法的基本思想是分配資源之前,判斷系統是否是安全的;若是,才分配。 (4)補全Bank()和Safe()函數; void Bank()//銀行家算法 { int q;bool flag = true;printf(“請輸入請求的進程向量n”);scanf(“%d”,&q);printf(“請輸入%d個資源的請求資源數n”,n);for(int i=0;i int Safe()//安全性算法 { //返回1表示安全,返回0表示不安全 int tp=1;int i;int Work[20];int tmp=0,t=0;for(i=0;i for(i=0;i for(i=0;i (5)給出程序運行截圖。第二篇:銀行家算法實驗報告
第三篇:銀行家算法實驗報告
第四篇:操作系統銀行家算法實驗報告
第五篇:銀行家算法實驗報告