实验报告
班级: 计算机B191 学号2019537130 姓名: 陈力源 日期: 5月22日
⒈ 实验题目
死锁避免实验。
2.实验要求
编写一段程序模拟银行家算法
3. 实验目的
多个进程动态地共享系统的资源时可能会产生死锁现象。银行家算法是通过对资源的分配进行动态地检查来达到避免死锁的目的。本实验通过模拟银行家算法的应用,使读者了解银行家算法的执行过程。从而进一步理解死锁产生的条件和避免死锁问题产生的方法。
⒋ 实验原理分析
⑴死锁的产生必须同时满足4个条件:
● 互斥条件,即一个资源每次只能由一个进程占用。
● 请求与保持条件,即一进程请求资源不能满足时,它必须等待,同时它仍保持已得到的所有其它资源。
● 不可剥夺条件,任何一个进程不能抢占另一个进程已经获得且未释放的资源。
● 环路等待条件,系统进入死锁的状态时,进程和资源之间形成一个封闭的环路。
⑵银行家算法是一种具有代表性的避免死锁的算法。银行家算法为资源分配定义了两种状态,安全状态和不安全状态。
● 安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。处于安全状态的系统一定没有死锁发生。
● 不安全状态:当系统中不存在一个安全序列时系统处于不安全状态。不安全状态下一定导致死锁发生。
5.实验代码清单
#include "stdafx.h"
#include "stdio.h"
struct PC
{
int max;//最大需求数
int allocation;//已分配
int need;//需求
int request;//请求资源
}P[5];
struct safe
{
bool finsh;//完成标志
int work;//工作向量
}Psf[5];
int total=20;//总资源数
int available=total;//可分配资源数
int availableSafe=total;//安全检查可分配资源拷贝
int requestSafe=0;
int flag=0;
void init()//初始化函数
{
FILE *fp;
fp=fopen("D:\\dlock.txt","r");
for(int i=0;i<5;i++)
{
fscanf(fp,"%d",&P[i].max,1);
fscanf(fp,"%d",&P[i].allocation,1);
P[i].need=P[i].max-P[i].allocation;
available=available-P[i].allocation;
Psf[i].finsh=0;
}
fclose(fp);
}
void safeCheck()//安全性检查
{
int sfrank[5]={0},a=0,j=0;
availableSafe=available;
while(j!=5)
{
for(int i=0;i<5;i++)
{
Psf[i].work=availableSafe;
if(Psf[i].finsh==0&&P[i].need<=Psf[i].work)
{
Psf[i].finsh=1;
availableSafe=availableSafe+P[i].allocation;
sfrank[a++]=i+1;
break;
}
}
j++;
}
for(int i=0;i<5;i++)
{
if(Psf[i].finsh==0)
{
printf("不能满足该请求,系统可能出现死锁\n");
flag=1;//判断是否安全
break;
}
}
if(flag==0)
{
printf("存在安全序列:");
for(int i=0;i<5;i++)
{
printf("%d ",sfrank[i]);
}
printf("\n");
}
for(int f=0;f<5;f++)//finish清零
{
Psf[f].finsh=0;
}
}
void bankAlgorithm(int i)//银行家算法
{
if(P[i].request<=P[i].need)
{
if(P[i].request<=available)
{
//预分配
P[i].allocation=P[i].allocation+P[i].request;
P[i].need=P[i].need-P[i].request;
available=available-P[i].request;
safeCheck();
if(flag==1)
{
P[i].allocation=P[i].allocation-P[i].request;
P[i].need=P[i].need+P[i].request;
available=available+P[i].request;
}
}
else
{
printf("系统资源不足\n");
}
}
else
{
printf("请求资源过剩\n");
}
}
void prin()//显示当前系统资源分配情况
{
printf(" 最大需求 已分配资源数 仍需要 系统剩余资源\n");
printf("P1: %d %d %d %d\n",P[0].max,P[0].allocation,P[0].need,available);
printf("P2: %d %d %d %d\n",P[1].max,P[1].allocation,P[1].need,available);
printf("P3: %d %d %d %d\n",P[2].max,P[2].allocation,P[2].need,available);
printf("P4: %d %d %d %d\n",P[3].max,P[3].allocation,P[3].need,available);
printf("P5: %d %d %d %d\n",P[4].max,P[4].allocation,P[4].need,available);
}
int main(int argc, char* argv[])
{
int i;
init();//初始化
while(1)
{
flag=0;//安全标志位清零
prin();
printf("请输入发起请求的作业号\n");
scanf("%d",&i);
if(i>5||i<0)
{
printf("非法输入");
}
else
{
printf("请输入请求资源数\n");
scanf("%d",&P[i-1].request);
} bankAlgorithm(i-1);
}
return 0;
}
当请求大于所需资源时
当请求大于剩余资源时
系统安全时
可能出现死锁时