產生死鎖的根本原因?
計算機系統中產生死鎖的根本原因是什麼?
如果一個進程集合裡面的每個進程都在等待只能由這個集合中的其他一個進程(包括他自身)才能引發的事件,這種情況就是死鎖。
死鎖的四個必要條件
互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。
非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
循環等待條件(C埂rcular wait):系統中若干進程組成環路,改環路中每個進程都在等待相鄰進程正佔用的資源。
計算機系統中產生死鎖的根本原因是什麼
1,如果一個進程集合裡面的每個進程都在等待只能由這個集合中的其他一個進程(包括他自身)才能引發的事件,這種情況就是死鎖。死鎖的四個必要條件互斥條件(Mutualexclusion):資源不能被共享,只能由一個進程使用。請求與保持條件(Holdandwait):已經得到資源的進程可以再次申請新的資源。非剝奪條件(Nopre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。循環等待條件(Circularwait):系統中若干進程組成環路,改環路中每個進程都在等待相鄰進程正佔用的資源。明顯第一個對的
什麼是死鎖,簡述死鎖發生的四個必要條件,如何避免死鎖
產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則
就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和
解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確
定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態 的情況下佔用資源。因此,對資源的分配要給予合理的規劃。
操作系統判斷題!求大神!
雖然曾經學過計算機操作系統,但是畢竟好多年沒有摸過了。這裡根據自己的一點兒理解寫一下判斷題的答案,僅供你個人參考。
1、對;2、錯;3、錯;4、對;5、對;6、對;7、錯;8、對;9、對;10、錯。
操作系統判斷題 1.死鎖產生的根本原因是對互斥資源的共享、併發進程的同步關係不當。 2.若不採用互
1,如果一個進程集合裡面的每個進程都在等待只能由這個集合中的其他一個進程(包括他自身)才能引發的事件,這種情況就是死鎖。
死鎖的四個必要條件
互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。
非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
循環等待條件(Circular wait):系統中若干進程組成環路,改環路中每個進程都在等待相鄰進程正佔用的資源。
明顯第一個對的
你們可以告訴我:體育隊員在訓練期間吃什麼菜嗎?
這個沒有一個固定的答案吧,因為國際運動員很多時福都不在國內比賽,所以他們的食譜也總是在改變的。還有就是由於項目的不同運動員之間的食譜差異也很大吧。
如何理解Java中的死鎖
死鎖是這樣一種情形:多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由於線程被無限期地阻塞,因此程序不可能正常終止。
導致死鎖的根源在於不適當地運用“synchronized”關鍵詞來管理線程對特定對象的訪問。“synchronized”關鍵詞的作用是,確保在某個時刻只有一個線程被允許執行特定的代碼塊,因此,被允許執行的線程首先必須擁有對變量或對象的排他性的訪問權。當線程訪問對象時,線程會給對象加鎖,而這個鎖導致其它也想訪問同一對象的線程被阻塞,直至第一個線程釋放它加在對象上的鎖。
由於這個原因,在使用“synchronized”關鍵詞時,很容易出現兩個線程互相等待對方做出某個動作的情形。代碼一是一個導致死鎖的簡單例子。
//代碼一
class Deadlocker {
int field_1;
private Object lock_1 = new int[1];
int field_2;
private Object lock_2 = new int[1];
public void method1(int value) {
“synchronized” (lock_1) {
“synchronized” (lock_2) {
field_1 = 0; field_2 = 0;
}
}
}
public void method2(int value) {
“synchronized” (lock_2) {
“synchronized” (lock_1) {
field_1 = 0; field_2 = 0;
}
}
}
}
參考代碼一,考慮下面的過程:
◆ 一個線程(ThreadA)調用method1()。
◆ ThreadA在lock_1上同步,但允許被搶先執行。
◆ 另一個線程(ThreadB)開始執行。
◆ ThreadB調用method2()。
◆ ThreadB獲得lock_2,繼續執行,企圖獲得lock_1。但ThreadB不能獲得lock_1,因為ThreadA佔有lock_1。
◆ 現在,ThreadB阻塞,因為它在等待ThreadA釋放lock_1。
◆ 現在輪到ThreadA繼續執行。ThreadA試圖獲得lock_2,但不能成功,因為lock_2已經被ThreadB佔有了。
◆ ThreadA和ThreadB都被阻塞,程序死鎖。
當然,大多數的死鎖不會這麼顯而易見,需要仔細分析代碼才能看出,對於規模較大的多線程程序來說尤其如此。好的線程分析工具,例如JProbe Threadalyzer能夠分析死鎖並指出產生問題的代碼位置。
隱性死鎖
隱性死鎖由於不規範的編程方式引起,但不一定每次測試運行時都會出現程序死鎖的情形。由於這個原因,一些隱性死鎖可能要到應用正式發佈之後才會被發現,因此它的危害性比普通死鎖更大。下面介紹兩種導致隱性死鎖的情況:加鎖次序和佔有並等待。
加鎖次序
當多個併發的線程分別試圖同時佔有兩個鎖時,會出現加鎖次序衝突的情形。如果一個線程佔有了另一個線程必需的鎖,就有可能出現死鎖。考慮下面的情形,ThreadA和ThreadB兩個線程分別需要同時擁有lock_1、lock_2兩個鎖,加鎖過程可能如下:
◆ ThreadA獲得lock_1;
◆ ThreadA被搶佔,V......
數據庫,因為高訪問量,造成線程死鎖的原因是,如何來解除呢?
死鎖主要是資源共享造成的衝突。比如a擁有資源1,需要資源2才能運行。
b擁有資源2,需要資源1才能。這是就產生資源1、2都有,叮a,b都無法運行的情況。解決死鎖的方法有很多,你要了解更多的信息就去看看操作系統的數。裡面講的很詳細。
數據庫中解決死鎖的方法:
1.限制同時訪問數據庫的用戶數。
2.超時線程自動釋放。
3.優化訪問方式.
JAVA多線程死鎖問題
1. Java中導致死鎖的原因
Java中死鎖最簡單的情況是,一個線程T1持有鎖L1並且申請獲得鎖L2,而另一個線程T2持有鎖L2並且申請獲得鎖L1,因為默認的鎖申請操作都是阻塞的,所以線程T1和T2永遠被阻塞了。導致了死鎖。這是最容易理解也是最簡單的死鎖的形式。但是實際環境中的死鎖往往比這個複雜的多。可能會有多個線程形成了一個死鎖的環路,比如:線程T1持有鎖L1並且申請獲得鎖L2,而線程T2持有鎖L2並且申請獲得鎖L3,而線程T3持有鎖L3並且申請獲得鎖L1,這樣導致了一個鎖依賴的環路:T1依賴T2的鎖L2,T2依賴T3的鎖L3,而T3依賴T1的鎖L1。從而導致了死鎖。
從這兩個例子,我們可以得出結論,產生死鎖可能性的最根本原因是:線程在獲得一個鎖L1的情況下再去申請另外一個鎖L2,也就是鎖L1想要包含了鎖L2,也就是說在獲得了鎖L1,並且沒有釋放鎖L1的情況下,又去申請獲得鎖L2,這個是產生死鎖的最根本原因。另一個原因是默認的鎖申請操作是阻塞的。
2. Java中如何避免死鎖
既然我們知道了產生死鎖可能性的原因,那麼就可以在編碼時進行規避。Java是面向對象的編程語言,程序的最小單元是對象,對象封裝了數據和操作,所以Java中的鎖一般也是以對象為單位的,對象的內置鎖保護對象中的數據的併發訪問。所以如果我們能夠避免在對象的同步方法中調用其它對象的同步方法,那麼就可以避免死鎖產生的可能性。如下所示的代碼,就存在死鎖的可能性:
public class ClassB {
private String address;
// ...
public synchronized void method1(){
// do something
}
// ... ...
}
public class ClassA {
private int id;
private String name;
private ClassB b;
// ...
public synchronized void m1(){
// do something
b.method1();
}
// ... ...
}
上面的ClassA.m1()方法,在對象的同步方法中又調用了ClassB的同步方法method1(),所以存在死鎖發生的可能性。我們可以修改如下,避免死鎖:
public class ClassA {
private int id;
private String name;
private ClassB b;
// ...
public void m2(){
synchronized(this){
// do something
}
b.method1();
}
// ... ...
}
這樣的話減小了鎖定的範圍,兩個鎖的申請就沒有發生交叉,避免了死鎖的可能性,這是最理性的情況,因為鎖沒有發生交叉。但是有時是不允許我們這樣做的。此時,如果只有ClassA中只有一個m1這樣的方法,需要同時獲得......
C++中如何控制多線程對共享資源的訪問,進程死鎖產生的原因是什麼?
1.創建事件對象或互斥對象
(創建一個全局標記(無論什麼都可以,對象,變量),看是否有其他線程使用,注意,使用後必須重置標記
)
例子:
WaitS貳gnal();等待資源
SetSignal();把資源設置成正在使用
...代碼;
ReleaseSighal();重置資源,這樣其他資源都可以使用
2.各線程含有一部分資源,但仍需要(等待)其他線程的資源。
比如:有兩個資源,汽車和車鑰匙
A有車,B有車鑰匙
但他們都不把擁有的資源給對方,這樣他們都不能開車,即死鎖。