一、需求分析
1、程序设计的任务和目的
通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
2、输入的形式和输入值的范围
进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置)
3、输出的形式
如果安全,输出安全的进程序列,不安全则提示信息。
4、程序所能达到的功能
程序模拟预防进程死锁的银行家算法的工作过程。假设系统中有n个进程P1, … ,Pn,有m类可分配的资源R1, … ,Rm,在T0时刻,进程Pi分配到的j类资源为Allocationij个,它还需要j类资源Need ij个,系统目前剩余j类资源Workj个,现采用银行家算法进行进程资源分配预防死锁的发生。
5、测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果
正确用例
输入
1 | 复制代码请输入进程个数n:5 |
输出
1 | 复制代码SafeOrder为: 进程 2 进程 4 进程 5 进程 1 进程 3 |
错误用例(输入负值,影响正确结果)
输入
1 | 复制代码请输入进程个数n:1 |
输出
1 | 复制代码SafeOrder为: 进程 1 |
二、概要设计
1、抽象数据类型的定义
1 | 复制代码int n;//进程个数n |
2、主程序的流程
1 | 复制代码int main() { |
3、各程序模块之间的层次(调用)关系
1 | 复制代码int main() { |
三、详细设计
实现程序模块的具体算法
1、Order银行家算法排序
1 | 复制代码//进行安全进程检测并输出安全序列 |
2、NewRequest发起新请求
1 | 复制代码//判断是否有新请求,若无则退出,若有则输入其请求资源数 |
3、NewFinish函数判断进程完成
1 | 复制代码//判断所有进程是否完成 |
4、IsExecutable函数判断资源充足与否
1 | 复制代码//判断可分配资源可否满足该进程 |
5、IsSafe函数判断当前进程是否安全
1 | 复制代码//判断现在是否安全 |
四、调试分析
调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析
算法的性能分析(包括基本操作和其它算法的时间复杂度和空间复杂度的分析)及其改进设想
性能分析
算法 | 时间复杂度 | 空间复杂度 |
---|---|---|
Order算法安全进程检测 | T(n) = O(n2) | S(n) = O(n) |
NewRequest算法请求资源 | T(n) = O(n2) | S(n) = O(n2) |
NewFinish算法判断所有进程是否完成 | T(n) = O(n) | S(n) = O(n) |
IsExecutable算法判断可分配资源可否满足该进程 | T(n) = O(n) | S(n) = O(n) |
IsSafe算法判断进程是否处于安全状态 | T(n) = O(n) | S(n) = O(n) |
改进设想
输出较为繁复,多次测试较为不便,可改为读取文件输入
五、用户使用说明
使用说明
- 控制台会提示要求用户进行输入,按提示输入内容即可
- 不要输入负值,将影响正确结果
- 选择算法输入完成后将会输出安全的进程序列
- 可根据需要选择是否使用进行其他资源请求或退出
六、测试结果
测试结果,包括输入和输出
1 | 复制代码D:\Documents\MyCourse\OperatingSystem\cmake-build-debug\chapter03.exe |
七、附录
带注释的源程序
1 | 复制代码#include <iostream> |
本文转载自: 掘金