死鎖:死鎖是指多個資源之間互相等待對方的資源,而在得到對方的資源之前又不釋放自己的資源,這樣,造成迴圈等待的一種現象,如果所有程序都在互相等待乙個不可能發生的事件,則程序就死鎖了。
死鎖產生的必要條件:
1. 互斥條件:程序對資源進行排他性使用,即在一段時間內對某資源僅為乙個程序所占用
2. 請求和保持條件:當程序因請求資源而阻塞時,對已獲得得資源保持不放
3. 不可剝奪條件:程序已獲得得資源子啊未使用之前,不能被剝奪,只能夠在使用完時由自己釋放
防止死鎖辦法:
1. 資源一次性分配(破壞請求和保持條件)
2. 可剝奪資源(破壞不可剝奪條件)
3. 資源有序分配法*(破壞迴圈等待條件)
死鎖避免
1. 預防死鎖的幾種策略,會嚴重損壞系統效能(比如一次性分配資源)。因此在避免死鎖時,要施加較弱的限制,從而獲得滿意的效能。
2. 由於在避免死鎖的策略中,允許近場動態地申請資源。因而,系統在分配資源之前會預先計算資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給程序,否則,程序等待。其中最具有代表性的避免**演算法是銀行家演算法。
銀行家演算法:
1 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可以接納該顧客。
2 客戶可以分期貸款,但貸款總數不能超過最大需求量。
3 當銀行家現有的資金不能滿足顧客尚需的貸款總額時,對顧客的貸款可推遲支付,但總能是顧客在有限的時間裡獲得貸款。
4 當顧客得到所需要的全部資金後,一定能在有限的時間裡歸還所有的資金。
哲學家就餐問題:
問題:五個哲學家圍在乙個圓桌就餐,每個人都必須拿起兩把叉子才能就餐。
1. 服務生解法
2. 最多四個哲學家
3. 僅當乙個哲學家兩邊都有筷子可用時才允許他拿筷子
4. 給所有哲學家編號,奇數號的哲學家必須首先拿左邊的筷子,偶數號的先拿右邊的筷子。
下面給出使用訊號量來解決該問題的程式:
#include#include #include #include #include#include#include#include#include#include#define err_exit(m) dowhile(0)
#define delay (rand()%5+1)
union semun
;int semid;//訊號量id
int sem_p(int no)
; int ret=semop(semid,&sb,1);
if(ret==-1)err_exit("semop");
return ret;
}void wait_for_2fork(int no)
,};//拿起筷子,因此第left,right訊號量減一
semop(semid,buf,2);//p操作,若果能同時拿起兩個筷子,就不用等待
}void free_2fork(int no)
,};//放下筷子,因此第left,right訊號量加一
semop(semid,buf,2);//v操作,同時放下兩隻筷子
}int philosephere(int no)
}int main(int argc,char *argv)
}// printf("no=%d\n",no);
philosephere(no);
return 0;
}
死鎖 哲學家就餐問題
在 死鎖 這一篇文章中,我們學習了死鎖相關的理論知識,本篇文章來看看死鎖案例 哲學家就餐問題,這篇文章主要來討論就餐問題的死鎖和多種死鎖修復的方法。看上圖,有五位哲學家,面前都有乙個盤子,盤子左邊和右邊都有一根筷子,他們在吃麵之前需要先拿起左邊的筷子再拿起右邊的筷子,有了一雙筷子就可以吃麵了。上面流...
哲學家就餐問題
本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...
哲學家就餐問題
pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...