學習進程的同步的時突然變的很浮躁,今天先跳到死鎖
Deadlock 死鎖
一組被阻塞的進程,每個進程持有一個資源,並等待獲取集合中另一個進程持有的資源。
資源是什麼?
操作系統中的一切都是資源
硬件資源 軟件資源等等等等各種資源。
進程使用資源的過程:
Request open(), malloc(), wait() 請求資源
use 使用資源
Release 釋放資源 close(), free(), signal()
平時就算定義一個整數,比如int a這樣,也都有着進程使用資源的所有過程,只不過編譯器在定義語法的時候已經幫助我們搞定了。
棧溢出
void* thread1(void * param){
for( ; ; ){
pthread_mutex_lock(&mutex1);
pthread_mutex_lock(&mutex2);
value++;
pthread_mutex_unlock(&mutex1);
pthread_mutex_unlock(&mutex2);
}
}
void* thread2(void * param){
for( ; ; ){
pthread_mutex_lock(&mutex2);
pthread_mutex_lock(&mutex1);
value++;
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
}
}
很明顯,上面的樣例就會造成死鎖。
死鎖發生的四個基本條件:
互斥條件 : 在任意時刻只有一個進程使用
保持等待:吃着碗裏的看着鍋裏的
不可剝奪:一個資源被拿到後不會被強行剝奪
循環等待:一推進程在循環等待
有環的話可能有死鎖,沒環一定沒死鎖。
有環的時候:
如果每個資源只有一個。
如果每個資源有多個,就不一定了。
接下來進入重點
怎麼解決死鎖。
Deadlock prevention 死鎖阻止
Deadlock aviodance 死鎖避免
這倆是死鎖永遠不會發生
Deadlock
請聽下回分解。。