实验四
【实验题目】:预防进程死锁的银行家算法
【实验目的】
通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
【实验内容及要求】
算法思路:
银行家算法(Bankers Algorithm)是一个避免死锁(Deadlock)的著名算法,由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金。
问题描述:
设计程序模拟预防进程死锁的银行家算法的工作过程。假设有系统中有n个进程P1, … ,Pn,有m类可分配的资源R1, … ,Rm,在T0时刻,进程Pi分配到的j类资源为Allocationij个,它还需要j类资源Need ij个,系统目前剩余j类资源Workj个,现采用银行家算法进行进程资源分配预防死锁的发生。
程序要求如下:
1)判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程Pk会提出请求Request(R1, … ,Rm),判断分配给P k进程请求的资源之后。
3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);
4)输出:如果安全输出安全的进程序列,不安全提示信息。
【流程图】
【实验结果】
核心代码:
判断当前状态是否安全:
银行家算法:
实验结果截图:
【源代码】
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
#define MaxNum 20
typedef struct{
char ID;//进程程名
int Max[MaxNum];//进程所需所有资源
int Allocation[MaxNum];//进程已分配资源
int Need[MaxNum];//进程还需要资源
int Available[MaxNum];////系统可分配资源
}PRO;
static PRO pro[MaxNum]; //进程结构体
static int n;//行,进程数
static int m;//列,资源数
static int Request[MaxNum];//指定执行进程所需资源
static int SafeOrder[MaxNum];//安全执行顺序
void Enter();//初始化,输入进程已分配资源、仍需资源、系统可分配资源,计算出进程所需最大资源
bool Safe();//判断当前是否安全
void banker();//银行家算法
void display();//显示结果
int main(){
Enter();
Safe();
banker();
return 0;
}
//初始化,输入进程已分配资源、仍需资源、系统可分配资源,计算出进程所需最大资源
void Enter(){
int i,j;
cout<<"请输入进程数: ";
cin>>n;
cout<<"请输入资源数: ";
cin>>m;
//初始化进程名
for (i=0;i<m;i++){
pro[i].ID=i+65;
}
cout<<"请输入Available: ";
for (i=0;i<m;i++){
cin>>pro[0].Available[i];
}
cout<<"请输入Allocation: "<<endl;
for (i=0;i<n;i++){
for (j=0;j<m;j++){
cin>>pro[i