オペレーティング システムの最終レビュー - クラス 6 - デッドロック (2)

1. デッドロックの回避

デッドロックの回避は、事前の予防戦略でもあり、デッドロックを回避するためのリソースの動的割り当て中にシステムが危険な状態に陥るのを防ぎます。

1. システムのセキュリティステータス

デッドロック回避手法では、システムの状態を安全な状態と危険な状態に分けます。システムが安全な状態にある場合はデッドロックを回避できますが、システムが安全でない状態にある場合はデッドロック状態に陥る可能性があります。

2. セキュリティシーケンス

いわゆる安全なシーケンスとは、システムがこのシーケンスに従ってリソースを割り当てれば、各プロセスが正常に完了できることを意味します。安全なシーケンスが見つかる限り、システムは安全な状態にあります。もちろん、複数のセキュリティ シーケンスが存在する可能性があります。

3. 安全な状態から危険な状態へ

リソースが割り当てられた後、システム内で安全なシーケンスが見つからない場合、システムは安全でない状態に入ります。これは、その後すべてのプロセスがスムーズに実行できなくなる可能性があることを意味します。
システムが安全な状態にある場合、デッドロックは発生してはなりません。システムが安全でない状態になると、デッドロックが発生する可能性があります。(安全でない状態は必ずしもデッドロックが発生していることを意味するわけではありませんが、デッドロックが発生した時点で安全でない状態である必要があります。) そのため、リソースを割り当てる前に、
この割り当てによってシステムが異常終了するかどうかを事前に判断することができます。リソースの割り当てを許可するかどうかを決定するために、安全でない状態を確認します。これは「バンカーズアルゴリズム」の中核となる考え方でもあります。

そこで問題は、銀行家のアルゴリズムとは何なのかということです。

わかりやすい例をあげましょう。
この時点で、あなたは 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 億を借りたいと考えていますが、あなたはそれを借りる勇気がありますか?

あなたが同意する場合: B に 30 億を貸しても、手元にはまだ 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

4. バンカーのアルゴリズム

バンカーズ アルゴリズムは、銀行が現金ローンを発行する際にすべての顧客のニーズを確実に満たせるようにするために、オランダの学者ダイクストラによって銀行システム用に設計されました。このアルゴリズムは、後にデッドロックを回避するためにオペレーティング システムで使用されました。
***中心的なアイデア: ***プロセスがリソースの適用を行うとき、最初に、その割り当てによってシステムが危険な状態になるかどうかを判断します。安全でない状態になる場合、リクエストは一時的に許可されず、プロセスはブロックされて最初に待機されます。
1)データ構造:
①利用可能なリソースベクトル 利用可能。長さ m の 1 次元配列。Available は、
まだ利用可能なリソースの数を示します。
②最大需要マトリックス 各プロセスに必要なリソースの最大数を示します (nxm 行列)。
③ 割り当てマトリックス 割り当て。各プロセスにどれだけのリソースが割り当てられているかを示します。 nxm 行列
④ 需要行列 必要です。マトリックスは、各プロセスが最大でどれだけのリソースを必要とするかを示します。
Max -Allocation=Need
⑤プロセス P のリクエスト ベクトル。長さ m の 1 ビット配列を使用して、プロセスが今回適用したさまざまなリソースの数を示します。

2)アルゴリズムステップ:
RequestをプロセスPiのリクエストベクトルとする、Requesti[j]=Kの場合、プロセスPiはタイプRjのK個のリソースを必要とすることを意味する。Pi がリソース要求を送信すると、システムは次の手順に従ってチェックします:
①Requesti[j]≤Need[i,j] ゲートの場合はステップ②に進み、それ以外の場合は必要なリソースの数のためエラーとみなされます。発表した上限値を超えた。
②Requesti[j]≤Available[j]の場合は手順③へ、そうでない場合は待機するリソースPiが不足していることを意味します。
③システムはプロセス Pi にリソースを仮割り当てし、
Available[j]=Available[j]-Requesti[j];
Allocation[i,j]=Allocation[i,j]+Requesti[ のデータ構造の値を変更します。 j];
Need[ij]=Need[i,j]-Requesti[j];
④システムは、リソース割り当て後にセキュリティアルゴリズムを実行し、システムが安全な状態にあるかどうかを確認します。安全であれば、プロセス Pi にリソースを正式に割り当てて割り当てを完了しますが、そうでない場合は、仮割り当てを無効にして、
元のリソース割り当て状態に戻し、プロセス Pi は待機します。

3) セキュリティ アルゴリズム:
システムによって実行されるセキュリティ アルゴリズムは次のように説明できます:
① 2 つのベクトルを設定します:
a. 作業ベクトル Work は、システムが実行を継続するためにプロセスに提供できるさまざまなリソースの数を示します。 m 要素がセキュリティ アルゴリズムの実行を開始すると、Work=Available;
b.Finish: プロセスを完了するのに十分なリソースがシステムに割り当てられているかどうかを示します。最初は Finish[i]=false にし、プロセスに十分なリソースが割り当てられたら Finish[i]=true にします。
②以下の条件を満たす工程集合の中から
a.Finish[i]=false;
b.Need[i,j]≤Work[j]; が
見つかった場合は手順③を実行、そうでない場合は手順④を実行します。
③ プロセス Pi はリソースを取得した後、完了して割り当てられたリソースを解放するまでスムーズに実行できるため、
Work[j]=Work[j]+Allocation[i,j];
Finish[i]を実行する必要があります。 ]= true;
手順②に戻ります。
④ すべてのプロセスの Finish[i]=true が満たされる場合、システムは安全な状態にあることを意味し、そうでない場合、システムは非安全な状態にあることを意味します。
4) セキュリティアルゴリズムの例
アルゴリズム:Banker's Algorithm(質問作成プロセス)

質問:
ここに画像の説明を挿入
解析:
0、6、2 と仮定すると、次のように安全ではありません:
ここに画像の説明を挿入
1、1、1 と仮定すると、次のように安全ではありません:
ここに画像の説明を挿入
0、4、7 と仮定すると、次のように安全ではありません:
ここに画像の説明を挿入
1、4 と仮定します。 , 0 の場合は、次のように安全です。
ここに画像の説明を挿入

2.デッドロックの検出と解除

システムにデッドロックの予防策や回避策が講じられていない場合、システムではデッドロックが発生する可能性が高くなります。この場合、システムは 2 つのアルゴリズムを提供する必要があります。
1) デッドロック検出アルゴリズム: システム状態を検出するために使用され、システムでデッドロックが発生したかどうかが判断されます。
デッドロックを検出できるようにするには、システムは次のことを行う必要があります。 ①
何らかのデータ構造を使用して、リソース要求と割り当て情報を保存する。
②上記の情報を利用してシステムがデッドロック状態に陥ったかどうかを検出するアルゴリズムを提供します。
リソース割り当て図
2 種類のノード: プロセス ノードとリソース ノード (複数のリソース ノードがある場合があります)
2 種類のエッジ:
プロセス ノード -> リソース ノード: プロセス ノードに代わってリソースの種類を要求します。
リソースノード -> プロセスノード: このタイプのリソースが、指定されたプロセスノードに割り当てられていることを意味します。
デッドロック理論: システムのリソース割り当てグラフがある時点で既約である場合、その時点でシステムはデッドロック状態にあります。
ここに画像の説明を挿入
2) デッドロック解除アルゴリズム: このアルゴリズムを使用すると、システムをデッドロックから解放できます。デッドロックが検出されたら、直ちにデッドロックを解決する必要があります。
補足:システム内のすべてのプロセスがデッドロック状態になるわけではなく、デッドロック検出アルゴリズムでグラフを割り当てた後もエッジに接続されているプロセスがデッドロックプロセスとなります。
デッドロックを解消する主な方法:
① リソース剥奪方法。
デッドロックされたプロセスのロックによって占有されているリソースを奪い、他のプロセスに割り当てます。ただし、一時停止されたプロセスが長期間にわたってリソースを枯渇させることは避けられます。
②失効処理方法。一部のデッドロック プロセスまたはすべてのデッドロック プロセスを強制的に取り消すのは単純かつ失礼ですが、代償は比較的高くなります。
③プロセスのロールバック方法。デッドロックを回避するために、1 つ以上のデッドロック プロセスをバックオフします。これには、プロセスの履歴メッセージを記録し、復元ポイントを設定する必要があります。

別の種類の質問があります。
ここに画像の説明を挿入
私の理解では、2 つを一緒に実行することはできません。1 つずつ実行します。そうしないと、生成されたものが他の場所で使用されるかどうかがわかりません。どちらを使用するとデッドロックが発生します。
もう一度練習してください!

例: システム内に 3 つの同時プロセスがあり、そのすべてが同じタイプの 4 つのリソースを必要とする場合、このシステムで確実にデッドロックを引き起こさない最小リソースは (B) A.9 B.10 C.11 D.12 です

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_52030647/article/details/130753390