資源配置圖(resource-allocation graph)
假設你想畫一張圖,描繪在一個忙碌的共享廚房裡,此刻誰擁有什麼、誰又在等什麼。你可以為每位廚師畫一個點、為每件電器畫一個方框,然後從電器畫一支箭指向正在用它的廚師(「這台烤箱配給了 Ann」),再從廚師畫一支箭指向他正在等的電器(「Bob 正在請求攪拌機」)。那張圖正是資源配置圖,順著它的箭頭走,就能看出大家是否卡住了。
形式上,資源配置圖有兩種節點:行程節點(畫成圓圈)與資源類型節點(畫成矩形,框內為該類型的每個實例各放一個點)。它有兩種有向邊。請求邊(request edge)從行程指向資源類型(Pi 正在請求 Rj 的一個實例)。配置邊(assignment edge)從某個資源的特定實例指向行程(Rj 的一個實例已授予 Pi)。當請求被允許,請求邊就翻轉成配置邊;當資源被釋放,那條邊就消失。這張圖就是請求/使用/釋放循環的即時帳本。
重點來了,誠實地說:若圖中沒有環,就一定沒有死結。若有環,那要看情形:當每種資源類型都只有單一實例時,環既是必要也是充分的——有環就是死結,沒有例外。但當某種資源類型有多個實例時,環只代表死結的可能性、而非確定性,因為持有環中某資源之另一實例的別的行程,可能把它釋放、打斷迴圈。所以「找到環」對單一實例系統是精確的判決,對多實例系統則只是一面警示旗。
P1 -> R1(P1 請求 R1)、R1 -> P2(R1 配給 P2)、P2 -> R2(P2 請求 R2)、R2 -> P1(R2 配給 P1)。順著箭頭走形成一個環 P1 -> R1 -> P2 -> R2 -> P1;若 R1 與 R2 各只有一個實例,這就是死結。
資源配置圖中的一個環:在單一實例資源下,有環即代表死結。
沒有環就一定沒有死結。有環只有在單一實例資源下才代表死結;多實例時環只是可能性,並非證明。