计算机操作系统实验二银行家算法Word文档下载推荐.doc
《计算机操作系统实验二银行家算法Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《计算机操作系统实验二银行家算法Word文档下载推荐.doc(6页珍藏版)》请在冰豆网上搜索。
2:
进程间推进顺序非法。
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
最有代表性的避免死锁的算法,是Dijkstra的银行家算法。
这是由于该算法能用与银行系统现金贷款的发放而得名的。
算
法
描
述
步
骤
1.算法描述:
设Request[i]是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源,当Pi发出资源请求后,系统按下面步骤进行检查:
(1)如果Requesti[j]<
=Need[i,j],便转向步骤2;
否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Requesti[j]<
=Available[j],便转向步骤3;
否则,表示尚无足够资源,Pi须等待。
(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j]:
=Available[j]-Requesti[j];
Allocation[i,j]:
=Allocation[i,j]+Requesti[j];
Need[i,j]:
=Need[i,j]-Requesti[j];
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;
否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
2.数据结构
银行家算法中的数据结构:
(1)可利用资源向量Available。
这是一个含有n个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
如果Available[j]=K,则表示系统中现有Rj类资源K个。
(2)最大需求矩阵Max。
这是一个m*n的矩阵,它定义了系统中n个进程中每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
(3)分配矩阵Allocation。
这也是一个m*n的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
(4)需求矩阵Need。
这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
(5)工作数组Work.。
这是一个含有n个元素的数组,它代表可以提供分配的资源数,初始值是Available中的数值,随着资源的回收,它的值也会改变,公式是Work[i]=Work[i]+Allocation[i]。
3.算法流程图
程序初始化
随机分配资源
并显示在屏幕
检查安全序列
是否要申请资源
退出程序
输入Request
Request<
Need
Available
Need[i][j]=Need[i][j]-Request[j]
Available[j]=Available[j]-Request[j]
报错
保留原始Available、Request
恢复原始
Available、Request
判Allocation=Max
Available[j]=Max[i][j]+work[j]
Finish[i]=1
输出结果
调
试
过
程
结
果
实验结果为:
附
录
#include<
stdio.h>
stdlib.h>
conio.h>
#definem50
intno1;
//进程数
intno2;
//资源数
intr;
intallocation[m][m],need[m][m],available[m],max[m][m];
charname1[m],name2[m];
//定义全局变量
voidmain()
{
voidcheck();
voidprint();
inti,j,p=0,q=0;
charc;
intrequest[m],allocation1[m][m],need1[m][m],available1[m];
printf("
**********************************************\n"
);
*银行家算法的设计与实现*\n"
printf("
请输入进程总数:
\n"
scanf("
%d"
&
no1);
请输入资源种类数:
no2);
请输入Max矩阵:
for(i=0;
i<
no1;
i++)
for(j=0;
j<
no2;
j++)
scanf("
max[i][j]);
//输入已知进程最大资源需求量
请输入Allocation矩阵:
allocation[i][j]);
//输入已知的进程已分配的资源数
need[i][j]=max[i][j]-allocation[i][j];
//根据输入的两个数组计算出need矩阵的值
请输入Available矩阵\n"
scanf("
available[i]);
//输入已知的可用资源数
print();
//输出已知条件
check();
//检测T0时刻已知条件的安全状态
if(r==1)//如果安全则执行以下代码
{
do{
q=0;
p=0;
printf("
\n请输入请求资源的进程号(0~4):
for(j=0;
=10;
{
scanf("
i);
if(i>
=no1)
{
printf("
输入错误,请重新输入:
continue;
}
elsebreak;
}
printf("
\n请输入该进程所请求的资源数request[j]:
request[j]);
if(request[j]>
need[i][j])p=1;
//判断请求是否超过该进程所需要的资源数
if(p)
请求资源超过该进程资源需求量,请求失败!
else
for(j=0;
if(request[j]>
available[j])
q=1;
if(q)
printf("
没有做够的资源分配,请求失败!
else//请求满足条件
{
for(j=0;
j++)
{
available1[j]=available[j];
allocation1[i][j]=allocation[i][j];
need1[i][j]=need[i][j];
//保存原已分配的资源数,仍需要的资源数和可用的资源数
available[j]=available[j]-request[j];
allocation[i][j]+=request[j];
need[i][j]=need[i][j]-request[j];
//系统尝试把资源分配给请求的进程
}
print();
check();
//检测分配后的安全性
if(r==0)//如果分配后系统不安全
for(j=0;
{
available[j]=available1[j];
allocation[i][j]=allocation1[i][j];
need[i][j]=need1[i][j];
//还原已分配的资源数,仍需要的资源数和可用的资源数
}
printf("
返回分配前资源数\n"
print();
}
}printf("
\n你还要继续分配吗?
YorN?
//判断是否继续进行资源分配
c=getche();
}while(c=='
y'
||c=='
Y'
}
}
voidcheck()//安全算法函数
intk,f,v=0,i,j;
intwork[m],a[m];
boolfinish[m];
r=1;
finish[i]=false;
//初始化进程均没得到足够资源数并完成
work[i]=available[i];
//work[i]表示可提供进程继续运行的各类资源数
k=no1;
do{