本实验旨在通过实现和分析银行家算法,帮助学生理解操作系统中死锁预防机制的核心概念与应用实践。
### 5 银行家算法实现
#### 5.1 实验类型设计型(4学时)
#### 5.2 实验目的
1) 理解死锁避免的相关内容;
2) 掌握银行家算法的主要流程;
3) 掌握安全性检查的流程。
#### 5.3 实验描述
本实验旨在通过编程实现操作系统中关于死锁预防理论的内容。要求参与者设计并编写一个程序,该程序能够对每一次资源申请请求使用银行家算法进行处理和分配。
#### 5.4 实验内容
1) 设计多个类型的资源(至少三种);
2) 创建多个进程(至少三个);
3) 构建与银行家算法相关的数据结构;
4) 动态地执行资源的申请、分配,并实施安全性检测,同时输出具体的分配结果。
#### 5.5 实验要求
1) 编写程序实现上述实验内容。
2) 绘制出用于完成安全检查功能的流程图。
3) 撰写详细的实验报告。
#### 5.6 测试要求
1) 执行资源请求操作,输入参数包括进程号、所需资源类型及数量;
2) 至少执行三次以上的资源申请请求测试;
3) 进行至少一次申请量小于可用总量但系统仍处于不安全状态的测试案例。
#### 5.7 相关知识
##### 5.7.1 银行家算法的数据结构
- 可用资源向量Available:记录每种类型资源当前的数量。
- 最大需求矩阵Max:描述每个进程对各类资源的最大需求数。例如,Max[i,j]=K表示i号进程对于j类资源的需求上限为K个单位。
- 分配矩阵Allocation:显示各个进程中已获得的各类资源数量。
- 需求矩阵Need:反映各进程尚待获取的每种类型资源的数量。
##### 5.7.2 银行家算法
当一个进程Pi提出请求Request i [j]=K时,表示其需要K个单位的j类资源。具体步骤如下:
1) 若该请求小于等于当前的需求矩阵Need[i, j]中的值,则继续执行下一步;否则报错。
2) 如果上述需求也满足可用资源向量Available[j]中对应部分的数量,则进入下一步骤;否则,表示暂时没有足够的资源分配给Pi进程,需要等待。
3) 系统尝试进行资源的即时分配;
4) 接着系统会检查此次操作后整个系统的安全性状态。如果确定是安全的状态,那么才正式完成本次资源分配;反之则需撤销刚刚的操作。
##### 5.7.3 安全性算法
- 设置两个向量:工作向量Work和Finish。初始化时,令Work等于Available,并且所有进程的Finish值均为False。
- 检查是否存在一个未被标记为安全(即Finish[i]=False)但需求矩阵Need中的数值小于或等于当前可用资源Work[j]的进程Pi;如果找到,则进入下一步骤;
- 进行分配并更新状态:令该进程获得所需资源后,能够执行直至完成,并释放其占用的所有资源。同时调整工作向量和Finish数组的状态。
- 重复上述过程直到所有进程都被标记为安全(即Finish[i]=True)或找不到符合条件的进程为止。
#### 5.8 实验设备
需要一台安装有DOS7.1、Turbo C3.0以及Windows2000操作系统的PC机来完成实验。
#### 5.9 实验成绩评定
综合评价包括两部分:实验过程中的表现(占总分的60%)和提交的实验报告质量(占40%)。如果任一部分不及格,则总体评估为不合格。
#### 5.10 实验报告组织结构
应包含以下内容:实验目的、具体实施步骤与操作、完成情况描述以及测试结果分析等部分。