死锁避免算法模拟实验——银行家算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
死锁避免算法的模拟实验
——银行家算法
班级:2013级软件工程1班
学号:X X X
姓名:萧氏一郎
数据结构说明:
①可利用资源向量available, n个元素的数组,每个元素代表一类可用资源的数目, available [ i ] = k,表示系统中有Rj 类资源k 个。
②最大需求矩阵MAX, n3 m矩阵定义n 个进程时,m 类资源的最大
需求max ( i, j) = k 表示进程需要Rj类资源最大数目为k 。
③分配矩阵allocation, n3 m矩阵,表示n个进程的每个进程已分配资源情况, alloction ( i, j) = k表示进程i已分配Rj类资源k 个。
④需求矩阵need, n3 m矩阵,表示各进程仍需要各类资源, need ( i, j) = k表示进程i仍需要资源Rj的数目为k.由上述分析可知need i =max i - allocation i。
流程图:
源代码:
#include
int Isprocessallover(); //判断系统中的进程是否全部运行完毕
void Systemstatus(); //显示当前系统中的资源及进程情况
void Allow(int ,int *); //若进程申请不导致死锁,用此函数分配资源
void Forbidenseason(int ); //若发生死锁,则显示原因
int Banker(int ,int *); //银行家算法
int Availiable[5] = { 5,6, 6,5,4}; //初始状态,系统可用资源量
int Max[5][5] = {{1,2,3,2,3},{3,2,2,3,3},{7,0,2,3,3},{2,2,2,2,3},{4,3,3,1,3 }}; //各进程对各资源的最大需求量
int
Allocation[5][5]={{0,1,0,0,1},{2,0,0,1,1},{3,0,2,0,1},{2,1, 1,0,1},{0,0,2,0,1},}; //初始状态,各进程占有资源量
int
Need[5][5]={{1,1,3,2,2},{1,2,2,2,2},{4,0,0,3,2},{0,1,1,2,2} ,{4,3,1,1,2},}; //初始状态时,各进程运行完毕,还需要的资源量
int over[5]={0,0,0,0,0}; //标记对应进程是否得到所有资源并运行完毕
int main()
{
int i,j,k;
int process=0; //发出请求的进程
int decide=0; //银行家算法的返回值
int Request[5]={0,0,0,0,0}; //申请的资源量数组
int sourcenum=0; //申请的各资源量
/*判断系统中进程是否全部运行完毕*/
step1: if(Isprocessallover()==1)
{
puts("系统中全部进程运行完毕!");
return 0;
}
/*显示系统当前状态*/
Systemstatus();
/*人机交互界面*/
step2: printf("输入发出请求的进程(输入“0”退出系统):"); scanf("%d",&process);
if(process == 0)
{
printf("放弃申请,退出系统!");
return 0;
}
if(process<1 || process>5 ||over[process-1]==1)
{
puts("系统无此进程!");
goto step2;
}
puts("此进程申请各资源(A,B,C,D,E)数目: ");
for(i=0;i<5;i++)
{
printf("%c资源:",65+i);
scanf("%d",&sourcenum);
Request[i] = sourcenum;
}
/*用银行家算法判断是否能够进行分配*/
decide=Banker(process,Request);
if (decide==0)
{
/*将此进程申请资源分配给它*/
Allow(process,Request);
goto step1;
}
else
{
/*不能分配,显示原因*/
Forbidenseason(decide);
goto step2;
}
return 0;
}
int Isprocessallover()
{
int i,j;
int processnum=0;
for(i=0;i<6;i++)
{
//判断每个进程是否运行完毕
if(over[i]==1) processnum++;
}
if(processnum == 5) return 1; //系统中全部进程运行完毕
return 0;
}
void Systemstatus()
{
int i,j;
puts("此刻系统中存在的进程:");
for(i=0;i<5;i++)
if(over[i]!=1) printf("P%d ",i+1);
puts("");
puts("此刻系统可利用资源(单位:个):");
puts("A B C D E");
for(i=0;i<5;i++) printf("%d ",Availiable[i]);
puts("");
puts("此刻各进程已占有资源如下(单位:个):");
puts(" A B C D E");
for(i=0;i<5;i++)
{
if(over[i]==1) continue;
printf("P%d ",i+1);
for(j=0;j<5;j++) printf("%d ",Allocation[i][j]);
puts("");
}
puts("各进程运行完毕还需各资源如下(单位:个):"); puts(" A B C D E");
for(i=0;i<6;i++)