死結

鴕鳥演算法(ostrich algorithm)

有一個古老(且對真實鴕鳥不公平)的形象:鴕鳥把頭埋進沙裡,假裝危險不存在。鴕鳥演算法就是對作業系統處理死結之策略的戲謔稱呼,因為它做的正是這件事:假裝死結從不發生,完全不採取任何特別預防,而萬一真的發生,就交給使用者或操作員去察覺、然後手動重開機或終止行程。

它其實不是一種「演算法」,而是一種刻意的「不作為」:沒有預防規則、沒有避免的記帳、沒有偵測掃描、沒有自動復原。系統就只是自由地配置資源、然後寄望順利。其理由是一筆成本效益的算計。死結預防限制了程式可以怎麼跑;避免要求宣告最大需求並對每筆請求做昂貴的安全檢查;偵測與復原耗用 CPU,且可能必須終止行程、損失工作。若死結在實務上罕見,一直付這些成本中的任何一項,可能遠比偶爾手動清理更昂貴。多數通用作業系統——包括主流的 UNIX、Linux 與 Windows 核心,對一般資源使用——都選這條路。

這是整個主題誠實、有時令人意外的妙語收尾:優雅的銀行家演算法與四條件理論,多半是為了理解而教,而真實系統通常「無視」死結。這是工程判斷,而非懶惰——它以承受一個罕見卡死的小風險,去換取避開替代方案那持續的額外成本與僵化。在卡死後果不堪設想之處(攸關生命或硬即時系統)它是糟糕的選擇;而它也悄悄仰賴一個事實:許多死結真正發作時,是由開發者本來就該修的應用程式臭蟲所造成。

一台典型的 Linux 伺服器配置鎖、記憶體與檔案時,對一般資源並無死結預防或偵測。若兩個有臭蟲的執行緒死結,行程就只是卡住;操作員察覺、檢視、然後終止或重啟它——作業系統本身對阻止或偵測這個死結什麼也沒做。

無視死結:便宜又常見,代價是偶爾的手動清理。

多數通用作業系統真的無視死結——在死結罕見時這是站得住腳的成本效益選擇,但對卡死不可接受的攸關生命或硬即時系統而言則是糟糕的選擇。

又称
ignoring deadlockhead-in-the-sand approach無視死結