【操作系统】银行家算法
【实验目的】
①理解银行家算法。
②掌握进程安全性检查的方法及资源分配的方法。
【实验内容】
编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
例4-1某系统有A、B、C、D4类资源共5个进程(PO、P1、P2、P3、P4)共享,
各进程对资源的需求和分配情况如表4-1所示。
表4-1各进程对资源的需求和分配情况表
进程 |
已占资源 |
最大需求数 |
||||||
A |
B |
C |
D |
A |
B |
C |
D |
|
P0 |
0 |
0 |
1 |
2 |
0 |
0 |
1 |
2 |
P1 |
1 |
0 |
0 |
0 |
1 |
7 |
5 |
0 |
P2 |
1 |
1 |
5 |
4 |
2 |
3 |
5 |
6 |
P3 |
0 |
6 |
3 |
2 |
0 |
6 |
5 |
2 |
P4 |
0 |
0 |
1 |
1 |
0 |
6 |
5 |
6 |
现在系统中A、B、C、D4类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:
①现在系统是否处于安全状态?
②如果现在进程Pl提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?
【实验步骤】
1:数据结构
int Available[100];
int Max[50][100];
int Allocation[50][100];
int Need[50][100];
int Request[50][100];
int Finish[50];
int p[50];
int m, n;
流程图1.2:银行家算法程序流程图
1.3 实验代码
#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]; 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 << "系统是安全的" << '\n'; cout << "系统安全序列是:\n"; for (i = 0; i < l; i++) { cout << p[i]; if (i != l - 1) cout << "-->"; } cout << '\n'; return 1; } } } //银行家算法 int main() { int i, j, mi; printf("\n"); 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; } } Safe(); 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 << "你的请求被拒\n"; 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 YesOrNo; //标志位 cout << "是否再次请求分配?是请按Y/y,否请按N/n \n"; while (1) { cin >>YesOrNo; if (YesOrNo == 'Y' || YesOrNo == 'y' || YesOrNo == 'N' || YesOrNo == 'n') break; else { cout << "请按要求重新输入:\n"; continue; } } if (YesOrNo == 'Y' ||YesOrNo == 'y') continue; else break; } }
实验结果
1.根据五个进成和数据,判断系统是否安全结果如下:
进程p1需要(0、4、2、0)个资源的请求,对进程进行修改并重新判断是否安全实验结果如下:
【实验结果分析】
1.安全状态一定是没有死锁发生。不安全状态不一定导致死锁。
2.如果一个由系统有安全序列,则系统处于安全状态。
3.银行家算法要在资源分配之前查看系统是否安全
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律