一、预备知识
1.死锁的相关知识。
2.银行家算法。
3.系统安全性检查。
二、目的
1.加深了解有关资源申请、避免死锁等概念。
2.体会和了解死锁和避免死锁的具体实施方法。
三、要求
1.理解死锁的概念以及产生死锁的原因。
2.了解检测状态安全性的方法。
3.掌握利用银行家算法避免死锁的做法。
四、实验内容
银行家算法是避免死锁的一种重要方法,本实验要求编写和调试一个简单的银行家算法程序。
1.设计进程对各类资源最大申请表示及初值的确定。
2.设定系统提供资源的初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其资源申请是否得到满足。
5.显示资源申请和分配时的变化情况。
五、思路
1.先找出安全序列
2.后申请资源在找出安全序列
#include#include #include using namespace std; vector all; //资源总数 vector > mx;//所需最大值 vector > allocation;//已分配 vector > need;//还需要 vector available;//剩余资源 int m,n;//进程数,资源种类数; void Max(vector >& mx) { cout << "请输入各进程最多还需要的资源数 按照" << m << "*" << n << "矩阵输入" << endl; for (int i = 0; i < m; i++) { vector b;//每一个进程的还需资源数组 int resource;//还需的资源 for (int j = 0; j < n; j++) { cin >> resource; b.push_back(resource); } mx.push_back(b);//将资源数组放入所需资源素组 } } void Allocation(vector >& allocation) { cout << endl<<"请输入各进程已分配的资源数 按照" << m << "*" << n << "矩阵输入" << endl; for (int i = 0; i < m; i++) { vector b;//每一个进程的还需资源数组 int resource;//还需的资源 for (int j = 0; j < n; j++) { cin >> resource; b.push_back(resource); } allocation.push_back(b);//将资源数组放入所需资源素组 } } void Available(vector &all,vector &available) { cout << endl << "请输入每个资源的总数目 " << endl; int resource; for (int i = 0; i < n; i++) { cin >> resource; all.push_back(resource); } for(int l=0;l mx, vector > allocation,vector >&need) { need.resize(m * n); vector t(n, 0); vector >T(m,t); need = T; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { need[i][j]= mx[i][j]-allocation[i][j]; } } } bool safe(vector &available, vector >& allocation, vector >& need,int id) { vector work = available; vector Finish(m, false); int mark1=0; int mark2=0; int mark3 = 0; int *route=new int[m]; if(id==-1){ while(true){ for(int z=0;z "; } cout< =0 && id =0 &&id "; } cout<<"nn"; return true; } } void request(vector &available,vector > &allocation,vector > &need){ int a; vector Request; int id; cout<<"请输入申请资源的进程号"< >id; while(id<0||id>m){ cout<<"该进程号不合法,请重新输入"< >id; } for(int j=0; j >a; Request.push_back(a); while(Request[j]>need[id][j])///请求资源大于进程所需资源 { cout<<"该资源申请不合理,无法进行分配资源,请重新输入"< >a; Request.push_back(a); } while(Request[j]>available[j])///可利用的资源不够用 { ///请求的该资源类型的数目大于其可用资源数目 cout<<"该资源申请不合理,无法进行分配资源,请重新输入"< >a; Request.push_back(a); } } for(int i=0;i >& mx,vector &available,vector > &allocation,vector > &need){ Max(mx);//输入mx Allocation(allocation);//输入allocation Available(all,available);//输入available Need(mx,allocation,need);//用于计算need } int main() { char fly;//判断是进行申请资源后找安全序列或者直接找安全序列 int id;//进程号 bool t;//接取safe返回值 cout<< "请输入进程数 "; cin >> m; cout << endl<<"请输入资源种类数 "; cin >> n; cout<<"是否需要申请资源,请输入Y/N"< >fly; if(fly=='N'||fly=='n'){ Init(mx,available,allocation,need);//初始化 cout<<"请问当系统处于T0状态时,系统是否处于安全状态"; t=safe(available,allocation, need,-1); if(t==true){ cout<<"该系统状态处于安全状态"<



