《操作系统》实验四内容要求YINHANGJIA
【实验题目】:预防进程死锁的银行家算法 【实验学时】: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
#define MAXPROCESS 50 //最大进程数 #define MAXRESOURCE 100 //最大资源数 int AVAILABLE[MAXRESOURCE]; //可用资源数组 int MAX[MAXPROCESS][MAXRESOURCE]; //最大需求矩阵 int ALLOCATION[MAXPROCESS][MAXRESOURCE]; //分配矩阵 int NEED[MAXPROCESS][MAXRESOURCE]; //需求矩阵 int REQUEST[MAXPROCESS][MAXRESOURCE]; //进程需要资源数 bool FINISH[MAXPROCESS]; //系统是否有足够的资源分配 int p[MAXPROCESS]; //记录序列 int m,n; //m个进程,n个资源 void Init(); bool Safe(); void Bank(); void main() {
Init(); Safe(); Bank(); }
void Init() {
int i,j;
cout<<\请输入进程的数目:\ cin>>m;
cout<<\请输入资源的种类:\ cin>>n;
cout<<\请输入每个进程最多所需的各资源数,按照\矩阵输入\ for(i=0;i
cout<<\请输入每个进程已分配的各资源数,也按照\矩阵输入\for(i=0;i cin>>ALLOCATION[i][j]; NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; if(NEED[i][j]<0) { cout<<\您输入的第\个进程所拥有的第\个资源数错误,请重新输入:\ continue; } } } cout<<\请输入各个资源现有的数目:\ for(i=0;i cout<<\请输入要申请资源的进程号(注:第1个进程号为0,依次类推)\ cin>>cusneed; cout<<\请输入进程所请求的各资源的数量\ cin>>REQUEST[cusneed][i]; } for(i=0;i if(REQUEST[cusneed][i]>NEED[cusneed][i]) { cout<<\您输入的请求数超过进程的需求量!请重新输入!\ continue; } if(REQUEST[cusneed][i]>AVAILABLE[i]) { cout<<\您输入的请求数超过系统有的资源数!请重新输入!\ continue; } } for(i=0;i AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; } if(Safe()) { cout<<\同意分配请求!\ } else { cout<<\您的请求被拒绝!\ for(i=0;i AVAILABLE[i]+=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]-=REQUEST[cusneed][i]; NEED[cusneed][i]+=REQUEST[cusneed][i]; } } for(i=0;i cout<<\您还想再次请求分配吗 是请按y/Y,否请按其它键\ cin>>again; if(again=='y'||again=='Y') { continue; } break; } } bool Safe() { int i,j,k,l=0; int Work[MAXRESOURCE]; for(i=0;i for(i=0;i FINISH[i]=false; } for(i=0;i Work[k]+=ALLOCATION[i][k]; } p[l++]=i; i=-1; } else { continue; } } if(l==m) { cout<<\系统是安全的\安全序列:\ for(i=0;i cout<<\ return true; }