オペレーティングシステムの原則第III章プロセッサのスケジューリングとデッドロック(2)

3.6デッドロックの防止

デッドロックを防ぐ方法は、デッドロックを回避するために、デッドロックに必要な4つの条件の1つまたはいくつかを破棄することです。非共有デバイスには相互に排他的な条件が必要であるため、変更できないだけでなく、保証する必要もあります。したがって、デッドロックを引き起こす最後の3つの条件を破棄することが主な目的です。

3.6.1「リクエストアンドホールド」条件の解除

「リクエストアンドホールド」条件を破棄するために、システムは、プロセスがリソースをリクエストしたときに、プリエンプティブでないリソースをホールドできないようにする必要があります。この保証は、次の2つの異なるプロトコルを通じて達成できます。

1.合意では、すべてのプロセスが、運用プロセス全体で必要なすべてのリソースに、実行を開始する前に一度に適用する必要があると規定されています。
2.このプロトコルは、最初のプロトコルを改良したもので、操作の初期段階で必要なリソースを取得した後でのみプロセスの実行を開始できます。

3.6.2「プリエンプティブル」状態を損なう

「非プリエンプタブル」条件を破棄するために、合意は、特定の非プリエンプティブリソースを維持していたプロセスが新しいリソース要求を行い、満たすことができない場合、保持されているすべてのリソースを解放し、後で必要になることを規定していますその後、再申請してください。これは、プロセスによってすでに占有されているリソースが一時的に解放されるか、プリエンプトされることを意味し、それによって「プリエンプティブでない」状態が破壊されます。

3.6.3「待機ループ」条件を解除する

「循環待機」状態が保持されないようにする1つの方法は、システム内のすべてのリソースタイプを線形にソートし、異なるシリアル番号を割り当てることです。

3.7デッドロックの回避

デッドロックを回避することも事前に防止するための戦略ですが、デッドロックを生成するために必要な条件を破壊するために事前に何らかの制限措置を講じるのではなく、動的リソース割り当て中にシステムが安全でない状態に入らないようにして、デッドロックを回避します。 。この方法による制限は弱く、システムのパフォーマンスが向上する可能性がありますが、現在、この方法はデッドロックを回避するために一般的に使用されています。

3.7.1システムセキュリティステータス

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

  1. セキュリティ状態
    この方法では、プロセスはリソースを動的に適用できますが、システムがリソースを割り当てる前に、まずこのリソース割り当てのセキュリティを計算する必要があります。
  2. 安全な状態の例
    システムに3つのプロセスP1、P2、およびP3があり、合計12のテープドライブがあるとします。プロセスP1には合計10台のテープドライブが必要で、P2とP3にはそれぞれ4台と9台のドライブが必要です。時間T0で、プロセスP1、P2、およびP3がそれぞれ5、2、および2つのテープドライブを取得し、次の表に示すように、未割り当てのアイドルが3つあると仮定します。
    ここに画像の説明を挿入
  3. 安全な状態から安全でない状態への移行
    安全なシーケンスに従ってリソースが割り当てられない場合、システムは安全な状態から安全でない状態に入る場合があります。

3.7.2銀行家のアルゴリズムを使用してデッドロックを回避する

デッドロックを回避する最も代表的なアルゴリズムは、ダイクストラのバンカーアルゴリズムです。このアルゴリズムが最初に銀行システムが現金ローンを発行するとき、それがすべての顧客のニーズを満たすことができないということが起こらないことを確実にするために銀行システムのために設計されたので、この名前が付けられます。また、デッドロックを回避するためにOSで使用することもできます。

1.
バンカーのアルゴリズムのデータ構造バンカーのアルゴリズムを実現するには、システムで使用可能なリソース、すべてのプロセスの最大リソース要件、およびシステムのリソース割り当てを記述するために、システムに4つのデータ構造を設定する必要があります。 、およびすべてのプロセスに必要なリソースの量。
(1)利用可能なリソースベクトル利用可能。
(2)最大需要マトリックス
(3)割り当て行列。
(4)ニーズマトリックスニーズ。

