银行家算法课程设计(附源代码)

网友投稿 1018 2022-05-29

死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验提供了一个系统动态分配资源的简单模拟程序,用于了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生。

一、实验要求

设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。

系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;

二、银行家算法

Request i 是进程Pi 的请求向量。Request i(j)=k表示进程Pi请求分配Rj类资源k个。当Pi发出资源请求后,系统按下述步骤进行检查:

1.如果Request i≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。

2.如果Request i≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。

3.系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值:

Available = Available - Request i

Allocation i= Allocation i+ Request i

Need i= Need i - Request i

4.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。如果安全才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

三、安全性算法

1.设置两个向量。

Work:它表示系统可提供给进程继续运行的各类资源数目,它包含m个元素,开始执行安全性算法时,Work = Available。

Finish:它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish(i)=false;当有足够资源分配给进程Pi时,令Finish(i)=true;

2.从进程集合中找到一个能满足下述条件的进程。

Finish(i)= = false;

Need i ≤work;

如找到则执行步骤3;否则,执行步骤4;

3.当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行

Work = work + Allocation i

Finish(i)=true;转向步骤2;

4.若所有进程的Finish(i)都为true,则表示系统处于安全状态;否则,系统处于不安全状态。

假定系统有5个进程(p0,p1,p2,p3,p4)和三类资源(A,B,C),各种资源的数量分别为10,5,7,在T0时刻的资源分配情况如下图:

银行家算法课程设计(附源代码)

问题:

1.T0时刻系统是否安全?如果安全,给出安全序列。

安全。安全序列为:

2.如果某时刻T1,P1请求资源:Request1(1,0,2),系统是否分配?为什么?

分配。因为Request1(1,0,2)≤Need1(1,2,2),而且Request1(1,0,2)≤Available(3,3,2)

安全序列为{P1,P3,P4,P2,P0}

3.P1请求处理完毕后,如果某时刻T2, P4请求资源: Request4(3,3,0),系统是否分配?为什么?

不分配。因为 Request4(3,3,0)≤Need4(4,3,1); Request4(3,3,0)>Available(2,3,0),让P4等待。

4.打开“Microsoft Visual C++ 6.0”,输入相关代码,同时在源程序同一目录下新建“input1.txt”文件,根据代码要求,正确输入T0时刻的系统状态,并对程序行进编译运行。根据提示将前述的三个问题的相关数据依次输入,然后运行:

input1.text的内容如下:

运行结果:

5.输出的结果与你所写的一致否?如果不一致,理解之后,修改你的结果,给出“input1.txt”的内容。 一致。

#include #include #include using namespace std; typedef struct Max{ int m_a; int m_b; int m_c; }Max; typedef struct Allocation{ int a_a; int a_b; int a_c; }Allocation; typedef struct Need{ int n_a; int n_b; int n_c; }Need; struct Available{ int av_a; int av_b; int av_c; }q; struct pr{ char name; Max max; Allocation allocation; Need need; int finishflag; }p[5]; char na[5]; void init(){ cout<<"各进程还需要的资源数NEED: "<=p[i].need.n_a&&q.av_b>=p[i].need.n_b&&q.av_c>=p[i].need.n_c){ q.av_a+=p[i].allocation.a_a; q.av_b+=p[i].allocation.a_b; q.av_c+=p[i].allocation.a_c; p[i].finishflag=1; finishcnt++; na[k++]=p[i].name; break; } } count++; if(count>5){ return 0; } } return 1; } int shq(){ int m=0,i=0,j=0,k=0; cout<<"请输入进程号和请求资源的数目!"<>m>>i>>j>>k; if(i<=p[m].need.n_a&&j<=p[m].need.n_b&&k<=p[m].need.n_c){ if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c){ p[m].allocation.a_a+=i; p[m].allocation.a_b+=j; p[m].allocation.a_c+=k; p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a; p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b; p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c; cout<<"各进程还需要的资源数NEED:"<<'\n'; for(int w=0;w<5;w++){ cout<Available让进程"<Available让进程"<"<

思古之圣贤,与我同为丈夫,彼何以百世可师,我何以一身瓦裂。

任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Go 语言入门很简单--技巧和窍门(Tips and Tricks)
下一篇:【前端】HTML
相关文章