计算机操作系统实验二银行家算法Word文档下载推荐.doc

上传人:b****2 文档编号:13320416 上传时间:2022-10-09 格式:DOC 页数:6 大小:118KB
下载 相关 举报
计算机操作系统实验二银行家算法Word文档下载推荐.doc_第1页
第1页 / 共6页
计算机操作系统实验二银行家算法Word文档下载推荐.doc_第2页
第2页 / 共6页
计算机操作系统实验二银行家算法Word文档下载推荐.doc_第3页
第3页 / 共6页
计算机操作系统实验二银行家算法Word文档下载推荐.doc_第4页
第4页 / 共6页
计算机操作系统实验二银行家算法Word文档下载推荐.doc_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

计算机操作系统实验二银行家算法Word文档下载推荐.doc

《计算机操作系统实验二银行家算法Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《计算机操作系统实验二银行家算法Word文档下载推荐.doc(6页珍藏版)》请在冰豆网上搜索。

计算机操作系统实验二银行家算法Word文档下载推荐.doc

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{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1