什么是死锁:
死锁的规范定义是集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的;通俗一点说就是:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
此处附上进程转换状态图:
图1 进程状态图
死锁产生的条件:
死锁的发生必须具备以下四个条件:
1、互斥条件。进程所分配的资源进行排他性使用,也就是说在某一段时间内资源只能由某一进程占用,如果其他进程想要使用该资源,则只能等待,知道占用进程释放相应资源。
2、请求资源和保持现有资源。意思是说某一进程当前至少有一个资源,而又申请其他的资源,其他资源又被其他的进程占用,此时该进程等待其他进程释放资源,自己原有的资源也不释放。
3、不剥夺条件。指的是进程占用的资源在没有释放之前,其他进程请求该资源只能等待,不能剥夺,只能在使用完的时候占用进程自己释放。
4、环路等待条件。指在发生死锁的状态下,必然存在一个进程——资源的环形链,即即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
死锁产生的原因:
死锁产生的原因主要有以下三个:
1、资源竞争引起的进程死锁。
当系统*多个进程共享的资源其数目不足以满足各个进程的需要时,则会引起多个进程对资源的竞争而引起死锁。
2、可剥夺资源和不可剥夺资源。系统中的资源可以分为两类,一类是可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。另外一类是不可剥夺资源,请求进程只能等待相应的占用进程主动释放资源才能使用该不可剥夺资源,当系统配置的不可剥夺资源不能满足进程的需要的时候,会使进程在争夺不可剥夺资源的时候发生死锁。
3、竞争临时资源。打印机作为一种系统分配的共享资源属于可顺序重复使用型资源。除此之外还有一种临时资源,其是由一个进程产生,另外一个进程使用,短时间后便无用了的资源,故也称为消耗性资源,如:信号、消息等,他也可能引起死锁。
死锁的预防:
1、有序资源分配法。
这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3、等等),申请时必须以上升的次序。系统要求申请进程:①它所必须使用的而且属于同一类的所有资源,必须一次申请完;②在申请不同类资源时,必须按各类设备的编号依次申请。 2、银行家算法。(最有代表性) 程序实现思路银行家算法顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
死锁的检测和处理:
先检测:这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源。检测方法包括定时检测、效率低时检测、进程等待时检测等。 然后解除死锁:采取适当措施,从系统中将已发生的死锁清除掉。 这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大