模拟银行家算法
一.课程设计目的
经过一个学习《操作系统》课程的学习,掌握了许多书本上的知识,但是对书上的概
念并没有真正意义的了解。这次课程设计的目的,掌握银行家算法的数据结构,了解算法的
执行过程,加深对银行家算法的理解。通过编写和调试一个系统动态分配资源的简单模拟程
序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
二.实验内容
(1) 模拟一个银行家算法;
(2) 算法所需要的数据结构;
(3) 初始化时让系统拥有一定的资源;
(4) 用键盘输入的方式申请资源;
(5) 如果预分配后,系统处于安全状态,则修改系统的资源分配情况;
(6) 如果预分配后,系统处于不安全状态,则提示不能满足请求,
此次课程设计的主要内容时模拟实现动态资源分配。同时要求编写和调试一个系统
动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避
免死锁的发生。
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加
深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程占用;第二个为等
待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其
他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四
个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前
一个进程所持有的资源。防止死锁的机构只能确保上述四个条件之一不出现,则系统就不
会发生死锁。通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
三.实验原理分析
1. 银行家算法中的数据结构
(1)可利用资源向量 Available,这是一个含有 m 各元素的数组,其中的每个元素代表一
类可利用资源的数目,其初始值是系统中所配置的该类全部可利用资源的数目,其数值随该
类资源的分配和回收而动态改变。如果 Available[j] = K,则表示系统中现有 Rj 类资源 K
个。
(2)最大需求矩阵 Max,这是一个 n×m 的矩阵,它定义了系统中 n 个进程中的每一个进程
对 m 类资源的最大需求。如果 Max[i, j] = K, 则表示进程 i 需要 Rj 类资源的最大数目为 K。
(3)分配矩阵 Allocation。这也是一个 n×m 的矩阵,它定义了系统中每一类资源当前已
分配给每一进程的资源数。如果 Allocation[i, j] = K, 则表示进程 i 当前已经分得 Rj
类资源的数目为 K。
(4)需求矩阵 Need。这也是一个 n×m 的矩阵,用以表示每个进程尚需要的各类资源数。
如果 Need[i, j]=K,则表示进程 i 还需要 Rj 类资源 K 个,方能完成其任务。
上述三个矩阵间存在一下关系:
Need[i, j]= Max[i - j] - Allocation[i, j]
2. 银行家算法
设 Requesti 是进程 Pi 的请求向量,如果 Requesti[j] = K,表示进程 Pi 需要
K 个 Ri 类型的资源。当 Pi 发出资源请求后,系统按下述步骤进行检查:
(1)如果 Requesti[j] <= Need[i, j],便转向步骤 2;否则认为出错,因为它所需的资源
数已经超过了它所宣布的最大值。
(2)如果 Requesti[j] <= Available[j],便转向步骤 3;否则表示尚无足够资源,Pi 需
等待。
(3)系统试探着把资源分配给进程 Pi,并修改下面数据结构中的数值。
Available[j] = Available-Requesti[j];
Allocation[i, j] = Allocation[i, j] + Requesti[j];
Need[i, j] = Need[i, j] - Request[j];
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正
式将资源分配给进程 Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来资源
的分配状态,让进程 Pi 等待。
3. 安全性算法
系统所执行的安全性算法可描述如下:
(1)设置两个向量;1. 工作向量 Work;它表示系统可提供给进程继续运行所需要的各类
资源的数目,它含有 m 个元素,在执行安全性算法开始时,work = Availalbe;2. Finish:
它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做 Finish[i] = false;
当有足够资源分配给进程时,再令 Finish[i] = true;
(2)从进程集合中找到一个能满足下述条件的进程:
1. Finish[i] == false;2. Need[i, j] <= Work[j];若找到,执行步骤
(3),否则,执行步骤(4)
(3)当进程 Pi 获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j] = Work[j] + Allocation[i, j];
Finish[i] = true;
go to step (2);
(4)如果所有进程的 Finish[i]
处于不安全状态。
== true 都满足,则表示系统处于安全状态,否则系统
//各种资源可利用的数量
数据结构分析
本程序所使用的主体数据结构如下:
定义全局变量
const int x=50,y=100; //定义常量,便于修改
int Available[x];
int Allocation[y][y]; //各进程当前已分配的资源数量
int Max[y][y]; //各进程对各类资源的最大需求数
int Need[y][y]; //还需求矩阵
int Request[x]; //申请各类资源的数量
int Work[x]; //工作向量,表系统可提供给进程运行所需各类资源数量
int Finish[y]; //表系统是否有足够的资源分配给进程,0 为否,1 为是
int p[y]; //存储安全序列
int i,j;
//全局变量,主要用于循环语句中
int n,m; //n 为进程的数量,m 为资源种类数
int l=0,counter=0;
函数声明
int shuzi(int sz); //数字判断函数,还可使用 void shuzi(int& sz); 方式
void chushihua(); //系统初始化函数
void safe();
void bank();
void showdata();
void sign();
主函数结构
int main(){
system("color 06f"); //设置当前窗口的背景色和前景色
//安全性算法函数
//银行家算法函数
//函数 showdata,输出当前资源分配情况
//签名函数
cout<<…… //显示程序开始提示信息
chushihua(); //初始化函数调用
cout<
>"<<"进程"<<"("<//各进程对各类资源的最大需求数
//存储安全序列
//定义常量,便于修改
//各种资源可利用的数量
//各进程当前已分配的资源数量
实验过程:
方法一
#include
#include
#include
#include
#include
//===定义全局变量===
const int x=50,y=100;
int Available[x];
int Allocation[y][y];
int Max[y][y];
int Need[y][y]; //还需求矩阵
int Request[x]; //申请各类资源的数量
int Work[x]; //工作向量,表示系统可提供给进程继续运行所需的各类资源数量
int Finish[y]; //表示系统是否有足够的资源分配给进程,0 为否,非 0 为是
int p[y];
int i,j;
int n,m; //n 为进程的数量,m 为资源种类数
int l=0,counter=0;
//函数声明
int shuzi(int sz);
void chushihua();
void safe();
void bank();
void showdata();
void sign();
//===数字判断函数===
int shuzi(int sz){
//系统初始化函数
//安全性算法函数
//银行家算法函数
//函数 showdata,输出当前资源分配情况
//签名函数
//数字判断函数 或者使用 void shuzi(int& sz); 方式
//输入数据并判断是否为数字
//临时指针,存放输入字符
char *temp;
temp=new char;
int len; //存储取字符的长度
sz=0 ; //清零
char s; //
do{
//输入赌注,只能输入数字
// gets(temp);
//getline(cin,temp)
cin>>temp;
len=strlen(temp);
for(int i=0;i'9'){
cout<<"输错了! 你输入的是数字吗?! \n\n";
cout<<"请重新输入:";
break;
}
}
}while(s<'0' || s>'9');
for(int i=0;i
for (j=0; j=Allocation[i][j])
//
Need[i][j] = Max[i][j]-Allocation[i][j]; //计算还需求量
else
Need[i][j]=0;//最大需求量小于已分配量时还需求量为 0,即此类资源已足够不需再
申请
}
cout<=Array[j].value){
int t;
t=Array[j].value;
Array[i].value=t;
t=Array[j].num;
}
Array[j].value=Array[i].value;
Array[j].num=Array[i].num;
Array[i].num=t;
else continue;
}
DWORD m_delay=3000;
Sleep(m_delay);
/*for(i=0;i
cout<<'\n'<<"找到一个安全序列:"<<"P"<";
for(i=0;i";
}
cout<<'\n'<<"已通过安全性测试!"<