死锁的产生以及处理

来源:互联网 发布:java list 字符串排序 编辑:程序博客网 时间:2024/05/17 07:53


死锁的概念

    如果一组进程中的每一个进程都在等待仅由改组进程中的其他进程才能引发的事件,那么改组进程是死锁的。


产生死锁的原因

    1、竞争资源引发进程死锁 

    1)可剥夺资源和不可剥夺资源

  系统中的资源可以分为两类,一类是可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。例如,优先权高的进程可以剥夺优先权低的进程的处理机。又如,内存区可由存储器管理程序,把一个进程从一个存储区移到另一个存储区,此即剥夺了该进程原来占有的存储区,甚至可将一进程从内存调到外存上,可见,CPU主存均属于可剥夺性资源。另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如磁带机打印机等。

  2)竞争不可剥夺资源

  在系统中所配置的不可剥夺资源,由于它们的数量不能满足诸进程运行的需要,会使进程在运行过程中,因争夺这些资源而陷于僵局。例如,系统中只有一台打印机R1和一台磁带机R2,可供进程P1P2共享。假定PI已占用了打印机R1P2已占用了磁带机R2,若P2继续要求打印机R1P2将阻塞;P1若又要求磁带机,P1也将阻塞。于是,在P1P2之间就形成了僵局,两个进程都在等待对方释放自己所需要的资源,但是它们又都因不能继续获得自己所需要的资源而不能继续推进,从而也不能释放自己所占有的资源,以致进入死锁状态。

  3)竞争临时资源

  上面所说的打印机资源属于可顺序重复使用型资源,称为永久资源。还有一种所谓的临时资源,这是指由一个进程产生,被另一个进程使用,短时间后便无用的资源,故也称为消耗性资源,如硬件中断、信号、消息、缓冲区内的消息等,它也可能引起死锁。例如,SIS2S3是临时性资源,进程P1产生消息S1,又要求从P3接收消息S3;进程P3产生消息S3,又要求从进程P2处接收消息S2;进程P2产生消息S2,又要求从P1处接收产生的消息S1。如果消息通信按如下顺序进行:

  P1: ···ReleseS1;RequestS3···

  P2: ···ReleseS2;RequestS1···

  P3: ···ReleseS3;RequestS2···

  并不可能发生死锁。但若改成下述的运行顺序:

  P1: ···RequestS3;ReleseS1;···

  P2: ···RequestS1;ReleseS2···

  P3: ···RequestS2;ReleseS3···

  则可能发生死锁。

   

    2、进程推进顺序不当引起死锁

    由于进程在运行中具有异步性特征,这可能使P1P2两个进程按下述两种顺序向前推进。

  1) 进程推进顺序合法

  当进程P1P2并发执行时,如果按照下述顺序推进:P1RequestR1; P1RequestR2; P1: ReleseR1;P1: ReleseR2; P2RequestR2; P2RequestR1; P2: ReleseR2;P2: ReleseR1;这两个进程便可顺利完成,这种不会引起进程死锁的推进顺序是合法的。

  2) 进程推进顺序非法

  若P1保持了资源R1,P2保持了资源R2,系统处于不安全状态,因为这两个进程再向前推进,便可能发生死锁。例如,当P1运行到P1RequestR2)时,将因R2已被P2占用而阻塞;当P2运行到P2RequestR1)时,也将因R1已被P1占用而阻塞,于是发生进程死锁。


死锁产生的必要条

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

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

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

  4)循环等待序列:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。


解除死锁的方法

    1)终止(或撤销)进程。终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态中解除出来。

    2)抢占资源。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以打破死锁状态。


处理死锁的方法: 

    1) 预防死锁

  这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

  2) 避免死锁

  该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。

  3) 检测死锁

  这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。

  4) 解除死锁

  这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。


0 0
原创粉丝点击