死結
不可剝奪條件(no-preemption condition)
想像一座公用充電置物櫃:一旦你把手機放進去並上鎖,沒有任何管理員可以打開它、把格位讓給更趕時間的人——只有你能在你選擇的時候解鎖。那個格位無法被強行收回。這條「不能收回」的規則就是不可剝奪條件:被行程持有的資源不能被強制收回,只有當該行程自願放手時才會釋放。
這是死結四個必要條件中的第三個。它之所以重要,是因為如果作業系統「能夠」從被阻塞的行程手中奪走它持有的資源,交給別人,等待鏈就能當場被打斷、死結也就預防了。有些資源允許這麼做:CPU 經常被排程器剝奪(先佔),記憶體頁也能藉由把內容置換到磁碟、之後再還原來被剝奪。對這類資源我們能乾淨地儲存與還原狀態,所以剝奪是安全的。對應的死結預防做法是讓資源可被剝奪:當一個持有若干資源的行程去請求另一個目前不可用的資源時,強制它釋放目前所持有的一切(其持有的資源被剝奪),等之後它能一次取得全部時再重啟。
誠實的麻煩在於,許多資源根本無法在不破壞正確性的情況下被剝奪。你無法把列印到一半的紙從印表機硬抽回來,也無法在不讓共享資料陷入損壞、不一致狀態的前提下,撤銷一把正保護著未完成更新的鎖。剝奪只對那些狀態能被儲存、之後能忠實還原的資源管用(如 CPU 暫存器或記憶體頁)。對其他一切而言,剝奪並非真正的選項,這就是為何不可剝奪常常是你無法移除的那個條件——你只好改去攻擊其餘三者之一。
CPU 是可剝奪的:計時器中斷讓排程器儲存一個行程的暫存器、把 CPU 交給另一個,之後再還原。列印中的印表機則不可剝奪:強行收回會留下一張錯亂的、印到一半的紙。
只有當資源的狀態能被儲存並忠實還原時,剝奪才是安全的。
許多真實資源(列印中的印表機、保護著更新到一半之資料的鎖)一旦被剝奪就會損壞,因此不可剝奪通常是你無法破壞的條件——改去攻擊其餘三者之一。
又称
另见