【实验目的】
1.理解银行家算法。
2.掌握进程安全性检查的方法及资源分配的方法。
【实验内容】
编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
例4-1某系统有A、B、C、D4类资源共5个进程(PO、P1、P2、P3、P4)共享,
各进程对资源的需求和分配情况如表4-1所示。
表4-1各进程对资源的需求和分配情况表
进程 | 已占资源 | 最大需求数 | ||||||
A | B | C | D | A | B | C | D | |
P0 | 0 | 0 | 1 | 2 | 0 | 0 | 1 | 2 |
P1 | 1 | 0 | 0 | 0 | 1 | 7 | 5 | 0 |
P2 | 1 | 1 | 5 | 4 | 2 | 3 | 5 | 6 |
P3 | 0 | 6 | 3 | 2 | 0 | 6 | 5 | 2 |
P4 | 0 | 0 | 1 | 1 | 0 | 6 | 5 | 6 |
现在系统中A、B、C、D4类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:
①现在系统是否处于安全状态?
②如果现在进程Pl提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?
【实验步骤】
1.数据结构
int Available[100];//可利用资源数组
int Max[50][100];//最大需求矩阵
int Allocation[50][100];//分配矩阵
int Need[50][100];//需求矩阵
int Request[50][100];
int Finish[50];
int p[50];
int pnum,rnum;//pnum个进程,rnum个资源
int IsSafe()
2.程序流程图
银行家算法:
安全性算法:
3.实验代码
#include <stdio.h>
int Available[100];//可利用资源数组
int Max[50][100];//最大需求矩阵
int Allocation[50][100];//分配矩阵
int Need[50][100];//需求矩阵
int Request[50][100];
int Finish[50];
int p[50];
int pnum,rnum;//pnum个进程,rnum个资源
int IsSafe()
{
int i,j,l = 0;
int Work[100];//可利用资源数组
for(i = 0; i < rnum; i++)
Work[i]=Available[i];
for(i = 0; i < pnum; i++)
Finish[i]=0;
for(i = 0; i < pnum; i++)
{
if(Finish[i] == 1)
continue;
else
{
for(j = 0; j < rnum; j++)
{
if(Need[i][j]>Work[j])
break;
}
if(j == rnum)
{
int k = 0;
Finish[i] = 1;
for(k = 0; k < rnum; k++)
Work[k] += Allocation[i][k];
p[l++] = i;
i = -1;
}
else
continue;
}
if(l == pnum)
{
printf("系统是安全的!\n");
printf("安全序列是:\n");
for(i = 0; i < l; i++)
{
printf("P%d",p[i]);
if(i != l-1)
printf("-->");
}
printf("\n");
return 1;
}
}
}
int main()
{//银行家算法
int i,j,mi;
printf("输入进程的数目:\n");
scanf("%d",&pnum);
printf("输入资源的种类:\n");
scanf("%d",&rnum);
printf("输入每个进程最多所需的各资源数,按照%dx%d矩阵输入:\n",pnum,rnum);
for(i = 0; i < pnum; i++)
{
for(j = 0; j < rnum; j++)
{
scanf("%d",&Max[i][j]);
}
}
printf("输入每个进程已分配的各资源数,也按照%dx%d矩阵输入:\n",pnum,rnum);
for(i = 0; i < pnum; i++)
{
for(j = 0; j < rnum; j++)
{
scanf("%d",&Allocation[i][j]);
Need[i][j] = Max[i][j] - Allocation[i][j];
if(Need[i][j] < 0)
{
printf("你输入的第%d个进程所拥有的第%d个资源数错误,请重新输入:\n",i+1,j+1);
j--;
continue;
}
}
}
printf("请输入各个资源现有的数目:\n");
for(i = 0; i < rnum; i++)
scanf("%d",&Available[i]);
IsSafe();
while(1)
{
printf("输入要申请资源的进程号(注:第1个进程号为0,以此类推):\n");
scanf("%d",&mi);
printf("输入进程所请求的各资源的数量\n");
for(i = 0; i < rnum; i++)
scanf("%d",&Request[mi][i]);
for(i = 0; i < rnum; i++)
{
if(Request[mi][i] > Need[mi][i])
{
printf("你输入的请求数超过进程的需求量!\n");
return 0;
}
if(Request[mi][i] > Available[i])
{
printf("你输入的请求数超过系统有的资源数!\n");
return 0;
}
}
for(i = 0; i < rnum; i++)
{
Available[i] -= Request[mi][i];
Allocation[mi][i] += Request[mi][i];
Need[mi][i] -= Request[mi][i];
}
if(IsSafe() == 1)
printf("同意分配请求!\n");
else
{
printf("你的请求被拒绝!\n");
for(i = 0;i < rnum; i++)
{
Available[i] += Request[mi][i];
Allocation[mi][i] -= Request[mi][i];
Need[mi][i] += Request[mi][i];
}
for(i = 0; i < pnum; i++)
Finish[i] = 0;
char YesOrNo;
printf("你还想再次请求分配吗?是请输入y/Y,否请输入n/N,再确定.\n");
while(1)
{
fflush(stdin);
scanf("%c", &YesOrNo);
if(YesOrNo == 'y' || YesOrNo == 'Y' || YesOrNo == 'n' || YesOrNo == 'N')
break;
else
{
printf("请按要求输入!\n");
continue;
}
}
if(YesOrNo == 'y' || YesOrNo == 'Y')
continue;
else
break;
}
}
return 0;
}