操作系统——银行家算法(Banker's Algorithm)
之前写过一篇关于死锁和银行家算法的详细描述的博客https://www.cnblogs.com/wkfvawl/p/11598647.html
写这篇博客的目的,主要是详细讲解一下银行家算法以及代码的实现
Dijkstra在1965年提出的银行家算法是著名的死锁避免算法,这个用于一个银行家给多个顾客贷款的算法可以直接用于操作系统给进程分配资源,这时只要把银行家换成操作系统,把顾客换成进程,把资金换成资源,把银行家决定是否放贷时所用的判断过程(即判断顾客是否有信誉和偿还能力)换成操作系统决定是否分配资源时所用的判断过程(即判断进程是否能及时归还资源)即可。为了描述银行家算法,下面先介绍一下系统的安全状态的概念。
一、安全序列

注意:
(1)系统在某一时刻的安全状态可能不唯一,但这不影响对系统安全性的判断。
(2)安全状态是非死锁状态,而不安全状态并不一定是死锁状态。即系统处于安全状态一定可以避免死锁,而系统处于不安全状态则仅仅可能进入死锁状态。

二、银行家算法
银行家算法的实质就是要设法保证系统动态分配资源后不进入不安全状态,以避免可能产生的死锁。即没当进程提出资源请求且系统的资源能够满足该请求时,系统将判断满足此次资源请求后系统状态是否安全,如果判断结果为安全,则给该进程分配资源,否则不分配资源,申请资源的进程将阻塞。
银行家算法的执行有个前提条件,即要求进程预先提出自己的最大资源请求,并假设系统拥有固定的资源总量。下面介绍银行家算法所用的主要的数据结构。



三、具体实例
假定操作系统中的4个进程P1、P2、P3、P4和3类资源R1、R2、R3(资源数量分别为9、3、6),在t0时刻的资源分配情况如表2-1:







四、测试代码
#include<iostream>
using namespace std;
// p 进程数,r资源种类
int p ;
int r ;
int maxs[10][10]; //最大需求矩阵
int allocation[10][10]; //分配矩阵
int need[10][10]; //需求矩阵
int available[10]; //可用资源向量
int request[10]; //请求向量当前进程对各类资源的申请量,算法的入口参数
//输入函数
void infInput()
{
int i,j;
cout<<"请输入最大需求矩阵max\n";
for(i=0; i<p; i++)
{
for(j=0; j<r; j++)
{
cin>>maxs[i][j];
}
}
cout<<"请输入分配矩阵allocation\n";
for(i=0; i<p; i++)
{
for(j=0; j<r; j++)
{
cin>>allocation[i][j];
}
}
cout<<"请输入需求矩阵need\n";
for(i=0; i<p; i++)
{
for(j=0; j<r; j++)
{
cin>>need[i][j];
}
}
cout<<"请输入可用资源向量available\n";
for(i=0; i<r; i++)
{
cin>>available[i];
}
} //比较函数
//比较进程为m中的元素全大于n中的元素返回1,否则返回0
int compare(int m[],int n[])
{
int i;
for(i=0; i<r; i++)
{
if(m[i]<n[i])
{
return 0;
}
}
return 1;
} //安全性检验函数,检测是否存在安全序列
int stest()
{
int i,j,k,l,flag=0;
int finish[p];
int work[r];
for(i=0; i<p; i++)
{
finish[i]=0;
//vis为1即表示available满足第i进程的资源需要
}
for(i=0; i<r; i++)
{
work[i]=available[i];
}
cout<<"分配序列:\n";
cout<<" allocation need avilable"<<endl;
for(k=0; k<p; k++)
{
for(i=0; i<p; i++)
{
if(finish[i]==1)
{
continue;
}
else
{
if(compare(work,need[i]))//available>=need
{
finish[i]=1;
cout<<'\n'<<"进程"<<i+1<<'\t';
flag=1;
for (j =0; j<r; j++)
{
printf(" %2d ", allocation[i][j]);
}
cout<<" ";
for (j = 0; j < r; j++)
{
printf(" %2d ", need[i][j]);
}
cout<<" ";
for (j = 0; j <r; j++)
{
printf(" %2d ", work[j] +allocation[i][j]);
}
for(l=0; l<r; l++)
{
work[l]=work[l]+allocation[i][l];
//进程完成,释放资源
}
break;
}
}
if(flag==1)
{
break;
}
}
}
cout<<'\n';
for(l=0; l<p; l++)
{
if(finish[l]==0)
{
return 0;//不存在安全序列
}
}
return 1;//存在安全序列
} //申请进程后的安全性检验函数 void rtest(int n)
{
int j;
//n=n-1;
if(compare(available,request)&&compare(need[n-1],request))//available>=request 并且 need >=request
{
for(j=0; j<r; j++)
{
allocation[n-1][j]=allocation[n-1][j]+request[j];
need[n-1][j]=need[n-1][j]-request[j];
available[j]=available[j]-request[j];
}
if(stest())
{
cout<<"允许"<<n<<"进程申请资源!\n";
}
else
{
cout<<"不允许"<<n<<"进程申请资源!\n";
for(j=0; j<r; j++)
{
allocation[n-1][j]=allocation[n-1][j]-request[j];
need[n-1][j]=need[n-1][j]+request[j];
available[j]=available[j]+request[j];
}
}
}
else
{
cout<<"申请资源量越界!\n";
}
} int main()
{
int i,n; //n-第n个资源申请
cout<<"请输入进程数:";
cin>>p;
cout<<"请输入资源种类数:";
cin>>r;
//默认状态4、3
infInput();//输入函数
if(stest()==1)
{
cout<<"存在安全序列,初始状态安全。\n";
}
else
{
cout<<"不存在安全序列,初始状态不安全。\n";
}
cout<<"请输入发出请求向量request的进程编号:";
cin>>n;
cout<<"请输入请求向量request\n";
for(i=0; i<r; i++)
{
cin>>request[i];
}
rtest(n);
return 0;
}
/*
4
3
3 2 2
6 1 3
3 1 4
4 2 2
1 0 0
5 1 1
2 1 1
0 0 2
2 2 2
1 0 2
1 0 3
4 2 0
1 1 2
*/

操作系统——银行家算法(Banker's Algorithm)的更多相关文章
- C语言实现 操作系统 银行家算法
/**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin. 可能存在多类资 ...
- Round() 四舍五入 js银行家算法(转)
首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825; ...
- Round() 四舍五入 js银行家算法
首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825; ...
- 操作系统,银行家算法模拟实现(Windows 环境 C++)
计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ...
- 【操作系统】银行家算法实现(C语言)
[操作系统]银行家算法实现(C语言) 注意:本人编码水平很菜.算是自己的一个总结.可能会有我还没有发现的bug.如果有人发现后可以指出,不胜感激. 1.银行家算法: 我们可以把操作系统看作是银行家,操 ...
- 多任务-python实现-死锁,银行家算法(2.1.5)
@ 目录 1.死锁 2.避免死锁的方式-银行家算法 1.死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系 ...
- C程序模拟实现银行家算法
C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...
- 银行家算法java实现
关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来. 由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统资 ...
- python模拟银行家算法
前言: 大二第一学期学习了操作系统,期末实验课题要求模拟算法.遂根据自己学习的python写下此文.以此锻炼自己编码能力.虽说是重复造轮子,但还是自己的思路体现 代码及注释如下(银行家算法不再赘述): ...
随机推荐
- 9i oracle数据库迁移到11G(exp)
这个是之前生产上打算迁移的文档,后面离职了没有在停机迁移,但是测试过几次没有问题,其中需要把9I的110,120库迁移到11g一个数据库中,但是110,120库之间有相同的表名字,以及有DBLINK. ...
- (三)Kinect姿势识别
Kinect给我们内置了许多姿势如举手等,具体可参考枚举KinectGestures.Gestures,也可以通过Kinect姿势管理器,自定义姿势导入(坑较多,内置的基本够用了)也可以根据关节坐标自 ...
- fenby C语言 P10
if判断语句; if(a<0)→if(条件) if(){C语言语句} #include <stdio.h> int main() { int a=10; if(a>0) { p ...
- 设计模式C++描述----03.工厂(Factory)模式
工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一. 简单工厂模式 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要 ...
- node留言板
这是一个nodejs + mongodb 的小项目,对数据库的增删改查 1. 引入项目依赖 "art-template": "^4.13.2", "b ...
- C语言I博客作业07
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-1/homework/9931 我在这个课程的目标 ...
- JavaSE常用API
1.Math.round(11.5)等于多少?Math.round(-11.5)又等于多少? Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11.四舍五 ...
- Android开发中常用的设计模式
首先需要说明的是,这篇博文灵感来自于 http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121547.html ,在这里,博主已经很 ...
- 揭秘——TCP的三次握手和四次挥手
1.前言 本文以博主在某次前端面试中被问到"什么是TCP协议中的三次握手和四次挥手?"为契机,经过整理教材.百度百科以及他人博客,再结合博主自身的理解,尽可能的以通俗易懂的语言来解 ...
- p1594(巨坑题!!!)
护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是一条单行道,所以任何车辆都不能超车.桥能承受一个给定的最大承载量.为了控制桥上的交通,桥两边各站一个指挥员.护卫车队被分成几个组, ...