2.バンカーアルゴリズム
RequestiをプロセスPiの要求ベクトルとします。Requesti [j] = Kの場合、プロセスPiにはK Rjタイプのリソースが必要であることを意味します。Piがリソース要求を送信すると、システムは次の手順に従ってチェックします:
(1)要求i [j]≤必要[i、j]の場合、手順(2)に進みます。それ以外の場合は、必要なリソースの数が原因でエラーと見なされます宣言された最大値を超えました。
(2)リクエストi [j]≤利用可能[j]の場合は、ステップ(3)に進みます。それ以外の場合は、十分なリソースがないため、Piは待機する必要があります。
(3)システムはリソースをプロセスPiに割り当て、次のデータ構造の値を変更しようとします:使用可能[j] =使用可能[j]-要求i [j];割り当て[i、j] =割り当て[i、j ] +リクエストi [j];必要[i、j] =必要[i、j]-リクエストi [j];
(4)システムはセキュリティアルゴリズムを実行して、このリソース割り当て後にシステムが安全な状態にあるかどうかを確認します。安全であれば、プロセスPiにリソースが正式に割り当てられて割り当てが完了します。そうでない場合、トライアル割り当ては無効になり、元のリソース割り当てステータスが復元されて、プロセスPiが待機します。

3.セキュリティアルゴリズム
システムで実行されるセキュリティアルゴリズムは、次のように説明できます。
(1)2つのベクトルを設定します。①作業ベクトル。システムが実行を継続するプロセスに提供できるさまざまなタイプのリソースの数を表します。要素、セキュリティアルゴリズムの実行開始時、作業:=使用可能、②終了:システムがプロセスを完了するために十分なリソースがプロセスに割り当てられているかどうかを示します。最初に、Finish [i]:= falseを実行します。プロセスに十分なリソースが割り当てられている場合は、Finish [i]:= trueにします。
(2)プロセスセットから次の条件を満たすプロセスを見つけます:①終了[i] = false;②必要[i、j]≤作業[j];見つかった場合、手順(3)に進み、それ以外の場合は、ステップ(4)。
(3)プロセスPiがリソースを取得すると、それが完了するまで正常に実行でき、それに割り当てられたリソースが解放されるため、実行する必要があります:Work [j] = Work [j] + Allocation [i、j];
    Finish [i ] = true;  
    ステップ2に進みます;
(4)すべてのプロセスの[完了] [i] = trueが満たされる場合、システムは安全な状態にあり、それ以外の場合、システムは安全でない状態にあります。

3.8デッドロックの検出と解除

デッドロック防止対策もデッドロック回避アルゴリズムもシステムに提供されていない場合、システムはデッドロックしている可能性があります。この場合、システムは2つのアルゴリズムを提供する必要があります。①デッドロック検出アルゴリズム。このメソッドは、システムの状態を検出して、システムでデッドロックが発生したかどうかを判別するために使用されます。②デッドロック解除アルゴリズム。システムでデッドロックが発生したと判断された場合、アルゴリズムを使用してシステムをデッドロック状態から解放できます。

3.8.1デッドロックの検出

システムでデッドロックが発生したかどうかを検出するには、システムが次のことを行う必要があります。①リソースに関する要求と割り当て情報を保存し、②この情報を使用してシステムがデッドロック状態に入ったかどうかを検出するアルゴリズムを提供します。
1.リソース割り当てグラフ(Resource Allocation Graph)
システムのデッドロックは、リソース割り当てグラフを使用して記述できます。

グラフは、ノードNのセットとエッジEのセットで構成されるデュアルG =(N、E)です。次の定義と制限があります。
(1)Nを2つの相互に排他的なサブに分割するセット、つまり、プロセスノードのセットP = {P1、P2、…、Pn}およびリソースノードのセットR = {R1、R2、…、Rn}、N =P∪R。図3-19に示す例では、P = {P1、P2}、R = {R1、R2}、N = {R1、R2}∪{P1、P2}です。
(2)Eの任意のエッジe∈EはPのノードとRのノードに接続され、e = {Pi、Rj}はリソース要求エッジであり、プロセスPiはリソースRjを指します。これは、プロセスPiがRjリソースのユニットを要求することを意味します。E = {Rj、Pi}はリソース割り当て側であり、リソースRjはプロセスPiを指します。つまり、リソースRjの単位がプロセスPiに割り当てられます。図3-19は、2つの要求エッジと2つの配布エッジ、つまりE = {(P1、R2)、(R2、P2)、(P2、R1)、(R1、P1)}を示しています。

ここに画像の説明を挿入
2.デッドロック

リソース割り当てグラフ(図3-19)を簡略化する方法を使用して、システムがS状態のときにシステムがデッドロック状態にあるかどうかを検出できます。簡略化した方法は次のとおりです。
(1)リソース割り当ての図で、ブロックでも独立でもないプロセスノードPiを見つけます。円滑な状況では、Piは必要なリソースを取得し、操作が完了するまで実行し続け、保持しているすべてのリソースを解放します。これは、Piの要求側と割り当て側を削除して、孤立したノードにすることと同じです。図3-20(a)では、P1の2つの配布エッジと1つの要求エッジが削除されて、図(b)に示す状態が形成されます。

ここに画像の説明を挿入

(2)P1がリソースを解放した後、P2が保持しているすべてのリソースを完了して解放し、図©に示す状況を形成するまで、P2はリソースを取得して実行を継続できます。つまり、2つの要求エッジと1つのP2の割り当てです。消える。
(3)一連の簡略化の後、グラフのすべてのエッジを削除してすべてのプロセスノードを分離ノードにすることができる場合、グラフは完全に簡略化されていると言えます;グラフがどのプロセスでも作成できない場合完全に簡略化すると、グラフを完全に簡略化することはできないと言われています。

3.デッドロック検出のデータ構造

デッドロック検出のデータ構造は、バンカーのアルゴリズムのデータ構造に似ています。
(1)利用可能なリソースベクトル利用可能。これは、m種類のリソースの各タイプのリソースの利用可能な数を表します。
(2)リソースを占有しないプロセス(ベクトルAllocation = 0)をLテーブル、つまりLi∪Lに書き込みます。
(3)プロセスセットからRequesti≤Workのプロセスを見つけ、次の手順を実行します。①リソース割り当て図を簡略化し、リソースを解放して、作業ベクトルWork = Work + Allocation iを増やします。②Lリストに書き込みます。
(4)すべてのプロセスをLテーブルに記録できない場合は、システム状態Sのリソース割り当て図を完全に簡略化できないことを示しています。したがって、システム状態はデッドロックになります。

3.8.2デッドロックの解除

1.プロセスを終了する方法

  1. すべてのデッドロックプロセスを終了する
    これは最も簡単な方法です。つまり、すべてのデッドロックプロセスを終了するには、デッドロックは自然に解除されますが、支払われる価格は非常に大きくなる可能性があります。これらのプロセスの一部は長期間実行されており、終わりに近づいている可能性があるため、いったん終了すると、「失われた」と言え、最初からやり直す必要があります。他の費用があるかもしれません、そして私はそれらをここにリストしません。
  2. プロセスを1つずつ終了する
    少し穏やかな方法は、ループを中断し、システムをデッドロック状態から解放するために待機するのに十分なリソースがあるまで、プロセスを1つずつ特定の順序で終了することです。しかし、この方法のコストも高額になる可能性があります。プロセスを終了するたびに、デッドロック検出アルゴリズムを使用して、システムのデッドロックが解放されたかどうかを判別する必要があるため、解放されていない場合は、別のプロセスを終了する必要があります。さらに、プロセスを1つずつ終了する戦略を採用する場合、終了するプロセスを選択するためにどのような戦略を採用する必要があるかも含まれます。戦略を選択するための最も重要な基礎は、デッドロック除去の「コストが最小」であることです。しかし、「最低コスト」とは何か、正確な測定を行うことは困難です。

2.最小コストのデッドロック接触アルゴリズム
ここに画像の説明を挿入

公開された123元の記事 ウォン称賛91 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_43092232/article/details/105541023