首頁 >後端開發 >PHP問題 >php開發如何避免檔案死鎖

php開發如何避免檔案死鎖

王林
王林原創
2019-09-26 17:40:042035瀏覽

php開發如何避免檔案死鎖

死鎖

死鎖,它是作業系統或軟體運作的狀態:在多任務下,當一個或多個行程等待系統資源而資源又被系統本身或其它行程佔用時,就形成了死鎖。死鎖發生的最常見形式是兩個或多個執行緒等待被另一個執行緒佔用的資源:

php開發如何避免檔案死鎖

#如果兩個順序同時發生,執行緒1將永遠無法取得鎖B,因為鎖B被線程2佔有。同時線程2也永遠無法獲得鎖A,因為鎖A被線程1擁有。

死鎖產生的條件

死鎖的發生必須具備以下四個條件:

①互斥條件:指處理程序對所分配到的資源進行排它性使用,即在一段時間內某資源只被一個程序佔用。如果此時還有其它程序請求資源,則請求者只能等待,直到佔有資源的程序用完釋放。

②請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其他進程佔用,此時請求進程阻塞,但又對自己已獲得的資源保持不放。

③不剝奪條件:指進程已獲得的資源,在使用結束之前,不能被剝奪,只能在使用結束之後自己釋放。

④環路等待條件:指在發生死鎖時,必然存在一個進程-資源的環形鏈,即進程集合{P0,P1,…,Pn}中的P0正在等待一個P1所佔用的資源,P1正在等待P2所佔用的資源,…,Pn正在等待P0所佔用的資源。

如何避免和處理死鎖

預防死鎖:預防死鎖的方法是讓四個條件中的第二、三、四個條件之一不能成立,來避免發生死鎖。

①加鎖定順序:依相同順序加鎖。

當多個進程需要相同的多個鎖,又依照不同的順序加鎖時,就很容易發生死鎖。如果能保證所有的進程都按照相同的順序獲得鎖,那麼死鎖就不會產生。

②加鎖定時限:進程嘗試取得鎖定時加上一定的時限。

也就是說如果申請鎖時超過了這個時限,該程序就放棄對該鎖的請求,並釋放所有已經獲得的鎖。然後過一 段隨機的時間後重試。這段隨機的時間讓它它線程有機會嘗試獲得相同的鎖,並且讓該應用程式在沒有獲得鎖的時候繼續進行。問題是,如果有非常多的進程在同一時間去競爭同一批資源,即使有逾時和回退機制,還是可能會存在某些進程反覆嘗試卻始終得不到鎖的問題。

避免死鎖:該方法是同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,以避免發生死鎖。

死鎖偵測:它主要針對那些無法實現依序加鎖且加鎖時限也不可行的情況。

透過設定的偵測機構,及時偵測出死鎖的發生,並精確地確定與死鎖有關的進程和資源。然後採取適當措施從系統中將已發生的死鎖清除掉。

每當一個進程獲得了鎖,就會在進程和鎖的相關資料結構中記下。並且,每當有進程請求鎖,就會記錄在這個資料結構中。當一個進程請求鎖失敗時,該執行緒可以遍歷進程和鎖的資料結構確認是否發生死鎖。

例如:

進程A請求鎖定2,但鎖2倍進程B佔有,於是進程A等待進程B。同理,進程B等待進程C,進程C等待進程D,進程D等待進程A。進程A為了偵測死鎖,它需要遞進地偵測所有被B請求的鎖。從進程B請求的所開始,進程A找到了進程C,然後找到了進程D。發現進程D請求的鎖被進程A自己佔有,這樣偵測到發生了死鎖。

當進程A偵測到發生死鎖之後,一個可行的方法是進程A釋放自己佔有的鎖,回退,然後經過一段隨機的時間後重試。這和加鎖時限相似,不同是死鎖已經發生了。

死鎖解除:這是與偵測死鎖相符的一種措施

當發現有進程死鎖時,應立即把它們從死鎖狀態中解脫出來。

一種方法是,剝奪資源。從其它進程剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態。      

#

還有一種方法是,撤銷進程。最簡單的撤銷進程的方法是使全部死鎖進程都夭折掉;稍微溫和一點的方法是按照某種順序逐個地撤銷進程,這只有足夠的資源可用。

推薦教學:PHP影片教學

#

以上是php開發如何避免檔案死鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn