死鎖相關知識的學習

死鎖的概念

一組進程中,每個進程都無限等待被改組進程中另一個進程所佔有的資源,因而永遠無法得到的資源,這種現象稱爲進程死鎖,這一組進程就稱爲死鎖進程。

如果死鎖發生,會浪費大量系統資源,甚至導致系統崩潰。

需要注意:

  • 參與死鎖的所有進程都在等待資源
  • 參與死鎖的進程是當前系統中所有進程的子集

死鎖出現的原因:

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佔有的資源,形成一個進程的等待環路

發佈了29 篇原創文章 · 獲贊 12 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章