操作系統的鎖機制

轉載地址:http://blog.sina.com.cn/s/blog_51dc0fba0100nxdl.html

一、死鎖的產生( 領會 )


  話說狼GG和狼MM面對面走上一根獨木橋。

  狼GG說:呵呵,小MM,我已經佔領了這座橋的一半,你不如退出去讓我先過去吧。

  狼MM說,哼哼,老兄,我也佔了這座橋的一半,你咋不讓給我?

  狼GG和狼MM互不相讓,都在等對方先讓步。結果兩個都過不了河。等着獵人來處理後事了。

  1、什麼叫 死鎖 : 若系統中存在一組進程(兩個或多個進程),它們中的每一個進程都佔用了某種資源而又都在等待其中另一個進程所佔用的資源,這種等待永遠不能結束,則說系統出現了“死鎖”。或說這組進程處於“死鎖”狀態。

  2、引起死鎖的因素:死鎖的出現除了與資源的分配策略有關外,也與併發進程的執行速度有關,即操作系統對資源管理不得當或沒有顧及進程併發執行時可能出現的情況,則就可能形成死鎖。

  二、死鎖的防止( 簡單應用 )   我們把橋的一半看作一個資源的話,那麼,當狼MM佔用了其中一個資源後,狼GG就只好等待了。

  狼GG狼MM各自佔有了一段資源又在等另外的資源,又不肯放棄自己佔有的資源。

  他們又不能把對方踢下河去,把另一段資源搶過來自己用。

  只好互相等待了。

  這4個條件是必要條件而不是充分條件,意思是,只要發生死鎖,那麼這四個條件必然都成立。反之則不然,有時候即使四個條件都滿足,那也不一定發生死鎖。(從資源分配圖中可以分析得到,即使形成循環等待資源,也不一定形成死鎖。)

  1、系統出現死鎖必然同時保持的四個必要條件:

  1)互斥使用資源

  

        2)佔有並等待資源


  3)不可搶奪資源

  4)循環等待資源

  2、死鎖的 防止策略 :要防止死鎖形成,只要採用的資源分配策略能使上述4個條件中有一個條件不成立就可以了。

  1)破壞互斥使用資源的條件經常是行不通的。因爲資源本身特性就是互斥使用的。

  2)要破壞“佔有並等待條件”則可以採取兩種辦法: 靜態分配 和 釋放已佔資源 .

  靜態分配 也稱爲 預分配資源 ,要求每一個進程在開始執行前就申請它所需要的全部資源,僅當系統能滿足進程的資源申請要求且把資源分配給進程後,該進程才能開始執行。

  釋放已佔資源 就是指進程申請資源時必須沒有佔用資源,如果已經佔用了資源就要先歸還所佔的資源再申請。

  3)實現 可搶奪式分配 :如果一個進程已經佔有了某些資源又要申請新資源,而新資源不能滿足(已被其它進程佔用)必須等待時,系統可以搶奪該進程已佔有的資源。

  4)實現 按序分配 :把系統中所有資源排一個順序,對每一個資源給一個確定的編號,規定任何一個進程申請兩個以上的資源時,總是先申請編號小的資源,再申請編號大的資源。

  三、死鎖的避免( 簡單應用 )   死鎖的避免不同於死鎖的防止,死鎖的防止是採用某種分配策略後,系統就不會產生死鎖,這好比是你打過了某種預防針,再也不會得那種病。而死鎖的避免是沒有打預防針,但是通過其他辦法,避免得病。因此有“安全狀態”的說法,對應的,當然也有不安全狀態。就像人都有得病的可能,不必任何病都打預防針。只要注意防病,仍然可以安全健康的生活。

  1、 安全狀態 :如果操作系統能保證所有的進程在 有限的時間 內得到需要的 全部資源 ,則稱系統處於“安全狀態”。

  2、區分死鎖的 避免 與死鎖的 防止 :當採用了防止死鎖的資源分配策略後,系統中就不會形成死鎖。但是可以防止死鎖的資源分配策略中,有的只適用於對某些資源的分配,有的會影響資源的使用效率。這時可用使用死鎖的避免。

  死鎖的避免是解決死鎖的另一種方法,它不同於死鎖的防止。在系統中不採用防止死鎖的資源分配策略,而是估計到可能有死鎖發生時避免死鎖的發生。

  3、銀行算法是怎樣避免死鎖的:

  銀行家算法是這樣的:

  1)當一個用戶對資金的最大的需求量不超過銀行家現有的資金時就可以接納該用戶。

  2)用戶可以分期貸款,但貸款的總數不能超過最大需求量。

  3)當銀行家現有的資金不能滿足用戶的尚需貸款時,對用戶的貸款可推遲支付,但總能使用戶在有限的時間裏得到貸款。

  4)當用戶得到所需的全部資金後,一定能在有限的時間裏歸還所有資金。

  我們把操作系統看作是銀行家,操作系統管理的資源相當於是銀行家管理的資金,則銀行家算法就是:

  1)當一個進程首次申請資源時,測試該進程對資源的最大的需求量,如果不超過系統現存資源時就可以按他的當前申請量爲其分配資源。 否則推遲分配。

  2)進程執行中繼續申請資源時,測試該進程佔用資源和本次申請資源總數有沒有超過最大需求量。超過就不分配,沒超過則再測試現存資源是否滿足進程還需要的最大資源量,滿足則按當前申請量分配,否則也推遲分配。

  總之,銀行家算法要保證分配資源時系統現存資源一定能滿足至少一個進程所需的全部資源。這樣就可以保證所有進程都能在有限時間內得到需要的全部資源。這就是安全狀態。

  (銀行家算法在操作系統的實踐考試中可能會用到)

  四、死鎖的檢測( 領會 ) 死鎖的檢測

  就是既不打預防針,也不去避免得病,而是經常去體檢,如果發現有病了就治療。這是一種事後解決的辦法,也算是解決死鎖問題的一條途徑。但這畢竟要付出較大代價。

  1、什麼是 死鎖的檢測 :對資源的申請和分配不加限制,只要有剩餘的資源就可把資源分配給申請者。這樣可能會出現死鎖,系統定時運行一個“死鎖檢測程序”,如果檢測到死鎖發生,則必須先解除死鎖再繼續工作。

  2、怎樣實現死鎖的檢測:1、每個資源當用中只有一個資源2、資源類中含有若干個資源。

  3、 死鎖的解除 :一般採用兩種方式來解除死鎖,一種是終止一個或幾個進程的執行以破壞循環等待;另一種是從涉及死鎖的進程中搶奪資源。

  檢測死鎖和解除死鎖都要付出很大代價。所以用死鎖檢測的方法解決死鎖問題只適用於 不經常發生死鎖 的系統中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章