當前位置:編程學習大全網 - 編程語言 - 在java中,死鎖形成的原因是(java什麽是死鎖)

在java中,死鎖形成的原因是(java什麽是死鎖)

死鎖是進程死鎖的簡稱,是由Dijkstra於1965年研究銀行家算法時首先提出來的。它是計算機操作系統乃至並發程序設計中最難處理的問題之壹。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。

1.什麽是死鎖

我們先看看這樣壹個生活中的例子:在壹條河上有壹座橋,橋面較窄,只能容納壹輛汽車通過,無法讓兩輛汽車並行。如果有兩輛汽車A和B分別由橋的兩端駛上該橋,則對於A車來說,它走過橋面左面的壹段路(即占有了橋的壹部分資源),要想過橋還須等待B車讓出右邊的橋面,此時A車不能前進;對於B車來說,它走過橋面右邊的壹段路(即占有了橋的壹部分資源),要想過橋還須等待A車讓出左邊的橋面,此時B車也不能前進。兩邊的車都不倒車,結果造成互相等待對方讓出橋面,但是誰也不讓路,就會無休止地等下去。這種現象就是死鎖。如果把汽車比做進程,橋面作為資源,那麼上述問題就描述為:進程A占有資源R1,等待進程B占有的資源Rr;進程B占有資源Rr,等待進程A占有的資源R1。而且資源R1和Rr只允許壹個進程占用,即:不允許兩個進程同時占用。結果,兩個進程都不能繼續執行,若不采取其它措施,這種循環等待狀況會無限期持續下去,就發生了進程死鎖。

在計算機系統中,涉及軟件,硬件資源都可能發生死鎖。例如:系統中只有壹臺CD-ROM驅動器和壹臺打印機,某壹個進程占有了CD-ROM驅動器,又申請打印機;另壹進程占有了打印機,還申請CD-ROM。結果,兩個進程都被阻塞,永遠也不能自行解除。

所謂死鎖,是指多個進程循環等待它方占有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個進程都將永遠處於封鎖狀態。從上面的例子可以看出,計算機系統產生死鎖的根本原因就是資源有限且操作不當。即:壹種原因是系統提供的資源太少了,遠不能滿足並發進程對資源的需求。這種競爭資源引起的死鎖是我們要討論的核心。例如:消息是壹種臨時性資源。某壹時刻,進程A等待進程B發來的消息,進程B等待進程C發來的消息,而進程C又等待進程A發來的消息。消息未到,A,B,C三個進程均無法向前推進,也會發生進程通信上的死鎖。另壹種原因是由於進程推進順序不合適引發的死鎖。資源少也未必壹定產生死鎖。就如同兩個人過獨木橋,如果兩個人都要先過,在獨木橋上僵持不肯後退,必然會應競爭資源產生死鎖;但是,如果兩個人上橋前先看壹看有無對方的人在橋上,當無對方的人在橋上時自己才上橋,那麼問題就解決了。所以,如果程序設計得不合理,造成進程推進的順序不當,也會出現死鎖。

2.產生死鎖的必要條件

從以上分析可見,如果在計算機系統中同時具備下面四個必要條件時,那麼會發生死鎖。換句話說,只要下面四個條件有壹個不具備,系統就不會出現死鎖。

〈1〉互斥條件。即某個資源在壹段時間內只能由壹個進程占有,不能同時被兩個或兩個以上的進程占有。這種獨占資源如CD-ROM驅動器,打印機等等,必須在占有該資源的進程主動釋放它之後,其它進程才能占有該資源。這是由資源本身的屬性所決定的。如獨木橋就是壹種獨占資源,兩方的人不能同時過橋。

〈2〉不可搶占條件。進程所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源占有者手中奪取資源,而只能由該資源的占有者進程自行釋放。如過獨木橋的人不能強迫對方後退,也不能非法地將對方推下橋,必須是橋上的人自己過橋後空出橋面(即主動釋放占有資源),對方的人才能過橋。

〈3〉占有且申請條件。進程至少已經占有壹個資源,但又申請新的資源;由於該資源已被另外進程占有,此時該進程阻塞;但是,它在等待新資源之時,仍繼續占用已占有的資源。還以過獨木橋為例,甲乙兩人在橋上相遇。甲走過壹段橋面(即占有了壹些資源),還需要走其余的橋面(申請新的資源),但那部分橋面被乙占有(乙走過壹段橋面)。甲過不去,前進不能,又不後退;乙也處於同樣的狀況。

〈4〉循環等待條件。存在壹個進程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某壹資源,P2等待P3所占有的某壹源,......,而Pn等待P1所占有的的某壹資源,形成壹個進程循環等待環。就像前面的過獨木橋問題,甲等待乙占有的橋面,而乙又等待甲占有的橋面,從而彼此循環等待。

上面我們提到的這四個條件在死鎖時會同時發生。也就是說,只要有壹個必要條件不滿足,則死鎖就可以排除。

8.2死鎖的預防

前面介紹了死鎖發生時的四個必要條件,只要破壞這四個必要條件中的任意壹個條件,死鎖就不會發生。這就為我們解決死鎖問題提供了可能。壹般地,解決死鎖的方法分為死鎖的預防,避免,檢測與恢復三種(註意:死鎖的檢測與恢復是壹個方法)。我們將在下面分別加以介紹。

死鎖的預防是保證系統不進入死鎖狀態的壹種策略。它的基本思想是要求進程申請資源時遵循某種協議,從而打破產生死鎖的四個必要條件中的壹個或幾個,保證系統不會進入死鎖狀態。

  • 上一篇:啟動illustraterCS是彈出0x18642e9指令引用的0xb87ec590內存不能為read
  • 下一篇:涿州職教有什麽專業?
  • copyright 2024編程學習大全網