?? 湯子瀛銀行家算法.txt
字號:
本程序模擬的是《計算機操作系統》(湯子贏等)課本P97"銀行家算法之例"編寫的
第一部分:銀行家算法(掃描)
1.如果Request<=Need,則轉向2;否則,出錯
2.如果Request<=Available,則轉向3,否則等待
3.系統試探分配請求的資源給進程
4.系統執行安全性算法
第二部分:安全性算法
1.設置兩個向量
(1).工作向量:Work=Available(表示系統可提供給進程繼續運行所需要的各類資源數目)
(2).Finish:表示系統是否有足夠資源分配給進程(True:有;False:沒有).初始化為False
2.若Finish[i]=False&&Need<=Work,則執行3;否則執行4(I為資源類別)
3.進程P獲得第i類資源,則順利執行直至完成!并釋放資源:
Work=Work+Allocation;
Finish[i]=true;
轉2
4. 若所有進程的Finish[i]=true,則表示系統安全;否則,不安全!
程序說明:
一、開發語言:C語言
二、本程序模擬的是課本P97"銀行家算法之例"編寫的。
即系統中有五個進程{0,1,2,3,4}和三類資源{A,B,C},各進程的初始資源分配情況及各資源的總數量均 參照該例子。
三、本程序中共四個函數分別為:zhibiao(),apply(),test(),及主函數main()
其中:
1、zhibiao()的功能為:直觀的列出系統某時刻的資源分配情況。
2、apply()的功能為:進程發出資源請求后,系統試探著把資源分配給該進程并修改數據結構中的數值。
3、test()的功能為:系統的安全性檢測。
四、需要注意的問題:
1、本程序的前提是假設當前只有一個進程請求資源。
2、一旦操作不符合要求會得到意想不到的結果!再按任意鍵可能該程序也不能正常運行,則就關閉該程序, 然后再打開重新運行便可.
五、課本上的例子在這個程序中運行后成功。
例如:P1:Request1(1,0,2)
p4: Request4(3,3,0)
P0:Request0(0,2,0)
再測試P0:Request0(0,1,0) 同課本上的結果相同。
本程序還有很多不足,功能不很完善,只是適合于當前只有一個進程請求資源,且進程和資源都是事先固定好的.
源代碼:
#include "dos.h"
#include "conio.h"
#include "alloc.h"
int available[3]={3,3,2};
int max[6][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int allocation[6][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int need[6][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int live[5]={1,1,1,1,1};
int stay[3][3];
int request[3],process[5];
int i,j,p=5,pro,x,k1;
void zhibiao()
{ x=1;
printf(" Max All Nee Ava\n");
printf("PRO A B C A B C A B C A B C\n");
for(i=0;i<p;i++)
{ if(live[i]==1)
{ printf("P%d ",i);
for(j=0;j<=2;j++)
{printf("%-3d",max[i][j]);}printf(" ");
for(j=0;j<=2;j++)
{printf("%-3d",allocation[i][j]);}printf(" ");
for(j=0;j<=2;j++)
{printf("%-3d",need[i][j]);}printf(" ");
}
if(x==1&&live[i]==1) {printf("%-3d%-3d%-3d",available[0],available[1],available[2]);x=0;}
if(live[i]==1) printf("\n");
}
}
int apply()
{ int v=1;
for(i=0;i<=2;i++)
{if(need[pro][i]<request[i]) {v=0;break;}
if(available[i]<request[i]) {v=0;break;}}
if(v==1){for(i=0;i<=2;i++)
{stay[0][i]=allocation[pro][i];allocation[pro][i]+=request[i];
stay[1][i]=need[pro][i];need[pro][i]-=request[i];
stay[2][i]=available[i];available[i]-=request[i];}
}
return(v);
}
int test()
{ int work[3],finish[5]={0,0,0,0,0},v,k=0,t=0;
for(i=0;i<p;i++)
if(live[i]==0) {finish[i]=1;k1--;}
for(i=0;i<=2;i++) work[i]=available[i];
while(1)
{ for(i=0;i<=4;i++)
{ if(finish[i]==0) { v=1;
for(j=0;j<=2;j++)
if(need[i][j]>work[j]) {v=0;break;}
if(v==1) { finish[i]=1;
for(j=0;j<=2;j++) work[j]+=allocation[i][j];
process[k]=i;k++;
}
}
}
if(t==k) break;
else t=k;
if(k==k1) break;
}
if(k==k1) return(1);
else return(0);
}
main()
{
while(1)
{zhibiao();
k1=5;
printf("該系統中共五個進程{0,1,2,3,4},請輸入其中一個進程:P");
scanf("%d",&pro);
if(pro<0||pro>4) break;
printf("P%d請求的三類資源數(資源數用逗號隔開)分別是:",pro);
scanf("%d,%d,%d",&request[0],&request[1],&request[2]);
if(apply()==0) {printf("出錯或尚無足夠資源,P%d必須等待!\n",pro);
printf("請按任意鍵繼續。");}
else if(test()==0) {printf("系統處于不安全狀態,P%d必須等待!\n",pro);
for(i=0;i<=2;i++)
{ allocation[pro][i]=stay[0][i];
need[pro][i]=stay[1][i];
available[i]=stay[2][i];}
printf("請按任意鍵繼續。");}
else {zhibiao();printf("系統處于安全狀態!\n");
printf("存在一安全序列為:");
for(i=0;i<k1-1;i++)
printf("P%d>",process[i]);
printf("P%d",process[k1-1]);
printf("\n請按任意鍵繼續。");}
if(need[pro][0]==0&&need[pro][1]==0&&need[pro][2]==0)
for(i=0;i<=2;i++)
{available[i]+=max[pro][i];
live[pro]=0;}
getch();
clrscr();
delay(5000);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -