# 死結 Deadlock
一群task,彼此等待。
當印表機已經分配給行程P2了,等待磁碟機接受要求才能繼續,但此時磁碟機已分配給行程P1,P1必須等待印表機接受要求才能繼續。P2在等待P1佔有的磁碟機,P1在等待P2佔有的印表機,這樣互相等待的狀態為死結。

## 死結特性
死結構成的必要條件
1. 至少有一項資源是不可分享且互斥的
2. 一個行程必定已持有至少一項資源,且還在等待另一些被其他行程持有的資源,產生持有和等待的現象>
3. 已被分配的資源無法被強行搶走
4. 行程循環式等待
圖一
此圖沒有產生迴圈(因為P2可以出迴圈到R3)
圖二
此圖有產生迴圈(P2->R3->P3->R2->P2)

## 死結防止
使必要條件至少有一項不會發生
### 互斥
一般無法改變互斥條件來防止死結,因為有些資訊先天就是不可分享的,像是印表機。
### 持有和等待
1. 不可分次要求
2. 持有後若要要求資源必須先釋放已持有的資源
缺點:資源使用率很低&產生飢餓的情況
很可能一個行程所需的資源之一總是分配給其他行程,導致持續等待
### 不可搶奪No preemption
1. 持有後若要要求資源,那它所有的資源必須全部被搶奪
2. 行程要求的時候系統會檢查此資源是否可用
基本上只適用在CPU和記憶體資源,不適合應用在印表機或磁碟機等資源。此方法也有可能會造成某個行程飢餓
### 循環式等待
1. 將所有資源強迫排序,行程要求資源的時候必須照順序來要求
## 死結避免

## 死結偵測
{"metaMigratedAt":"2023-06-18T02:07:05.951Z","metaMigratedFrom":"Content","title":"死結 Deadlock","breaks":true,"contributors":"[{\"id\":\"cf3e4a44-322f-4620-80ec-b2a2091da3c4\",\"add\":769,\"del\":0}]"}