記事ディレクトリ
セキュリティシーケンス
システムがこの順序でリソースを割り当てれば、各プロセスはスムーズに完了します。安全なシーケンスが見つかる限り、システムは安全な状態にあります。
当然,安全序列可能有多个
。
一般的な理解モデル
この時点で、あなたは 100 億を手にした成功した銀行家です...
現在、あなたに融資をお願いしたい会社はB社、A社、T社の3社です。
B: 「兄さん、70億まで借りたいんです」
A: 「兄さん、40億まで借りたいんです」
T:「兄さん、50億まで借りたいんです」
ルールがあります:会社に貸したお金が会社が提示する最大要件を満たさない場合、借りたお金は無駄になります。
もちろん、お金を無駄にしたくないので、100 億を無駄にしないように借り方を検討する必要があります。
初回ローン
最大要件 | すでに借りています | せいぜい借りてください | |
---|---|---|---|
B | 70 | 20 | 50 |
あ | 40 | 10 | 30 |
T | 50 | 30 | 20 |
此时你手里还有40亿
…
お金を借りる際のセキュリティシーケンスを分析する
-
このときBさんはあなたから30億借りたいと思っていますが、あえて借りることができますか?
-
同意する場合: 30 億 B を貸します。
那么你的手里还有10亿
上の図は、以下に示すようにわずかに変更されます。 -
最大要件 すでに借りています せいぜい借りてください B 70 20 +30=50
50 -30=20
あ 40 10 30
T 50 30 20
-
別の会社がさらに 20 億借りようと提案したら、あなたは死んでしまい、当然借りられなくなり、お金が無駄になるため、このお金は借りられなくなります。
不安全
-
-
この時、Aさんはあなたから20億借りたいと思っていますが、あえて借りることができますか?
-
同意する場合: 20 億を貸しました。
那么你的手里还有20亿
上の図は、以下に示すようにわずかに変更されています。 -
最大要件 すでに借りています せいぜい借りてください B 70 20 50
あ 40 10 +20=30
30-20=10
T 50 30 20
-
次に、20億をすべてT社に貸すことができます。お金を全額返すと50億が手元にあり、そのお金をB社に貸します。お金を全額返すと70億が手元に残り、最終的にA社に貸します。こうすれば全額が戻ってきます。
-
したがって、この融資シーケンス (安全なシーケンス): T->B->A
-
上記の考えに従って、このシーケンスを自分で検証してください: A->T->B
-
銀行家のアルゴリズム
本旨
プロセスがリソースの申請を行う場合、まず、预判
この割り当てによってシステムが に入るかどうかを確認します不安全状态
。安全でない状態になる場合、リクエストは一時的に許可されず、プロセスはブロックされて最初に待機されます。
核となるのは: セキュリティ アルゴリズム
リソース表現
1 次元の数値を多次元ベクトルに拡張します。例: システム内に 5 つのプロセス P0 ~ P4、3 種類のリソース R0 ~ R2 があり、初期番号は (10, 5, 7)
プロセス | 最大のニーズ | すでに割り当てられています | せいぜい必要な |
---|---|---|---|
P0 | (7,5,3) | (0,1,0) | (7,4,3) |
P1 | (3,2,2) | (2,0,0) | (1,2,2) |
P2 | (9,0,2) | (3,0,2) | (6,0,0) |
P3 | (2,2,2) | (2,1,1) | (0,1,1) |
P4 | (4,3,3) | (0,0,2) | (4,3,1) |
この時点で (7,2,5) が割り当てられ、(3,3,2) が残ります。
セキュリティアルゴリズム分析システムのステータス
-
現時点でシステムは安全な状態ですか? その場合は、安全なシーケンスを見つけてください。
-
まず、残りのリソースが各プロセスのニーズを満たしているかどうかを確認します
-
P1 と P3 のニーズを満たすことができることがわかりました。次に、それを最初に P1 に割り当て (セキュリティ シーケンスに P1 を追加)、P1 が終了するのを待ちます。その後、残りのリソースは (5,3,2) になり、次に P3 に割り当てます (セキュリティ シーケンスに P3 を追加)。彼が終了すると、残りのリソースは (7,4,3) になります。以下に示すように:
-
プロセス 最大のニーズ すでに割り当てられています せいぜい必要な P0 (7,5,3) (0,1,0) (7,4,3)
P2 (9,0,2) (3,0,2) (6,0,0)
P4 (4,3,3) (0,0,2) (4,3,1)
-
P4、P2、P0 (必要なリソースの最大数は残りのリソースより少ない) をセキュリティ シーケンスに追加すると、最終的にセキュリティ シーケンスを取得できます。
安全性算法
-
-
実際に問題を実行する場合 (手計算)、より高速な方法を使用して安全な順序を見つけることができます。
- (3, 3, 2) は P1 と P3 を満たすことができます。つまり、いずれの場合でも、これら 2 つのプロセスのリソース要件が順番に満たされる必要があるため、P1 と P3 は正常に実行され、リソースが返される必要があります。P1 と P3 を最初にセキュリティ シーケンスに追加できます。(2, 0, 0) + (2, 1, 1) + (3, 3, 2) = (7, 4, 3) 残りの P0
、P2、P4 を満たすことができます。同様に、これらのプロセスはすべてセキュリティ シーケンスに参加できます。したがって、説明したように、5 つのプロセスすべてがセキュリティ シーケンスに追加されます此时系统处于安全状态, 暂不可能发生死锁
。
- (3, 3, 2) は P1 と P3 を満たすことができます。つまり、いずれの場合でも、これら 2 つのプロセスのリソース要件が順番に満たされる必要があるため、P1 と P3 は正常に実行され、リソースが返される必要があります。P1 と P3 を最初にセキュリティ シーケンスに追加できます。(2, 0, 0) + (2, 1, 1) + (3, 3, 2) = (7, 4, 3) 残りの P0
-
特殊: 安全なシーケンス インスタンスが見つかりません
-
プロセス 最大のニーズ すでに割り当てられています せいぜい必要な P0 (8、5、3) (0、1、0) (8, 4, 3)
P1 (3,2,2) (2,0,0) (1,2,2)
P2 (9、5、2) (3、0、2) (6, 5, 0)
P3 (2,2,2) (2,1,1) (0,1,1)
P4 (4、3、6) (0、0、2) (4, 3, 4)
-
合計リソース (10、5、7)、残りの利用可能なリソース (3、3、2)
-
(3, 3, 2) P1 と P3 を満たすことができ、P1 と P3 を最初にセキュリティ シーケンスに追加でき、残りの利用可能なリソースは (7, 4, 3) です。
-
プロセス 最大のニーズ 割り当て済み せいぜい必要な P0 (8、5、3) (0、1、0) (8, 4, 3)
P2 (9、5、2) (3、0、2) (6, 5, 0)
P4 (4、3、6) (0、0、2) (4, 3, 4)
-
残りは満足できず、あらゆる点で対照的です。残りの P0 には (8、4、3) が必要です。
(7, 4, 3)
P2 には (6、5、0) が必要です。(7, 4, 3)
P4 には (4、3、4) が必要です。 -
无法找到任何一个安全序列, 说明
此时系统处于不安全状态, 有可能发生死锁
-
下面进入正题:银行家算法的实现
银行家算法实现
进程 | 最大需求Max | 已分配Allocation | 最多还需要Need |
---|---|---|---|
P0 | (7, 5, 3) | (0, 1, 0) | (7, 4, 3) |
P1 | (3, 2, 2) | (2, 0, 0) | (1, 2, 2) |
P2 | (9, 0 ,2) | (3, 0, 2) | (6, 0, 0) |
P3 | (2, 2, 2) | (2, 1, 1) | (0, 1, 1) |
P4 | (4, 3, 3) | (0, 0, 2) | (4, 3, 1 |
数据结构:
n*m 矩阵 Max 表示各进程对资源的最大需求数
n*m 矩阵 Allocation 表示已经给各进程分配 了多少资源
Max – Allocation = Need 矩阵表示各进程最多还需要多少资源
长度为 m 的一维数组 Available 表示还有多少可用资源 [表示:Available = (3, 3, 2)]
用长度为 m 的一位数组 Requesti表示进程此次申请的各种资源数 [表示:Request0 = (2, 1, 1) ]
思路分析
-
如果 Requesti[j]≤Need[i, j] (0≤j≤m)便转向
2
; 否则认为出错 :因为它所需要的资源数已超过它所宣布的最大值
-
如果 Requesti[j]≤Available[j] (0≤j≤m), 便转向
3
; 否则表示尚无足够资源, Pi必须等待 -
系统试探着把资源分配给进程Pi, 并修改相应的数据(
并非真的分配, 修改数值只是为了做预判
)Available = Available - Requesti; Allocation[i, j] = Allocation[i, j] + Requesti[j]; Need[i, j] = Need[i, j] – Requesti[j]
-
操作系统执行
安全性算法
, 检查此次资源分配后,系统是否处于安全状态
。 若安全, 才正式分配; 否则, 恢复相
应数据, 让进程阻塞等待
银行家算法步骤
- 检查此次申请是否超过了之前声明的最大需求数
- 检查此时系统剩余的可用资源是否还能满足这次请求\
- 试探着分配, 更改各数据结构
- 用安全性算法检查此次分配是否会导致系统进入不安全状态
安全性算法步骤
检查当前的剩余可用资源是否能满足某个进程的最大需求, 如果可以, 就把该进程加入安全序列,并把该进程持有的资源全部回收。
不断重复上述过程, 看最终是否能让所有进程都加入安全序列。
系统处于不安全状态未必死锁, 但死锁时一定处于不安全状态。 系统处于安全状态一定不会死锁
升华思维
死锁预防是保证系统不进入死锁状态的静态策略,其解决办法是破坏产生死锁的四个必要条件之一、下列方法中 破坏了“循环等待”条件的是( )。
A. 银行家算法
B. 一-次性分配策略
C. 剥夺资源法
D. 资源有序分配策略
产生死锁的四个必要条件:互斥、不剥夺、请求和保持、循环等待
资源有序分配策略可以限制循环等待条件的发生。选项A判断是否为不安全状态;选项B破坏了占有请求条件;选项C破坏了非剥夺条件。
某系统中有三个并发进程都需要四个同类资源,则该系统必然不会发生死锁的最少资源是( )。
A. 9
B. 10
C. 11
D. 12
资源数为9时,存在三个进程都占有三个资源,为死锁;资源数为10 时,必然存在一个进程能拿到4个资源,然后可以顺利执行完其他进程。
A. Ⅱ、Ⅲ
B. Ⅰ、Ⅱ
C. Ⅰ
D. Ⅰ、Ⅲ