預防死鎖 可以采用一次性請求所有資源來預防死鎖( 二 )


避免事務中的用戶交互
避免編寫包含用戶交互的事務,因為運行沒有用戶交互的批處理的速度要遠遠快于用戶手動響應查詢的速度,例如答復應用程序請求參數的提示 。例如,如果事務正在等待用戶輸入,而用戶去吃午餐了或者甚至回家過周末了,則用戶將此事務掛起使之不能完成 。這樣將降低系統的吞吐量,因為事務持有的任何鎖只有在事務提交或回滾時才會釋放 。即使不出現死鎖的情況,訪問同一資源的其它事務也會被阻塞,等待該事務完成 。
保持事務簡短并在一個批處理中
在同一數據庫中并發執行多個需要長時間運行的事務時通常發生死鎖 。事務運行時間越長,其持有排它鎖或更新鎖的時間也就越長,從而堵塞了其它活動并可能導致死鎖 。保持事務在一個批處理中,可以較小化事務的網絡通信往返量,減少完成事務可能的延遲并釋放鎖 。
使用低隔離級別
確定事務是否能在更低的隔離級別上運行 。執行提交讀允許事務讀取另一個事務已讀?。ㄎ葱薷模┑臄祿?,而不必等待排名個事務完成 。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串行讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪 。
使用綁定連接
使用綁定連接使同一應用程序所打開的兩個或多個連接可以相互合作 。次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有,反之亦然,因此不會相互阻塞 。

預防死鎖 可以采用一次性請求所有資源來預防死鎖

文章插圖
系統進程死鎖的預防措施有什么預防死鎖的根本辦法就是要使死鎖產生的4個必要條件之一不存在 。下面來分析一下破壞這些條件的可能性 。
破壞互斥條件
破壞互斥條件即允許多個進程同時訪問資源 。由于多數資源的必須互斥訪問這一固有特性不能改變,因此,死鎖的預防通過破壞這個必要條件實現在很多場合是行不通的 。例如,打印機資源必須互斥使用,否則幾個進程同時使用,每個進程各打印一行,這種輸出信息的方式顯然是不能被用戶接受的 。
破壞占有和等待條件
采用資源靜態分配法可破壞這一條件,該方法是指在進程運行前,一次性地_請分配它運行所需的全部資源 。若系統有足夠的資源分配給某一進程,則一次性地將其所需資源分配給該進程,這樣,在進程運行期間便不會再提出任何資源請求,從而使等待條件不成立 。如果分配時有一種資源要求不能滿足,則進程需要的其他資源也先不分配給進程,從而避免進程在等待期間占用任何資源,破壞了占用條件,從而避免死鎖的發生 。
該方法控制簡單且容易實現,但由于進程運行期間對所需資源的全部占用,使得某些使用時間很短的資源被長時間占用,這樣會嚴重影響系統資源的充分利用,導致資源利用率降低,同吋也影響到未獲得全部資源的進程推遲運行 。
破壞不剝奪條件
采用剝奪式控制方法可以破壞該條件,該方法是使一個已保持了某些資源的進程,由于新的資源要求目前得不到滿足,它必須先暫時釋放巳保持的所有資源(一種剝奪式),然后去等待,以后再一起向系統提出巾請,這樣也能防止死鎖 。這種方法實現起來相對W難,為了保護進程自動放棄資源的現場以及后來的再次恢復,需要付出高昂的代價,并且這種方法只適用于處理機和存儲器資源,對其他資源,此法不宜使用 。
破壞循環等待條件
采用資源順序分配法可破壞該條件 。這種分配方法的基本思想是:把系統的全部資源分成多個層次,一個進程得到某一層的一個資源后,它只能再_請較高一層的資源;當一個進程要釋放某層的一個資源時,必須先釋放所占有的較高層的資源;當一個進程獲得了某一層的一個資源后,它想再申請該層中的另一個資源,就必須先釋放在該層中巳占有的資源 ?;蛘哒f,進程釋放資源的順序是按照中請資源的相反順序進行的 。這樣可以預防循環等待現象的發生,因此不會發生死鎖 。使用該方法要特別注意的問題是對資源所處層次的安排 。在通常情況下,把各進程經常用到的、比較普遍的資源安排在較低的層次上,把重要且相對匱乏的資源安排在較高的層次上,以便實現對各資源的較大限度的利用 。該方法相對于前面介紹的方法,在資源利用率和系統吞吐量上都有明顯的改善 。但也存在一些缺陷 。