操作系统原理课程设计实践报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统原理课程设计
实践报告
题目: 仿真多进程并发环境中死锁的预防、避免、检测与解除
姓名:
学院: 信息科技学院
专业: 计算机科学技术系
班级:
学号:
指导教师: 职称:
20010年4月8日
仿真多进程并发环境中死锁的预防、避免、检测与解除
摘要:在多道程序系统中,多个程序并发执行时可能造成死锁。所谓死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局。当进程处于这种僵局状态时若无外力作用,它们都将无法再向前推进,造成资源的浪费。该程序将模拟多进程并发时死锁现象的产生、避免、检测与解除。死锁避免用最著名的银行家算法,用银行家安全性算法类似的死锁检测算法来检测进程状况,又用资源剥夺法来实现死锁的解除。该程序实现操作简易,表示清晰并且形象描述多进程并发环境中死锁的预防、避免、检测与解除。
关键字:死锁;避免死锁;安全状态;银行家算法
引言:在操作系统、数据库系统以及网络通信中,由于进程并发和资源共享,当系统中资源分配顺序或者进程推进顺序不当就会造成系统死锁[1]。处于死锁状态的系统中,进程之间互相等待资源而永远不能继续向前推进,严重地影响了系统的可靠性。因而有时需要合理的对资源进行分配必要的时候加以限制保证系统安全、高效、稳定的运行。
1理论分析
1.1 死锁的概念
如果一个进程集合中的每个进程都在等待只能由此集合中的其他进程才能引发的事件,而无限期陷入僵持的局面称为死锁[2]。
1.2 产生死锁的条件:
1、互斥使用(资源独占):一个资源每次只能给一个进程使用。
2、不可强占(不可剥夺):资源申请者不能强行的从资源占有者手中夺取资
源,资源只能由占有者自愿释放。
3、请求和保持(部分分配,占有申请):一个进程在申请新的资源的同时保
持对原有资源的占有(只有这样才是动态申请,动态分配)。
4、循环等待:存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占
有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路[3]。
1.3死锁的预防
在系统设计时确定资源分配算法,保证不发生死锁。具体的做法是破坏产生死锁的四个必要条件之一。
①破坏“不可剥夺”条件
在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请。
②破坏“请求和保持”条件
要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配。
③破坏“循环等待”条件
采用资源有序分配法:把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配。
1.4安全状态与不安全状态
所谓安全状态,是指进程能按某种进程次序(p1,p2,⋯,pn),来为每个进程pi 分配其所需资源,直至满足进程pi对资源的最大需求量,使每个进程pi可顺利地完成,则此时系统处于安全状态,称序列(p1,p2,⋯,pn)为安全序列.如果系统无法找到这样一个安全序列,则称系统处于不安全状态[4]。
2 功能设计及其数据结构设计
2.1功能设计
程序主要提供并发环境的仿真,死锁的检测,银行家算法解决,死锁的解除等功能。
2.2数据结构设计
主要数据结构:
进程类 Struction_pro 属性:ID,P1,P2,P3,State 类 Struction 属性:P1,P2,P3
Struction Resource = new Struction(10,5,7);用于存放每种资源最大值 Struction Available = new Struction(10,5,7); 用于存放每种资源可用值 Struction_pro [] Claim =new Struction_pro[5]; 用于存放进程集合信息Struction_pro[] Allocation = new Struction_pro[5];用于存放进程集合已非配资源信息
3 核心算法 3.1银行家算法
死锁的避免主要采用银行家算法,流程图如下:
银行家算法的基本思想:
Y Y Y
进程到达 试探分配
资源分配给进程 申请资源≤进程需求
申请资源≤可用资源 执行安全性算法 资源分配给进程
N N N
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出
错。
(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否
则,出错。
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,
系统恢复原状,进程等待。
安全性算法流程图:
死锁检测:允许死锁发生,操作系统不断监视系统进展情况,判断死锁是否发生一旦死锁发生则采取专门的措施,解除死锁并以最小的代价恢复操作系统运行
死锁检测算法与银行家安全性算法类似。
死锁检测时机有:当进程等待时检测死锁、定时检测、系统资源利用率下降