Intro

必須滿足以下所有條件 :

  • Mutual Exclusion : 獨佔資源
  • Hold and wait : request不滿足時不會release現有資源
  • No preemption : 不能強制收回資源
  • Circular waiting : 存在round概念,每個process都在等別人

處理方式

Prevention

  • 破壞mutual exclusion : 共享資源
  • 破壞hold and wait : request之前先release
  • Preemption : 強制收回
  • 破壞circular waiting : 對Allocation設定線性順序

Avoidance

Banker’s Algorithm

假定系統處在Safe state, 若分配後導致不安全,則拒絕

維護Available, Max, Allocation, Need, 其中 :

$$ Need[i][j] = Max[i][j]-Allocation[i][j] $$

流程如下 :

  • Initial check
    • $Request[i] \leq Need[i]$
    • $Request[i] \leq Available$
  • Tentative allocation
    • 假設暫時分配如下(還沒分配)
    • $Available = Available - Request[i]$
    • $Allocation[i] = Allocation[i] + Request[i]$
    • $Need[i] = Need[i] - Request[i]$
  • Safety check
    • 搜尋安全順序
    • 假設 $Work=Available, \quad Finish[i]=false$
    • 對所有process遍歷, 若滿足則 $Work = Work + Allocation[i]; Finish[i]=true$
    • 如果結束時所有 $Finish[i]=true$ 則系統安全
  • Allocate
    • 檢查通過才會分配

Detection

  • Single : 對RAG做拓樸排序, 如無法偵測到環則無deadlock
  • Multiple : 檢查unsafe state (Banker’s Algo)

Recovery

  • Terminate process : 殺到沒有deadlock
  • Preempt resource

Ignore

  • Modern OS ignore deadlock
    • 使用者需要手動重啟Windows