當前位置:編程學習大全網 - 編程語言 - 銀行家算法實驗

銀行家算法實驗

P1進程提出的請求,可以分配。

P2進程不能分配,因為請求的B類資源超過了它的最大值。

如果要程序的話,給妳這個:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAXSIZE 50

void main()

{

unsigned int Available[MAXSIZE]; //可利用資源向量

unsigned int Max[MAXSIZE][MAXSIZE]; //最大需求矩陣

unsigned int Allocation[MAXSIZE][MAXSIZE]; //已分配矩陣

unsigned int Need[MAXSIZE][MAXSIZE]; //需求矩陣

unsigned int Request[MAXSIZE]; //請求向量

unsigned int Work[MAXSIZE]; //工作向量

bool Finish[MAXSIZE]; //是否有足夠資源分配給進程,使之運行完成

unsigned int SafeSequence[MAXSIZE]; //安全序列

int i,j;

int p; //請求資源的進程的下標

int temp = 0; //安全序列下標

int total = 0;

int N;

int M;

printf("請輸入進程數N=");

scanf("%d",&N);

printf("請輸入資源種類數M=");

scanf("%d",&M);

//用戶輸入數據,初始化Available數組

printf("初始化可用資源數組:\n");

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

{

printf("\t%c類資源:",65+i);

scanf("%d",&Available[i]);

}

//用戶輸入數據,初始化Max數組

printf("初始化最大需求數組:\n");

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

{

printf("\tP%d進程最大需要\n",i);

for(j=0; j<M; j++)

{

printf("\t\t%c類資源:",65+j);

scanf("%d",&Max[i][j]);

}

}

//用戶輸入數據,初始化Allocation數組

printf("初始化已分配資源數組:\n");

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

{

printf("\tP%d進程已分配\n",i);

for(j=0; j<M; j++)

{

printf("\t\t%c類資源:",65+j);

scanf("%d",&Allocation[i][j]);

}

}

//初始化Need數組

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

for(j=0; j<M; j++)

{

Need[i][j] = Max[i][j] - Allocation[i][j];

}

//進程發出資源請求後檢查

do

{

printf("資源請求:\n");

printf("\t輸入請求資源的進程下標:");

scanf("%d",&p);

printf("\t進程P%d請求\n",p);

//初始化請求向量

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

{

printf("\t\t%c類資源:",65+i);

scanf("%d",&Request[i]);

}

for(i=0; i<M; i++) //檢查Request <= Need ?

if(Request[i] > Need[p][i])

{

printf("\t請求的%c類資源數超過它所宣布的最大值!\n",65+i);

break;

}

if(i == M) //通過上層檢查,繼續檢查Request <= Available ?

{

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

if(Request[i] > Available[i])

{

printf("\t尚無足夠%c類資源,P%d須等待!\n",65+i,p);

break;

}

}

if(i == M) //嘗試分配

{

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

{

Available[i] -= Request[i];

Allocation[p][i] += Request[i];

Need[p][i] -= Request[i];

}

}

}while(i<M);

//初始化Work,Finish向量

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

{

Work[i] = Available[i];

}

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

{

Finish[i] = false;

}

//安全性算法

do

{

total = temp;

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

{

if(Finish[i] == false)

{

for(j=0; j<M; j++)

if(Need[i][j] > Work[j])

{

break;

}

if(j == M) //各類資源都滿足Need <= Work

{

for(j=0; j<M; j++)

{

Work[j] += Allocation[i][j]; //釋放資源

}

Finish[i] = true;

SafeSequence[temp++] = i; //加入安全序列

}

}

}

}while(total != temp); //所有進程檢查壹遍之後,如果安全序列有變化,則進行下壹輪

//否則說明所有的Finish都為true,或者因沒有安全序列退出循環

if(temp == N)

{

printf("安全序列:");

for(temp=0; temp<N; temp++)

{

printf("P%d ",SafeSequence[temp]);

}

}

else

{

printf("系統處於不安全狀態!不能分配!\n");

}

getchar();

getchar();

}

這個程序還行,就是輸入有點麻煩,我自己編寫的是用文件輸入系統描述信息的,但是缺少說明,怕妳搞不明白。

  • 上一篇:函數的概念與性質知識點
  • 下一篇:廣西有哪些大學
  • copyright 2024編程學習大全網