本项目提供了一个基于VC++编写的银行家算法实现代码,适用于教学和研究目的的操作系统实验中。它帮助学生理解死锁预防策略,并通过编程实践加深对资源分配与管理机制的认识。
银行家算法实验
**1. 实验目的与要求**
通过编写并调试一个简单的银行家算法程序加深对资源申请、避免死锁等相关概念的理解,并体会具体实施方法。
**2. 实验内容**
- 设计进程对各类资源最大需求量的表示及初始值确定。
- 定义系统提供的资源初始状况。
- 规定每次某个进程提出的各种类型资源请求的具体表现形式。
- 编写程序,依据银行家算法决定某一申请是否被满足。
**3. 实验说明**
假设存在M个进程和N类资源,则需要以下数据结构:
MAX[M*N]:表示每个进程中各类资源的最大需求量
AVAILABLE[N]:系统当前可用的各类型资源的数量
ALLOCATION[M*N]:记录各个进程已获得的各种类型的资源数量。
NEED[M*N] : 表示每一个进程还需要哪些种类和多少数量的资源。
**4. 银行家算法规则**
当某一个请求Request[N]由某一特定进程提出时,按照如下步骤进行判断:
(1) 若 Request[N]<= NEED[I,N], 则继续执行下步;否则报错。
(2) 如果上述条件满足且 Request[N]<= AVAILABLE, 继续执行下一步骤;若不满足,则同样需要报告错误信息。
(3) 系统尝试分配资源,更新相关数据:
- AVAILABLE -= REQUEST
- ALLOCATION += REQUEST
- NEED -= REQUEST
(4) 进行安全性检查:如果发现安全状态成立,则确认此次请求可以被接受;否则取消试探性分配并恢复原状,进程需要等待。
**5. 安全性检测**
设置两个工作向量:
- WORK = AVAILABLE;
- FINISH[M] = FALSE;
然后从未完成的进程中找到满足以下条件的一个:FINISH[i]=FALSE 并且 NEED <= WORK。如果找到了这样的一个进程,则执行步骤(3);否则,直接进入下一步。
**6. 参考代码**
```cpp
#include
#include
#define M 5 // 总的进程数
#define N 3 // 资源种类的数量
// 定义布尔值类型FALSE和TRUE
const int FALSE = 0;
const int TRUE = 1;
int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; // 每个进程对资源的最大需求量
int AVAILABLE[N]={10,5,7}; // 系统可用的各类资源数量
int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; // 各进程已分配到的各种类型的资源量
int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; // 每个进程中各类资源的剩余需求量
// 申请向量
int Request[N]={0};
```