作業系統死鎖產生原因

  作業系統中死鎖產生的原因一般有多種。具體是哪幾種呢?下面由小編為大家整理了作業系統的死鎖的相關知識,希望對大家有幫助!

  一、作業系統死鎖的概念

  死鎖是指多個程序在執行過程中因爭奪資源造成的一種僵局。若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

  二、作業系統死鎖產生的原因

  原因1:競爭資源引起程序死鎖

  a.競爭不可剝奪資源

  在系統中所配置的不可剝奪資源,由於它們的數量不能滿足諸程序執行的需要,會使程序在執行過程中,因爭奪這些資源而陷於僵局。例如,系統中只有一臺印表機R1和一臺磁帶機R2,可供程序P1和P2共享。假定PI已佔用了印表機R1,P2已佔用了磁帶機R2,若P2繼續要求印表機R1,P2將阻塞;P1若又要求磁帶機,P1也將阻塞。於是,在P1和P2之間就形成了僵局,兩個程序都在等待對方釋放自己所需要的資源,但是它們又都因不能繼續獲得自己所需要的資源而不能繼續推進,從而也不能釋放自己所佔有的資源,以致進入死鎖狀態。

  b.競爭臨時資源

  上面所說的印表機資源屬於可順序重複使用型資源,稱為永久資源。還有一種所謂的臨時資源,這是指由一個程序產生,被另一個程序使用,短時間後便無用的資源,故也稱為消耗性資源,如硬體中斷、訊號、訊息、緩衝區內的訊息等,它也可能引起死鎖。例如,SI,S2,S3是臨時性資源,程序P1產生訊息S1,又要求從P3接收訊息S3;程序P3產生訊息S3,又要求從程序P2處接收訊息S2;程序P2產生訊息S2,又要求從P1處接收產生的訊息S1。如果訊息通訊按如下順序進行:

  P1: ···Relese***S1***;Request***S3***; ···//P1先Relese***S1***,在Request***S3***時阻塞

  P2: ···Relese***S2***;Request***S1***; ···//P2順利執行

  P3: ···Relese***S3***;Request***S2***; ···//P3順利執行,P3執行之後P1被喚起就緒-執行

  並不可能發生死鎖。但若改成下述的執行順序:

  P1: ···Request***S3***;Relese***S1***;···//P1在Request***S3***時發生阻塞,不執行Relese***S1***

  P2: ···Request***S1***;Relese***S2***; ···//P2在Request***S1***時發生阻塞,不執行Relese***S2***

  P3: ···Request***S2***;Relese***S3***; ···//同上。故發生死鎖

  原因2:程序推進順序不當引起死鎖

  由於程序在執行中具有非同步性特徵,這可能使P1和P2兩個程序按下述兩種順序向前推進。

  當程序P1和P2併發執行時,如果按照下述順序推進:

  P1:Request***R1***;

  P1:Request***R2***;

  P1: Relese***R1***;

  P1: Relese***R2***;

  P2:Request***R2***;

  P2:Request***R1***;

  P2: Relese***R2***;

  P2: Relese***R1***;

  這兩個程序便可順利完成,這種不會引起程序死鎖的推進順序是合法的。

  但若P1保持了資源R1,P2保持了資源R2,系統處於不安全狀態,因為這兩個程序再向前推進,便可能發生死鎖。

  參考資料:可剝奪資源和不可剝奪資源

  系統中的資源可以分為兩類,一類是可剝奪資源,是指某程序在獲得這類資源後,該資源可以再被其他程序或系統剝奪。例如,優先權高的程序可以剝奪優先權低的程序的處理機。又如,記憶體區可由儲存器管理程式,把一個程序從一個儲存區移到另一個儲存區,此即剝奪了該程序原來佔有的儲存區,甚至可將一程序從記憶體調到外存上,可見, CPU和主存均屬於可剝奪性資源。另一類資源是不可剝奪資源,當系統把這類資源分配給某程序後,再不能強行收回,只能在程序用完後自行釋放,如磁帶機、印表機等。