死結

等待圖(wait-for graph)

資源配置圖同時呈現行程與資源,但有時你只在意誰在等「誰」,而不在意等什麼。於是你把資源摺疊掉:只畫行程,並在第一個行程正等著第二個所持有之物時,從前者畫一支箭指向後者。結果是一張更精簡的圖——等待圖——它讓死結的環一眼就跳出來。

精確地說,等待圖是把資源配置圖去掉資源節點、並「短接」穿過它們而得:當 Pi 在等一個 Pj 目前持有的資源時(亦即 Pi 對某資源 R 有一條請求邊,而 R 對 Pj 有一條配置邊),就存在邊 Pi -> Pj。死結存在,當且僅當這張圖含有一個環,而找出環就是經典的圖論環偵測問題,可在與節點數加邊數成正比的時間內完成。作業系統可以漸進地維護這張圖,並定期對它跑環偵測。

關鍵而誠實的限制:等待圖只對單一實例的資源類型有效。那次摺疊假設「等著 Pj 持有的資源 R」就等於「特別地等著 Pj」。但若 R 有好幾個實例、由好幾個行程持有,那麼 Pi 是在等其中「任何一個」釋放,而非等某個特定的 Pj——於是單一的 Pi -> Pj 邊不再如實反映情況,環也就不再可靠地代表死結。對多實例系統,你必須捨棄等待圖,改用更一般的矩陣式偵測(銀行家式的「完成並回收」掃描)。

若資源配置圖中 P1 請求 R1(由 P2 持有)、P2 請求 R2(由 P1 持有),等待圖就摺疊成 P1 -> P2 與 P2 -> P1——一個長度為二的環,因而是死結。

把資源從資源配置圖中摺疊掉,得到等待圖;有環即代表死結。

等待圖及其環測試只對單一實例資源有效。多實例時,環不再可靠地代表死結——改用矩陣式偵測。

又称
WFGprocess wait-for graph行程等待圖