【校招VIP】操作系统——死锁、预防避免死锁

1天前 收藏 0 评论 0 java开发

【校招VIP】操作系统——死锁、预防避免死锁

转载声明:文章来源https://blog.csdn.net/2301_78566776/article/details/143857191

思维导图:


一、死锁产生的原因和必要条件
1.死锁的定义
死锁是指在执行过程中,两个或两个以上的进程(或线程)由于竞争资源或彼此通信而阻塞,导致无法继续执行的情况。如果没有外部干预,这些进程将无法向前推进,系统处于死锁状态。这些相互等待的进程被称为死锁进程。
2.产生死锁的原因
(1)竞争资源引起死锁
(2)推进顺序不当引起死锁
3.产生死锁的必要条件
死锁的产生通常需要满足以下四个必要条件
(1)互斥条件
进程对所需系统资源的互斥使用。即,资源不能被多个进程同时占用
(2)请求和保持条件
进程持有部分资源,同时等待获取其他进程占有的资源。即,进程在申请新资源时,不会释放已经占有的资源。
(3)不剥夺条件
进程占有的资源不能被其他进程剥夺,只有进程主动释放。即,资源只能由持有它的进程显式地释放。
(4)环路等待条件
存在一个进程资源申请的循环链。即,存在一个进程集合,使得每个进程都在等待该集合中另一个进程所占有的资源,从而形成一个闭环。(这是死锁必然出现的现象
4.解决死锁的基本方法
这四个基本方法出现在不同死锁过程的不同时间段
(1)预防死锁
(2)避免死锁
(3)检测死锁
(4)解除死锁

二、预防死锁
针对于产生死锁的四个必要条件,我们可以发现条件(1)是系统的固有属性无法避免。但是我们可以使条件(2)(3)(4)不成立来预防死锁。
1.摒弃“请求和保持”条件
资源进行——静态分配法/原子分配法
进程执行前先请求所需资源,如果资源无法获得,则释放已占有的资源。这种方法可以通过资源预分配或资源请求失败时回滚来实现。
缺点:资源浪费严重、进程延迟运行。
2.摒弃“不剥夺”条件
允许资源被其他进程抢占,如抢占式调度。但这种方法可能会导致进程的执行被频繁中断,从而影响系统的稳定性和性能。
3.摒弃“环路等待”条件
资源进行——资源的有效分配法(1.编号2.按序号升序运行)
对资源进行线性排序,并按序申请。让每个进程按序申请资源,从而避免出现循环等待的情况。这种方法可以通过资源申请时的顺序控制来实现。

三、避免死锁
1.安全状态和不安全状态
安全状态:
安全状态是指系统能按某种顺序(如P1,P2,…,Pn)为每个进程分配其所需资源,直至最大需求,使每个进程都可顺序完成。在这种状态下,系统存在一种资源分配策略,能够确保所有进程都能正常执行并最终完成。有安全序列,一定不会产生死锁
不安全状态:
若系统中不存在上述的安全(分配)系列,即系统无法按照某种顺序为每个进程分配所需资源,使每个进程都能顺序完成,那么系统就处于不安全状态。
转换:系统可以从安全状态转变为不安全状态,也可以从不安全状态转变为安全状态。这取决于资源的分配策略、进程的请求顺序以及系统的运行状态。
2.银行家算法
银行家算法(Banker's Algorithm)是一种经典的死锁避免算法,由计算机科学家Edsger Dijkstra(艾兹格·迪杰斯特拉)在1965年提出。它主要用于操作系统中的资源分配,确保系统能够安全地进行资源分配和释放,避免因资源分配不当而导致的死锁 。  
数据结构:
在银行家算法中,通常使用以下数据结构来记录资源分配情况:
1)Available:可用资源矩阵,长度为m的数组,表示系统当前可用的各类资源数目。
2)Max:最大需求矩阵,n×m的矩阵,表示每个进程对各类资源的最大需求。
3)Allocation:已分配资源矩阵,n×m的矩阵,表示每个进程当前已分配到的各类资源数目。
4)Need:需求矩阵,n×m的矩阵,表示每个进程尚需的各类资源数目(由Max减去Allocation得出)。
算法流程:


安全态检测的流程图为:


3.检测死锁
(1)资源分配图
(2)死锁定理
设每个进程所需求的最大资源为K,一共有N个进程,总资源个数为M个。
当满足 N×(K-1)+1<=M 时,便不会产生死锁。

C 0条回复 评论

帖子还没人回复快来抢沙发