操作系统 银行家算法解析
代码解析
过程变量定义
int Available[100];//可利用资源数组
int Max[50][100];//最大需求矩阵
int Allocation[50][100];//分配矩阵
int Need[50][100];//需求矩阵
int Request[50][100];//M个进程还需要N类资源的资源量
int Finish[50];//Bool型变量 标志safe函数中表示系统是否有足够资源分配给进程 默认为false
int p[50];
int m,n;//m个进程,n类资源
main函数分析
main函数分为两个部分
第一部分是初始化系统:
- 输入系统初始化的各个变量:最大需求矩阵、每个进程已分配的各类资源数目、系统中的各类资源数
- 进行safe验证
第二部分为对系统的资源调动的应用
- 针对某个进程进行各类资源分配
- 进行safe验证
第一部分:初始化系统
-
输入进程数目以及资源种类的数目
cout<<"输入进程的数目:\n"; cin>>m; cout<<"输入资源的种类:\n"; cin>>n;
-
输入最大需求矩阵
cout<<"输入每个进程最多所需的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n"; for (i = 0;i < m;i++) for(j = 0;j < n;j++) cin>>Max[i][j];
-
输入每个进程已分配的各类资源数目 并 计算得到当前每个进程所需要的各类资源数
cout<<"输入每个进程已经分配的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n"; for (i = 0;i < m;i++){ for(j = 0;j < n;j++){ cin>>Allocation[i][j]; // 输入每个进程已分配的各类资源数 Need[i][j] = Max[i][j]-Allocation[i][j]; // 计算当前每个进程还需要的各类资源数 // 以下用以保证每个进程还需要的各类资源数不能小于0 if (Need[i][j] < 0){ cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源错误,请重新输入:\n"; j--; continue; } } }
-
输入系统中各类资源数
cout<<"请输入各个资源现有的数目:\n"; for (i = 0;i < n;i++) cin>>Available[i];
-
执行安全性算法,判断当前系统是否安全 此处详见safe函数分析
Safe();
第二部分:资源调用
-
输入要申请的资源进程号以及该进程所请求的各个资源数目
cout<<"输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\n"; cin>>mi; cout<<"输入进程所请求的各个资源的数量\n"; for (i = 0;i < n;i++) cin>>Request[mi][i];
-
针对没类资源进行判断,判断所请求的资源是否大于进程的需求量,以及是否大于系统当前所有的资源数
for (i = 0;i < n;i++){ // 所请求的资源是否大于进程的需求量 if (Request[mi][i]>Need[mi][i]){ cout<<"所请求资源数超过进程的需求量!\n"; return 0; } // 所请求的资源是否大于系统当前所有的资源数 if (Request[mi][i] > Available[i]){ cout<<"所请求资源数超过系统所有的资源数!\n"; return 0; } }
-
针对申请的进程进行各类资源调动
for (i = 0;i < n;i++){ Available[i] -= Request[mi][i]; // 进行资源分配后各类资源的剩余数 Allocation[mi][i] += Request[mi][i]; // 资源分配后针对各个进程所对应的各类资源已分配的数目 Need[mi][i] -= Request[mi][i]; // 资源分配后各进程的各类资源的最大需求 }
-
safe验证
if (Safe()) cout<<"同意分配请求\n"; // 验证成功则同意分配资源 // 验证不成功则将刚刚分配的资源退回 else{ cout<<"SORRY╮(╯▽╰)╭……你的请求被拒绝…\n"; for (i = 0;i < n;i++){ Available[i] += Request[mi][i]; Allocation[mi][i] -= Request[mi][i]; Need[mi][i] += Request[mi][i]; } }
-
将finish的标志重新表示为false
for (i = 0;i < m;i++) Finish[i] = 0;
-
是否再次申请资源
char Flag; //标志位 cout<<"是否再次请求分配?是请按Y/y,否请按N/n"; while (1){ cin>>Flag; if (Flag == 'Y'||Flag == 'y'||Flag == 'N'||Flag == 'n') break; else{ cout<<"请按要求重新输入:\n"; continue; } } if (Flag == 'Y'||Flag == 'y') continue; else break;
C++代码如下
#include <iostream>
using namespace std;
int Available[100];//可利用资源数组
int Max[50][100];//最大需求矩阵
int Allocation[50][100];//分配矩阵
int Need[50][100];//需求矩阵
int Request[50][100];//M个进程还需要N类资源的资源量
int Finish[50];//Bool型变量
int p[50];
int m, n;//m个进程,n类资源
//安全性算法
int Safe() {
int i, j, l = 0;
int Work[100]; //可利用资源数组
for (i = 0; i < n; i++)
Work[i] = Available[i];
for (i = 0; i < m; i++)
Finish[i] = 0;
for (i = 0; i < m; i++) {
if (Finish[i] == 1)
continue;
else {
for (j = 0; j < n; j++) {
if (Need[i][j] > Work[j])
break;
}
if (j == n) {
Finish[i] = 1;
for (int k = 0; k < n; k++)
Work[k] += Allocation[i][k];
p[l++] = i;
i = -1;
}
else continue;
}
if (l == m) {
cout << "系统是安全的" << endl;
cout << "系统安全序列是:" << endl;
for (i = 0; i < l; i++) {
cout << p[i];
if (i != l - 1)
cout << "-->";
}
cout << endl;
return 1;
}
else {
return 0;
}
}
}
//银行家算法
int main() {
int i, j, mi;
cout << "输入进程的数目:\n";
cin >> m;
cout << "输入资源的种类:\n";
cin >> n;
cout << "输入每个进程最多所需的各类资源数,按照" << m << "x" << n << "矩阵输入\n";
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
cin >> Max[i][j];
cout << "输入每个进程已经分配的各类资源数,按照" << m << "x" << n << "矩阵输入\n";
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
cin >> Allocation[i][j];
Need[i][j] = Max[i][j] - Allocation[i][j];
if (Need[i][j] < 0) {
cout << "你输入的第" << i + 1 << "个进程所拥有的第" << j + 1 << "个资源错误,请重新输入:\n";
j--;
continue;
}
}
}
cout << "请输入各个资源现有的数目:\n";
for (i = 0; i < n; i++)
cin >> Available[i];
Safe();
while (1) {
cout << "输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\n";
cin >> mi;
cout << "输入进程所请求的各个资源的数量\n";
for (i = 0; i < n; i++)
cin >> Request[mi][i];
for (i = 0; i < n; i++) {
if (Request[mi][i] > Need[mi][i]) {
cout << "所请求资源数超过进程的需求量!\n";
return 0;
}
if (Request[mi][i] > Available[i]) {
cout << "所请求资源数超过系统所有的资源数!\n";
return 0;
}
}
for (i = 0; i < n; i++) {
Available[i] -= Request[mi][i];
Allocation[mi][i] += Request[mi][i];
Need[mi][i] -= Request[mi][i];
}
if (Safe())
cout << "同意分配请求\n";
else {
cout << " error please begin" << endl;
for (i = 0; i < n; i++) {
Available[i] += Request[mi][i];
Allocation[mi][i] -= Request[mi][i];
Need[mi][i] += Request[mi][i];
}
}
for (i = 0; i < m; i++)
Finish[i] = 0;
char Flag; //标志位
cout << "是否再次请求分配?是请按Y/y,否请按N/n";
while (1) {
cin >> Flag;
if (Flag == 'Y' || Flag == 'y' || Flag == 'N' || Flag == 'n')
break;
else {
cout << "请按要求重新输入:\n";
continue;
}
}
if (Flag == 'Y' || Flag == 'y')
continue;
else break;
}
}