银行家算法课程设计报告Word文件下载.docx
《银行家算法课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《银行家算法课程设计报告Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
所谓安全状态,是指系统能按某种顺序为每个进程分配所需资源,直到最大需求,使每一个进程都可以顺利完成,即可找到一个安全资源分配序列。
模拟实现这个工作过程。
三设计思路
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
四详细设计
1、初始化
由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
2、银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;
若是,才分配。
设进程cusneed提出请求REQUEST[i],则银行家算法按如下规则进行判断。
(1)如果REQUEST[cusneed][i]<
=NEED[cusneed][i],则转
(2);
否则,出错。
(2)如果REQUEST[cusneed][i]<
=AVAILABLE[cusneed][i],则转(3);
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
(4)系统执行安全性检查,如安全,则分配成立;
否则试探险性分配作废,系统恢复原状,进程等待。
(5)对于某一进程i,若对所有的j,有NEED[i][j]=0,则表此进程资源分配完毕,应将占用资源释放。
3、安全性检查算法
(1)设置两个工作向量Work=AVAILABLE;
FINISH
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<
=Work;
如找到,执行(3);
否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;
Finish=true;
GOTO2
(4)如所有的进程Finish=true,则表示安全;
否则系统不安全。
4、流程图
四源程序:
#include<
iostream>
>
.6秒后跳入主界面"
<
<
endl;
Sleep(6000);
system("
cls"
);
cout<
"
"
cout<
运行界面"
请输入进程的数目:
cin>
m;
请输入资源的种类:
n;
请输入每个进程最多所需的各资源数,按照"
m<
x"
n<
矩阵输入"
for(i=0;
i<
i++)
for(j=0;
j<
j++)
MAX[i][j];
请输入每个进程已分配的各资源数,也按照"
{
ALLOCATION[i][j];
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
if(NEED[i][j]<
0)
您输入的第"
i+1<
个进程所拥有的第"
j+1<
个资源数错误,请重新输入:
j--;
continue;
}
j++)//已分配各资源总数
for(i=0;
NEEDc[j]=ALLOCATION[i][j]+NEEDc[j];
//for(i=0;
i++)//此四行用于检验
//{
//cout<
NEEDc[i]<
;
//}
请输入各个资源现有的数目:
AVAILABLE[i];
i++)//总资源数
SUMMIT[i]=AVAILABLE[i]+NEEDc[i];
//for(i=0;
i++)//检验用
//cout<
SUMMIT[i]<
//cout<
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
初始化后状态显示:
每个进程最多所需的各资源数"
{for(j=0;
cout<
MAX[i][j]<
if(j=n-1)
cout<
}
每个进程已分配的各资源数"
ALLOCATION[i][j]<
各个资源现有的数目:
AVAILABLE[i]<
voidBank()/*银行家算法*/
{
inti,j,cusneed;
charagain;
intsum=0;
/*监测某一进程资源是否分配完毕*/
intadd=0;
while
(1)
请输入要申请资源的进程号(注:
第1个进程号为0,依次类推)"
cusneed;
请输入进程所请求的各资源的数量"
REQUEST[cusneed][i];
if(REQUEST[cusneed][i]>
NEED[cusneed][i])
您输入的本个请求数超过进程的需求量!
请重新输入!
i--;
continue;
AVAILABLE[i])
您输入的本个请求数超过系统有的资源数!
i++)//资源分配
if(Safe())
同意分配请求!
此次分配后状态显示:
当前每个进程最多尚需的各资源数"
{for(j=0;
NEED[i][j]<
}
当前每个进程已分配过的各资源数"
add=NEED[i][j]+add;
//是否已分配完毕
if(add!
=0)
i++)
sum=NEED[cusneed][i]+sum;
sum值:
sum<
//cout<
if(sum==0)
{for(i=0;
AVAILABLE[i]=ALLOCATION[cusneed][i]+AVAILABLE[i];
sum=0;
add=0;
add<
else
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~