死锁产生的必要条件,如何有效地避免死锁

计算机系统中的死锁:

死锁的起因,通常源于多个进程对资源的争夺, 不仅对不可抢占资源进行争夺时会引起死锁,而且对可消耗资源进行争夺时,也会引起死锁。

可抢占资源:

可把系统中的资源分成两类,一类是可抢占性资源,是指某进程在获得资源后,资源可以被其他进程或或系统抢占。例如优先级高的高的资源可以抢占优先级低的进程处理机。又可以把一个进程从一个存储区转移到另一个存储区,在内存紧张时,还可将一个进程从内存调出到外存上,即抢占该进程的内存空间,即cpu和主存均属于可抢占性资源,对于这类资源是不会引起死锁的。

不可抢占资源:

另一类资源是不可抢占资源,即一旦系统把某资源分配给进程后,就不能将它强行收回,只能在进程用完后自行释放,例如,当一个进程已开始刻录光盘时,如果突然将刻录机分配给另一个进程,其结果必然将损坏正在刻录的光盘,因此只能等刻好光盘以后由进程自己释放刻录机,另外磁带机,打印机等也属于不可抢占资源。

1.竞争不可抢占资源引起的死锁:

通常系统中所有的不可抢占资源其数量不足以满足多个进程运行的需要,是的进程在运行过程中,会因争夺资源陷入僵局,例如,系统中有两个进程p1,p2,他们都准备写两个文件f1,f2,这两者都属于可重用和不可抢占资源,进程p1打开f1,然后再打开文件f,后打开f1,。

两个进程在并发执行时,如果p1先打开f1和f2,然后p2再打开f1(或f2),由于文件f1或f2,由于f1(f2)已被p1打开,故p2处于会被阻塞,当p1写完文件f1(或f2)而关闭f1(或f2时,p2就会由阻塞状态转为就绪状态,被调度执行后重新打开文件f1(或f2),在这种情况下,p1和p2都能正常运行下去,。

但如果p1打开文件f1的同时,p2去打开f2,每个进程都占有一个打开的文件, 此时就可能出现问题,。因为p1试图打开f2,p2试图打开f1时,这两个进程就会因都会因文件被打开而被阻塞,他们希望对方关闭自己所需要的文件,但谁也无法运行,因此两个进程将会无限地等待下去,而形成死锁。

2.竞争可消耗资源引起的死锁

在利用消息通信机制进行通信时引起的死锁情况,若m1,m2,m3是可消耗性资源,

P1:..send(p2,m1); receive(p3,m3);..

P2:..send(p3,m2); receive(p1,m1);..

P3:..send(p1,m3); receive(p2,m2);..

这三个进程都可将消息发送给下一个进程,相印地,他们也能够接受从上一个进程发送来的消息,因此三个进程可以顺利地运行下去,而不会发生死锁,但若先执行receive操作,然后执行send操作,即按下述运行顺序

p1:receive(p3,m3);..P1:..send(p2,m1)

p2:receive(p1,m1);..P2:..send(p3,m2);

p3:receive(p2,m2);....send(p1,m3);

则这三个进程将永久地阻塞他们的receive操作,等待一条永远不会发出的消息,于是发生 了死锁。

产生死锁的必要条件:

(1)互斥条件。进程对所分配到的资源进行排他性使用,即在一段时间内,某资源只能被一个进程占用,如果此时还有其他进程请求该资源,则请求进程只能等待,直至占用该资源的进程用必释放。

(2)请求和保持条件。进程保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己获得的资源保持不放。

(3)不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时自己释放。

(4)循环等待条件。在发生死锁时,必然存在一个进程-资源的循环链,即进程集合{p1,p2,p3...pn}中的p0正在等待一个p1占有的资源,p1正在等待p2占有的资源,...pn正在等待p0占有的资源。

处理死锁的方法

(1)预防死锁

(2)避免死锁

(3)检测死锁

(4)解除死锁

避免死锁的方法(银行家算法)

最具有代表性的避免死锁的算法是dijkstra的银行家算法,起这样的名字是由于该算法原本是为银行系统设计的,以确保在银行发放现金贷款时,不会发生不能满足所有客户需要的情况。

1.银行家算法的数据结构

(1)可利用资源向量Available.代表可利用资源的数目,起初始值是系统中配置该类全部可用资源数目,其数值随随该类资源的分配和回收动态地变化。

(2)最大需求MAX,这是一个n*m的矩阵,如果MAX[i,j]=k,则代表进程i需要Rj类资源最大数目为k.

(3)分配矩阵Allcoation。这也是一个n*m矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数,如果Need[i,j]=k,则表示进程i还需要Rj类资源方可完成任务。

Need[i,j]=MAX[i,j]-Allcoation[i,j]

2.银行家算法

设Request是进程p1的请求向量,如果Request[j]=k,表示进程p需要Rj类型的资源,当p发出资源请求后,系统按下述步骤检查

(1)如果Request[j]<=Need[i,j],便转向步骤2,否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Request[j]<=Available[j],变转向步骤3,否则,表示尚无足够资源,p1需要等待。

(3)系统试探着把资源分配给进程p1,并修改数据结构中的数值。

Available[j]=Available[j]-Request[j]

Allocation[i,j]=Allocation[i,j]+Request[i,j]

Need[i,j]=Need[i,j]-Request[j]

(4)系统执行安全性算法,检查此次资源分配后是否处于安全状态,若安全,正式分配给进程,完成此次分配,否则此次分配失败,恢复原来分配资源状态。

时间: 2024-10-28 14:19:27

死锁产生的必要条件,如何有效地避免死锁的相关文章

死锁产生的四个必要条件及如何避免死锁

在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统 的处理能力.然而,多个进程的并发执行也带来了新的问题--死锁.所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进. 死锁产生的原因 1) 系统资源的竞争 通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在 运行过程中,会因争夺资源而陷入僵局,如磁带机.打印机等.只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的. 2)

