#中国计量学院操作系统课程设计(银行家算法+哲学家进餐)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计报告书
共享资源分配与银行家算法
哲学家进餐死锁问题及避免算法的实现辅导老师:
班级:
姓名:
学号:
共享资源分配与银行家算法
一、课程设计目的和意义
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。
所以,通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。
二、方案设计及开发过程
1.课程设计背景
此次课程设计的主要内容是模拟实现资源分配。同时要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。
具体用银行家算法实现资源分配。要求如下:
(1) 设计一个3个并发进程共享3类不同资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2) 设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3) 确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。
2.算法描述
程序一开始初始化个进程,打印出菜单,然后让用户选择随机算法还是银行家算法,然后分别进行不通的算法操作。
随机算法:
设进程I提出请求Request[N],则银行家算法按如下规则进行判断
(1) 如果Request[N]<=A V AILABLE,则转(2);否则,出错。
(2) 系统分配资源,修改相关数据:
A V AILABLE=A V AILABLE-REQUEST
ALLOCATION=ALLOCA TION+REQUEST
NEED=NEED-REQUES
(3) 系统执行安全性检查
银行家算法:
设进程I提出请求Request[N],则银行家算法按如下规则进行判断。
(1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。
(2)如果Request[N]<=A V AILABLE,则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
A V AILABLE=A V AILABLE-REQUEST
ALLOCATION=ALLOCA TION+REQUEST
NEED=NEED-REQUEST
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3.数据结构
int need[10][3]; //
int max[10][3]; //最大需求
int allocation[10][3]; //已分配
int available_temp[3]; //可用,临时变量,用户尝试性分配request资源
int available[3]; //可用
int path[10]; //记录安全序列
int is_save; //是否产生安全序列标示符
4.主函数说明
//初始化need,max,allocation,available,及判断初始状态是否有安全序列
void init();
void showMenu(); //打印出菜单
void print_sav_seq(); //打印安全序列及分配过程
void dfs(int idx); //改程序核心函数,用深度优先搜索查找安全序列void banker(); //银行家算法入口
void ramdon(); //随机分配算法入口
int main(); //主程序入口
5.算法流程图
(主函数)
(银行家算法)
(随机分配算法)
三、调试记录与分析
初始化数据参照课本P110:
第一行为有3中资源,5个进程。最后一行为各类资源可用情况。中间数据位max,
allocation,need:
3 5
7 5 3 0 1 0 7 4 3
3 2 2 2 0 0 1 2 2
9 0 2 3 0 2 6 0 0
2 2 2 2 1 1 0 1 1
4 3 3 0 0 2 4 3 1
3 3 2
即:
在下面这种状态中
Max Allocation Need
A B C A B C A B C
7 5 3 0 1 0 7 4 3
3 2 2 2 0 0 1 2 2
9 0 2 3 0 2 6 0 0
2 2 2 2 1 1 0 1 1
4 3 3 0 0 2 4 3 1
Available A: 3 B: 3 C: 2
请输入进程号和A, B, C请求的个数:
如果输入3 0 0 0
Available 变成A:5 B:11 C:4
分析:
程序缺少对available更新条件的判断,因为available只在进程刚好完全执行完全后进行更新,即加上之前的Allocation。所以,更改程序,如下
for(i=1; i<=3; ++i)
{
if(finished[i]) continue;
if(process[i].nd.a == 0 && process[i].nd.b == 0 && process[i].nd.c == 0)
{ //即在进程刚好执行完成时进行process的更新
-- cntProcess;
finished[i] = 1;
available.a += process[pr].alloc.a;
available.b += process[pr].alloc.b;
available.c += process[pr].alloc.c;
}
}
四、运行结果及说明
1.打印菜单
2.初始化数据,有安全序列则打印之并给出分配方案,
否则,需要用户提供正常的初始化数据再运行程序:
3.选择银行家算法,输入进程号,请求资源数
1)分配后仍有安全序列: