死鎖的概念
一組進程中,每個進程都無限等待被改組進程中另一個進程所佔有的資源,因而永遠無法得到的資源,這種現象稱爲進程死鎖,這一組進程就稱爲死鎖進程。
如果死鎖發生,會浪費大量系統資源,甚至導致系統崩潰。
需要注意:
- 參與死鎖的所有進程都在等待資源
- 參與死鎖的進程是當前系統中所有進程的子集
死鎖出現的原因:
1.資源數量有限、鎖和信號量錯誤使用
1.1 資源的使用方式: “申請-分配-使用-釋放”模式
- 可重用資源:可被多個進程多次使用:
- 可搶佔資源和不可搶佔資源
- 例如:處理器、I/O部件、內存、文件、數據庫、信號量
- 可消耗資源:只可使用一次,可創建和銷燬的資源
- 例如:信號、中斷、消息
1.2 進程競爭可重用資源
例子1:
其中 T:磁盤設備;D: 磁帶設備;
進程Q申請到了磁帶設備再等待磁盤文件,而P申請到了磁盤文件,等待磁帶設備。兩個互相等待就出現了死鎖現象。
例子2:
其中現在系統可分配內存爲200KB
如果P1申請到80KB,P2申請到70KB,他們要接着申請剩餘需要的資源,都申請不到 ,均要等待,會出現死鎖現象。
1.3 進程競爭可消耗資源
活鎖和飢餓:
// 應用Peterson算法
void process_A
{
enter_region(&resource_1); //獲取資源的使用權
enter_region(&resource_2);
use_both_resource();
leave_region(&resource_2);
leave_region(&resource_1);
}
void process_B
{
enter_region(&resource_2);
enter_region(&resource_1);
use_both_resource();
leave_region(&resource_1);
leave_region(&resource_2);
}
活鎖現象:
- 先加鎖;
- 再輪詢;
- ——>即無進展也沒有阻塞
飢餓:
資源分配策略決定的
產生死鎖的四個必要條件:
互斥使用(資源獨佔):
一個資源每次只能給一個進程使用佔有且等待(請求和保持,部分分配):
進程在申請新的資源的同時保持對原有資源的佔有不可搶佔(不可剝奪):
資源的申請者不能強行的從資源佔有者手中奪取資源,資源只能由佔有者資源釋放循環等待:
存在一個進程等待隊列{P1,P2,P3,…,Pn},其中P1等待P2佔有的資源,P2等待P3佔有的資源,…,Pn等待P1佔有的資源,形成一個進程的等待環路