数据库以及线程发生死锁的原理及必要条件,如何避免死锁

产生死锁的原因主要是: (1) 因为系统资源不足. (2) 进程运行推进的顺序不合适. (3) 资源分配不当等. 产生死锁的四个必要条件: (1)互斥条件:一个资源每次只能被一个进程使用. (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺. (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系. 避免死锁: 死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性

进程/线程死锁产生的原因以及如何避免死锁

线程死锁产生的必要条件: (1)互斥条件:一个资源每次只能被一个进程使用. (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺. (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系. 如何避免死锁,这点我觉得Erlang模型值得参考.在编程过程中,有一些避免死锁的经验: (1) 等待某个资源时,使用超时机制(例如Erlang中的receive可以加一个超时): (2) 采用消息通信的通信机

【操作系统-死锁】死锁发生的条件是什么?死锁的避免和预防方法

digest:本文章简要概述操作系统死锁的原因以及预防和解决方法. 1.死锁的定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种进程间相互阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.                                                                ——汤小丹等.<计算机操作系统>:西安电子科技大学出版社,2012.

[转载]DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2

(转载于breaksoftware的csdn博客) 本文介绍使用Windbg去验证<DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子>中的结论,调试对象是文中刚开始那个例子. 1 g 让程序运行起来 2 ctrl+break 中断程序 3 ~ 查看线程数 其实该程序自己运行起来的线程只有ID为0.TID为afc的线程.18c4线程是我们在windbg中输入ctrl+break,导致windbg在我们调试的进程中插入的一个中断线程.以后我们看到是这个线程的操作

死锁的三种形式:一般死锁,嵌套管程锁死,重入锁死

死锁的总结 死锁的定义: 死锁一般是指两个(或两个以上)线程同时竞争两个(或者多个)资源,从而产生同时等待的现象,使得系统僵持不动. 顺便复习一下线程与进程的定义以及他们之间的区别. 进程:一个有独立功能的程序利用某些数据资源的一次远行过程. 线程:一个进程里面的一条执行路径(或者执行过程),同一条进程下的n多条线程之间可以互相通信(共享数据). 区别:进程是相对独立的单位,进程和线程的主要差别在于它们是不同的操作系统资源管理方式. 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进

Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程

前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对大家有帮助. 死锁案发还原 表结构: CREATE TABLE `song_rank` ( `id` int(11) NOT NULL AUTO_INCREMENT, `songId` int(11) NOT NULL, `weight` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`

死锁的定义 必要条件和处理方法

(一)死锁的定义 如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的(Deadlock). (二)产生死锁的必要条件 虽然进程在运行过程中可能会发生死锁,但产生死锁是必须具备一定条件的.产生死锁必须同时具备下面四个必要条件,只要其中任意一个条件不成立,死锁就不会产生: (1)互斥条件.进程对所分配到的资源进行排他性使用,即在一段时间内,某资源只能被一个进程占用.如果此时还有其他进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放. (2)请

死锁产生的4个必要条件及如何有效避免死锁

什么是死锁? 如果一个进程集合里面的每个进程都在等待只能由这个集合中的其他一个进程(包括他自身)才能引发的事件,这种情况就是死锁. 这个定义可能有点拗口,下面用一个简单例子说明. 资源A.B,进程C.D描述如下: 资源A和资源B,都是不可剥夺资源, 现在进程C已经申请了资源A,进程D也申请了资源B, 进程C接下来的操作需要用到资源B,而进程D恰好也在申请资源A, 进程C.D都得不到接下来的资源,那么就引发了死锁.然后套用回去定义:如果一个进程集合里面(进程C和进 程D)的每个进程(进程C和进程D