操作系统银行家算法
printf("输入各进程对各类资源的需求量:\n");
for(i=0;i<m;i++)
{
printf("P%d:\n",i);
for(j=0;j<n;j++)
{
scanf("%d",((process->Need)[i]+j));
}
}
}
void Allocation(Process *process,int m,int n)
scanf("%d",&n);
Max(&process,m,n);
Need(&process,m,n);
Allocation(&process,m,n);
Available(&process,n);
Safe(&process,m,n);
while(Bank(&process,m,n));
return 0;
for(i=0;i<m;i++)
(process->Max)[i]=(int *)malloc(sizeof(int)*n);//为每个数组分配n个指针元素
printf("输入各进程对各类资源的最大需求量:\n");
for(i=0;i<m;i++)
{
printf("P%d:\n",i);
for(j=0;j<n;j++)
int flag1=1;//申请量大于需求量时标记为0
int flag2=1;//申请量大于可利用资源量时标记为0
for(j=0;j<n;j++)//检查申请量是否小于等于需求量
if((process->Requst)[i][j]>(process->Need)[i][j])
flag1=0;
if(flag1==0)
for(i=0;i<m;i++)s--;
printf("安全序列为:");
for(i=0;i<m;i++)
printf("P%d ",s[i]);
printf("\n");
free(s);
return 1;
}
}
void Max(Process *process,int m,int n)
{
process->Max=(int **)malloc(sizeof(int *)*m);//分配m个指针,用来指向数组的首地址
(process->Need)[l][j]+=(process->Requst)[l][j];
}
}
}while(flag==0);
if(flag==1)
{
printf("分配成功。\n");
printf("是否继续请求资源分配?输入Y继续,输入y结束:\n");
getchar();
c=getcha4;不允许申请量大于需求量!请重新输入。\n");
return 0;
}
if(flag1==1)
{
for(j=0;j<n;j++)//检查申请量是否小于等于系统中的可利用资源量
if((process->Requst)[i][j]>(process->Available)[j])
flag2=0;
void Max(Process *process,int m,int n);
void Need(Process *process,int m,int n);
void Allocation(Process *process,int m,int n);
void Available(Process *process,int n);
实验内容:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
int i,j,k,l;
int flag;
char c;
typedef struct Banker{
int *Available;//可利用资源向量
int **Max;//最大需求矩阵
(process->Finish)=(int *)malloc(sizeof(int)*m);
for(i=0;i<m;i++)
(process->Finish)[i]=FALSE;
k=m;
int flag1;//当有不符合条件的资源时标记为0
int flag2;//当所有进程不都分配成功时标记为0
int *s=(int *)malloc(sizeof(int)*m);//记录安全序列
flag2=1;
for(i=0;i<m;i++)//判断是否所有进程都完成
{
if((process->Finish)[i]==FALSE)
{
flag2=0;
break;
}
}
if(flag2==0)
{
printf("当前状态不安全!\n");
return 0;
}
else
{
printf("当前状态安全!\n");
洛阳理工学院实验报告
学院
计信学院
班级
学号
姓名
课程名称
操作系统
实验日期
10.17
实验名称
实验二银行家算法
成绩
实验目的:
1.了解进程产生死锁的原因,了解为什么要进行死锁的避免。
2.掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。
实验原理:
n个并发进程共享m个系统资源的系统,进程可动态申请资源和释放资源。系统按各进程的申请动态的分配资源,先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检测算法进行安全性检测,如果系统分配资源,系统进入安全状态,则预分配就是正式分配,如果系统分配资源,系统进入不安全状态,则撤销预分配。
*((process->Allocation)[i]+j)=(*((process->Max)[i]+j))-(*((process->Need)[i]+j));
}
void Available(Process *process,int n)
{
process->Available=(int *)malloc(sizeof(int)*n);
int Requst(Process *process,int m,int n);
int Bank(Process *process,int m,int n)
{
do//资源请求失败或者系统不安全时flag=0,并重新输入。
{
if((flag=Requst(process,m,n))==1)
{
printf("请求并试分配成功。\n");
do
{
for(i=0;i<m;i++)//一轮分配
if((process->Finish)[i]==FALSE)
{
flag1=1;
for(j=0;j<n;j++)
if((process->Need)[i][j]>(process->Work)[j])
flag1=0;//有不符合条件的资源
if(flag1==1)
printf("输入系统可用资源数:\n");
for(i=0;i<n;i++)
scanf("%d",&(process->Available)[i]);
}
int Requst(Process *process,int m,int n)
{
process->Requst=(int **)malloc(sizeof(int *)*m);
for(i=0;i<m;i++)
(process->Requst)[i]=(int *)malloc(sizeof(int)*n);
printf("输入进程名及其资源请求量:\n");
scanf("%d",&i);
l=i;
for(j=0;j<n;j++)
scanf("%d",(process->Requst)[i]+j);
if(flag2==0)
{
printf("不允许申请量大于可利用资源量!请重新输入。\n");
return 0;
}
else return 1;
}
}
int main()
{
Process process;
int m,n;
printf("请输入进程数:");
scanf("%d",&m);
printf("请输入资源种类数:");
}
}
if(flag==1&&(flag=Safe(process,m,n))==0)//系统不安全,撤销资源试分配
{
printf("撤销资源试分配。\n");