线程死锁概念和产生原因

一、死锁的概念

所谓死锁,是指多个进程在运行过程中因争夺资源而照成的一种僵局。当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

二、产生死锁的原因

(1)竞争资源。当系统中供多个进程共享的资源如打印机、公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。 
(2)进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,也同样会产生进程死锁。 
以下详细分析产生死锁的原因

1.竞争资源引起进程死锁

1)可剥夺和非剥夺性资源 
可把系统中的资源分为两类,一类是可剥夺性资源,是指进程在获得这类资源后,该资源可以再被其它进程或系统剥夺。例如,优先权高的进程可以剥夺优先权低的进程的处理机。又如,内存区可由存储器管理程序把一个进程从一个存储区移到另一个存储区,此即剥夺了该进程原来占有的存储区。甚至可以将一个进程从内存调到外存上。可见CPU和主存均属于可剥夺性资源。另一类资源是不可剥夺性资源,当系统把这类资源分配给某进程后,再不能强行回收,只能在进程用完后自行释放,如磁带机、打印机等。 
2)竞争非剥夺性资源 
在系统中所配置的非剥夺性资源,由于它们的数量不能满足诸进程运行的需要,会使进程在运行过程中,因争夺这些资源而陷入僵局。例如,例如系统中只有一台打印机R1和一台磁带机R2,可供进程P1和P2共享。假定P1已占用了打印机R1,P2已占用了磁带机R2。此时,若P2继续要求打印机,P2将阻塞;P1若又要求磁带机,P1也将阻塞。于是,在P1和P2之间便形成了僵局,两个进程都在等待对方释放自己所需的资源。但它们都因不能继续获得自己所需的资源而不能继续推进,从而也不能释放自己已占有的资源,以致进入死锁状态。为方便说明,用方块代表资源,圆圈代表进程给出如下状态图: 
这里写图片描述 
当箭头从进程指向资源时,表示进程请求资源;当箭头从资源指向进程时,表示该资源已被分配给该进程。从中可以看出,这时在P1、P2及R1和R2之间已经形成了一个环路,说明已进入死锁状态。 
3)竞争临时资源 
上述的打印机资源属于可顺序重复使用型资源,称为永久性资源。还有一种是所谓的临时资源,这是指由一个进程产生,被另一进程使用一短暂时间后便无用的资源,故也称为消耗性资源,它也可能引起死锁。下图展示了在进程间通信时形成死锁的情况。 
进程之间通信死锁 
图中S1、S2和S3是临时性资源。进程P1产生消息S1,又要求从P3接收消息S3;进程P3产生消息S3,又要求从P2接收消息S2;进程P2产生消息S2,又要求从P2接收消息S1. 
说明: 
若按下列顺序进行无死锁产生: 
P1:…Release(s1);Request(S3);… 
P2:…Release(s2);Request(S1);… 
P3:…Release(s3);Request(S2);… 
但若按下列顺序进行可能产生死锁: 
P1:… Request(S3); Release(s1); … 
P2:… Request(S1) ; Release(s2);… 
P3:… Request(S2) ; Release(s3);…

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

由于进程在运行中具有异步性特征,这就可能使上述P1和P2两个进程按下述两种顺序向前推进。 
1)进程推进顺序合法 
我们称不会引起进程死锁的推进顺序是合法的。 
2)进程推进顺序不合法 
我们称会引起进程死锁的推进顺序是不合法的。

三、产生死锁的必要条件

(1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求该资源,则请求者只能等待,直至占有该资源的进程用毕释放。  (2)请求和保持条件:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其它进程占有,此时请求进程阻塞,但又对自己获得的其它资源保持不放。  (3)不剥夺条件:指进程已获得资源,在使用完之前,不能被剥夺,只能在使用完时由自己释放。  (4)环路等待条件:指在发生死锁时,必然存在一个进程—资源的环形链,即进程集合(P0,P1,P2,…,Pn)中的P0正在等待一个P1占用的资源;P1正在等待一个P2占用的资源,……,Pn正在等待已被P0占用的资源。