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

php開發如何避免檔案死鎖

Sep 26, 2019 pm 05:40 PM
php 死鎖 避免

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

為了進行文件上傳,我們將使用表單助理。這是文件上傳的範例。

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

See all articles