1.有限資源的競爭引起進程死鎖
當系統中為多個進程所共享的資源不能同吋滿足它們的需求時,引起它們對資源的競爭而產生死鎖。在通常情況下,系統中的資源分為可剝奪、非剝奪和臨時性資源,不同類型的資源在發生死鎖時的處理方式不同。
(1)可剝奪資源如CPU和主存等,在系統中優先權高的進程可剝奪優先權低的進程對這些資源的占用。
(2)非剝奪資源如打印機、讀卡機和磁帶機等是屬于吋順序重復使用的資源。這類資源的特點是,當系統把某資源分配給某進程后,不能再強行收回,只能在進程用完后自動釋放。圖1所示是多個進程因爭奪非剝奪資源產生死鎖的典型例子。具體地說,如果有一組進程P1,P2,...,Pn,其中P1,P2,...,Pn分別占有資源R1,R2,...,Rn,P1同時又申請資源R2,P2同時又申請資源R3,…,Pn-1同時又申請Rn,Pn占有資源Rn同時再申請資源R1。此時,這組進程都因資源得不到滿足而進人了互相等待的阻塞狀態,永遠也不可能前進并到達終點,這時就說系統中出現了死鎖現象,P1,P2,...,Pn這組進程處于死鎖狀態。

(3)臨時性資源是指由進程產生、使用后無用的資源。如進程通信時使用的信件,如果對信件的發送和接收不加限制的話,則可能引起死鎖。如圖2所示,S1、S2和S3是臨時性資源,分別由進程P1、P2和P3產生,進程之間的通信情況是:P1要求從P3接收信件,P3要求從P2接收信件,P2要求從P1接收信件。而實際的操作過程是:進程P1等待進程P3的信件S3來到后再向進程P2發送信件S1,P2又要等待P1的信件S1來到后再向P3發送信件S2,而P3也要等待P2的信件S2來到后才能發出信件S3。在這種情況下就形成了循環等待,發生死鎖。

由此可見,多個進程競爭使用資源,而系統提供的資源數不能完全滿足進程的需求,所以資源不足是引起死鎖的主要原因。但需要注意的是,并不是多個進程要求使用多個資源就一定會產生死鎖,上例還表明,進程在運行中對資源要求在時間上的沖突也是產生死鎖的一個原因。
2.進程推進的順序不當引起死鎖
由于進程的調度是獨立的,因此它們對資源的請求和釋放操作也存在多種序列,其中有些序列是不安全的,如上面提到的對臨時性資源的占用情況;而有些序列是安全的,例如進程P1、P2都需要資源R1、R2,如果兩個進程的推進順序是,進程P1占有資源R1,申請R2時,進程P2還未占有R2,這樣就不會發生死鎖。這說明死鎖是一種與時間有關的錯誤,它和各進程推進的速度以及對資源清求的順序有關。
新聞熱點
疑難解答