操作系统银行家算法 下载本文

内容发布更新时间 : 2024/12/27 5:08:22星期一 下面是文章的全部内容请认真阅读。

[操作系统] 银行家算法操作系统实验报告

实验目标

1. 2. 3. 4.

理解银行家算法。

掌握进程安全性检查的方法及资源分配的方法。 加深了解有关资源申请、避免死锁等概念。 体会和了解死锁和避免死锁的具体实施方法。

实验要求

编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。

设计思路 1.银行家算法

在避免死锁的方法中,如果施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

基本思想为:在分配资源之前,判断系统是否是安全的;若安全,才分配。它是最具代表性的死锁算法,具体算法如下表示:

假设进程P提出请求Request[i],则银行家算法按如下步骤进行判断: 1) 如果Request[i] <=Need[i],则转向2);否则出错。 2) 如果Request[i] <=Available[i],则转向3);否则出错。 3) 系统试探分配相关资源,修改相关数据:

Available[i]=Available[i]-Request[i]; Allocation[i]=Allocation[i]+Request[i]; Need[i]=Need[i]-Request[i]; 4) 系统执行安全性检查,如安全,则分配成立;否则试探性分配资源作废,系统恢复原状,

进程进入等待状态。

根据以上银行家算法步骤,可得出如下图所示流程图:

可编辑word,供参考版!

2.安全性检查算法

安全性检查算法主要是根据银行家算法进行资源分配后,检查资源分配后的系统状态是否处于安全状态之中。具体算法如下所示:

1) 设置两个工作向量Work=Available,Finish=false; 2) 从进程集合中找到一个满足下述条件的进程;

Finish=false; Need<=work;

如果能够找到该进程,则执行3),否则,执行4);

3) 假设上述找到的进程获得资源,可顺利执行,直至完成,从而释放资源。

Work=Work+Allocation; Finish=true; Goto 2);

可编辑word,供参考版!

4) 如果所有进程的Finish=true,则表示该系统安全,否则系统不安全,请求被拒。 5) 根据以上安全检查算法步骤,可得出如下图所示流程图:

主要数据结构

#include

////////////////////////////////////////////////////////////////////////// //全局变量定义

int Available[100]; //可利用资源数组 int Max[50][100]; //最大需求矩阵 int Allocation[50][100]; //分配矩阵 int Need[50][100]; //需求矩阵

int Request[50][100]; //M个进程还需要N类资源的资源量 int Finish[50]; int p[50];

int m,n; //M个进程,N类资源

主要代码结构

/////////////////////////////////////////////////////////////////////////

可编辑word,供参考版!

//安全性算法

int Safe() { int i,j,l=0;

int Work[100]; //可利用资源数组 for (i=0;iWork[j]) break; } if (j==n) { Finish[i]=1; for(int k=0;k

}

cout<<\系统是安全的\cout<<\系统安全序列是:\\n\for (i=0;i

cout<<'\\n'; return 1;

可编辑word,供参考版!

}

///////////////////////////////////////////////////////////////////////////////// //银行家算法 int main() { int i,j,mi; cout<<\输入进程的数目:\\n\ cin>>m;

cout<<\输入资源的种类:\\n\cin>>n;

cout<<\输入每个进程最多所需的各类资源数,按照\矩阵输入\\n\for (i=0;i>Max[i][j];

cout<<\输入每个进程已经分配的各类资源数,按照\矩阵输入\\n\ for (i=0;i>Allocation[i][j]; Need[i][j]=Max[i][j]-Allocation[i][j]; if (Need[i][j]<0) { cout<<\你输入的第\个进程所拥有的第\个资源错误,请重新输入:\\n\ j--; continue; } } } cout<<\请输入各个资源现有的数目:\\n\ for (i=0;i>Available[i]; Safe(); while (1) { cout<<\输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\\n\ cin>>mi; cout<<\输入进程所请求的各个资源的数量\\n\ for (i=0;iNeed[mi][i]) {

可编辑word,供参考版!