操作系统(三十)避免死锁
2.4.3 避免死鎖
? 操作系統的狀態可以分為安全狀態以及不安全狀態,讓操作系統始終保持一個安全狀態就能避免死鎖。所謂安全狀態,是指系統能按某種進程順序(P1,P2,…,Pn)(稱〈P1,P2,…,Pn〉序列為安全序列),來為每個進程 Pi分配其所需資源,直至滿足每個進程對資源的最大需求,使每個進程都可順利地完成。如果系統無法找到這樣一個安全序列,則稱系統處于不安全狀態。當然安全序列可以有多個。
? 找到安全序列的算法一般是銀行家算法,銀行家算法最開始是為了合理分配銀行的資金保證不會發生資金不足的問題。銀行家算法的核心思想是在進程提出資源申請時,先預判此次分配是否會導致系統進入不安全狀態。如果會進入不安全狀態,就暫時不答應這次請求,讓該進程先阻塞等待。在外面介紹完一些概念之后會根據一個例子來學習一下銀行家算法。
? 假設系統中有 n 個進程,m 種資源:
? 銀行家算法的數據結構: (1)可利用資源向量 Available。這是一個含有 m 個元素的數組,其中的每一個元素代表一類可利用的資源數目,其初始值是系統中所配置的該類全部可用資源的數目,其數值隨該類資源的分配和回收而動態地改變。
(2)最大需求矩陣 Max。這是一個 n×m 的矩陣,它定義了系統中 n 個進程中的每一個進程對 m 類資源的最大需求。
(3)分配矩陣 Allocation。這也是一個 n×m 的矩陣,它定義了系統中每一類資源當前已分配給每一進程的資源數。
(4)需求矩陣 Need。這也是一個 n×m 的矩陣,用以表示每一個進程尚需的各類資源數。
其中Need=Max-Allocation
??銀行家算法的步驟:用一個長度為m的一維數組 Requesti 表示本次申請的各種資源量。
①如果 Requesti[j]≤Need[i, j] (0≤j≤m)便轉向②;否則認為出錯。(因為它所需要的資源數已超過它所宣布的最大值。) ②如果 Requesti[j]≤Available[j] (0≤j≤m),便轉向③ ;否則表示尚無足夠資源,Pi必須等待。 ③系統試探著把資源分配給進程Pi,并修改相應的數據(并非真的分配,修改數值只是為了做預判): ? ? ? ? ? ? ? ?Available = Available - Requesti; ? ? ? ? ? ? ? ?Allocation[i, j] = Allocation[i, j] + Requesti[j]; ? ? ? ? ? ? ? ?Need[i, j] = Need[i, j] – Requesti[j] ④操作系統執行安全性算法,檢查此次資源分配后,系統是否處于安全狀態。若安全,才正式分配;否則恢復相應數據,讓進程阻塞待。 ? 安全性算法步驟: (1) 設置兩個向量: ? ① 工作向量 Work,它表示系統可提供給進程繼續運行所需的各類資源數目,它含有 m個元素,在執行安全算法開始Work:=Available。 ? ② Finish,它表示系統是否有足夠的資源分配給進程,使之運行完成。開始時先做Finish[i]:=false;當有足夠資源分配給進程時,再令 Finish[i]:=true。 (2) 從進程集合中找到一個能滿足下述條件的進程: ? ① Finish[i]=false; ? ② Need[i,j]≤Work[j];若找到,執行步驟(3),否則,執行步驟(4)。 (3) 當進程 Pi獲得資源后,可順利執行,直至完成,并釋放出分配給它的資源,故應執行: ? Work[j]:= Work[j]+Allocation[i,j]; ? Finish[i]:=true; ? go to step 2; (4) 如果所有進程的 Finish[i]=true 都滿足,則表示系統處于安全狀態;否則,系統處于不安全狀態。 舉例子:(我從王道書上扒下來的)其實不管我咋說,大家還是在自己算一遍來的清楚。
總結
以上是生活随笔為你收集整理的操作系统(三十)避免死锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统(二十九)预防死锁
- 下一篇: 轻食餐饮发展指南