银行家算法防止死锁-银行家算法 第2页
前i 个申请共计占用的资源,进程当前已经运行到的位置等信息。
模拟分配的程序部分,采用循环队列对各进程进行调度。
3、物理设计
全局变量的结构定义如下:
bool avoid;
struct info//进程信息
{
long tot,n;//最大占用资源, 申请次数
long list[16];// 申请资源列表
long pre[16];// 已占用资源数
long p;// 已分配状况的指针
}pro[4];
long LeftRes;
程序的结构定义如下:
int main()//主函数
{
init(); 751com.cn
allot();
}
void init()//函数功能:输入和初始化
void allot()//函数功能:模拟资源分配过程
allot()使用以下函数模拟分配过程:
bool require(long x)//函数功能:尝试分配资源给进程x
bool safe(long x)//函数功能:检查分配是否安全
可以处理3 种资源的程序全局变量结构如下:
//共有 3 种资源,3 个进程
bool avoid;
struct info//进程信息
{
long tot[4];//最大占用资源数
long p[4];// 已经占有的资源数
}pro[5];
long LeftRes[4];//剩余资源数
long qu[4];
四、测试结果
对于一组会导致死锁的数据,分别选择采用和不采用避免算法
结果如下:
Avoid deadlock?(Y/N)Y
Please input the resourse-require lists of these 3 processes, one lists in a line:
2 3 4
2 3 3
3 1
=================================================================
Process1 : 2 3 4 (Sum=9)
Process2 : 2 3 3 (Sum=8)
Process3 : 3 1 (Sum=4)
=================================================================
Process1 require 2 unit(s) resourse......Success! LeftResourse=8
Process2 require 2 unit(s) resourse......Success! LeftResourse=6
Process3 require 3 unit(s) resourse......Success! LeftResourse=3
Process1 require 3 unit(s) resourse......Denied! Not safe
Process2 require 3 unit(s) resourse......Denied! Not safe
Process3 require 1 unit(s) resourse......Success! LeftResourse=2
Process3 finish. LeftResourse=6
Process1 require 3 unit(s) resourse......Denied! Not safe
Process2 require 3 unit(s) resourse......Success! LeftResourse=3
Process1 require 3 unit(s) resourse......Denied! Not safe
Process2 require 3 unit(s) resourse......Success! LeftResourse=0
Process2 finish. LeftResourse=8
Process1 require 3 unit(s) resourse......Success! LeftResourse=5
Process1 require 4 unit(s) resourse......Success! LeftResourse=1
Process1 finish. LeftResourse=10
Finish 751com.cn
如果不避免死锁:
Avoid deadlock?(Y/N)N
Please input the resourse-require lists of these 3 processes, one lists in a lin
e:
2 3 4
2 3 3
3 1
=================================================================
Process1 : 2 3 4 (Sum=9)
Process2 : 2 3 3 (Sum=8)
Process3 : 3 1 (Sum=4)
=================================================================
Process1 require 2 unit(s) resourse......Success! LeftResourse=8
Process2 require 2 unit(s) resourse......Success! LeftResourse=6
Process3 require 3 unit(s) resourse......Success! LeftResourse=3
Process1 require 3 unit(s) resourse......Success! LeftResourse=0
Process2 require 3 unit(s) resourse......Denied! No enough resourse
Process3 require 1 unit(s) resourse......Denied! No enough resourse
Process1 require 4 unit(s) resourse......Denied! No enough resourse
Already Deadlock
Finish
改进版本(可以使用3 种资源的程序)测试结果如下:
五、系统不足与经验体会
系统不能处理多种不同资源的情况,也缺乏处理大规模数据的能
力。
safe 函数的编写是程序成功的关键,其中利用 Change 标记的思
乡值得仔细体会。
六、附录:源代码(带注释)
//*******************************************************
//* 操作系统实验三 死锁 *
//* 实验学院一班(0436101) 张元竞(6040310110) *
//* 2006-10-15 *
//******************************************************/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
//共有 3 种资源,3 个进程
bool avoid;
struct info//进程信息 {
long tot[4];//最大占用资源数
long p[4];// 已经占有的资源数
}pro[5];
long LeftRes[4];//剩余资源数
long qu[4];
void init()//函数功能:输入和初始化
{
char tmp[128];
long i,j;
// 以下由用户选择是否采用避免死锁算法
printf("是否采用避免死锁算法?(Y/N)");
gets(tmp);
avoid=(tmp[0]=='Y' || tmp[0]=='y');
//输入各进程的资源信息
printf("请输入各进程的资源信息:\n");
printf("依次输入各进程所需要的最大资源数量:\n");
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
scanf("%ld",&pro[i].tot[j]);
}
}
printf("依次输入各进程已经占据的资源数量:\n");
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
do 751com.cn
{
scanf("%ld",&pro[i].p[j]);
if (pro[i].p[j]>pro[i].tot[j])
printf("\n 占有资源超过了声明的最大资源,请重新输入\n");
}while (pro[i].p[j]>pro[i].tot[j]);
}
}
//初始化资源数量
for (i=1;i<=3;i++)