之前的部落格都多次提到了死鎖問題,那麼我們先來了解一下。
什麼是死鎖?
其實死鎖是指在多道程式系統中,一組程序中的每乙個程序均無期限的等待被該組程序中的另乙個程序所占有且永遠不會釋放的資源,執行緒一樣。這種現象稱系統處於死鎖狀態,簡稱死鎖。處於死鎖狀態的程序稱為死鎖程序。
產生死鎖的四個必要條件:
其實死鎖產生:1.資源競爭,2.多道程式執行時的程序推進順序不合理。
也就是4個必要條件:
(1)互斥使用資源。
資源是獨佔且排他使用,程序/執行緒互斥使用資源,即任意時刻乙個資源只能給乙個程序使用,其他程序若申請乙個資源,而資源被領乙個程序占有時,則申請者等待,知道資源被占用者釋放
(2)請求和保持資源
程序每次申請他所需要一部分資源,在申請新的資源同時,繼續占用已分配到的資源。
(3)不可搶奪資源
程序所獲得的資源在未使用完畢之前,不能被其他程序強行剝奪,只能由獲得程序自願釋放
(4)迴圈等待資源。
又稱環路等待。在發生死鎖時,必然存在乙個程序等待佇列,其中p1等待p2占有資源,p2等待p3占有資源...pn等待p1占有資源,形成乙個程序等待環路。環路中每乙個程序已占有的資源同時被另乙個程序所申請,即前乙個程序占有後乙個程序所申請的資源。
記住,這4個條件是必要條件,只要系統發生死鎖,則以上四個條件至少有乙個成立。
既然會產生死鎖問題,那麼如何解決死鎖呢?
(1)預防死鎖:破壞4個死鎖的必要條件,(1)為資源使用的固有特性,無法改變。
1.破壞「不可剝奪條件」。
2.破壞「請求和保持」
3.破壞「迴圈等待」
(2)死鎖避免:
1.設定狀態安全。
2.採用銀行家演算法。
(3)死鎖檢測與解除:
死鎖檢測:
1.為每乙個程序和每個資源指定唯一編號。
2.設定資源分配狀態表,每個表目包含「資源號」和占有該資源的「程序號」,資源分配表中記錄了每個資源正在被那個程序所占有
3.設定一張程序等待分配表,每個表目包含「程序號」和該程序所等待的「資源號」。
4.死鎖檢測演算法:當任一程序pj申請乙個已被其他程序占用的資源ri時,進行死鎖檢測,檢測演算法通過反覆查詢資源分配表和程序等待表,來確定程序pj對資源ri的申請是否導致形成環路,若是,則確定出現死鎖。
死鎖解除:
1.剝奪資源
(1)還原演算法
(2)建立檢查點。
2.撤銷程序。
本文出自 「剩蛋君」 部落格,請務必保留此出處
php死鎖問題
背景 對於死鎖的問題,人們往往想到出現一些關於訪問很緩慢,有白頁現象,要是測試環境 我就真實遇到測試環境有本文談及一樣的問題 你也就重啟一下php的php fpm程序發現又好了,隔一段時間又出類似的問題,你會看下日誌,你會發現有很多日誌是 max execution timeout of 60 se...
SPIN LOCK死鎖問題
板卡公升級版本後,初始化疑似未執行完,ssh無法連線,可以ping通。通過檢視控制台的列印,可以看到,初始化執行到了57一半,就卡住了。兩次控制台輸入i 這個命令是我們內部實現的,功能和vxworks的類似,列印一些任務狀態 只有pid為1785的程式執行時間在增長,懷疑任務陷入死迴圈。控制台檢視其...
執行緒死鎖問題
所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局,多個執行緒被無限的阻塞,執行緒之間相互等待所需的資源,若無外力作用,這些程序都將無法向前推進。死鎖的產生,通常是下面的兩種情況 1.如果執行緒試圖對同乙個互斥量加鎖兩次,那麼它自身就會陷入死鎖狀態,使用互斥量時,2.如果程式使用多個互斥量時,如果允許...