比較表
比較の基礎 | デッドロック | 飢餓 |
---|---|---|
基本 | デッドロックはプロセスが進行せず、ブロックされる場所です。 | 飢餓は、優先順位の低いプロセスがブロックされ、優先順位の高いプロセスが進行する場所です。 |
発生条件 | 相互排除、Hold and wait、No preemption、およびCircular waitの同時発生。 | 優先順位の強制、管理されていないリソース管理。 |
他の名前 | 循環待ち | ライフロック |
リソース | デッドロック状態では、要求されたリソースは他のプロセスによってブロックされています。 | 飢餓状態では、要求されたリソースは優先度の高いプロセスによって継続的に使用されます。 |
防止 | 相互排除の回避、保留および待機、循環待機およびプリエンプションの許可。 | 加齢 |
デッドロックの定義
デッドロックは、CPU内のいくつかのプロセスがCPU内で利用可能な有限数のリソースをめぐって競合する状況です。 ここで、各プロセスはリソースを保持し、他のプロセスによって保持されているリソースの取得を待ちます。 すべてのプロセスは循環的にリソースを待ちます。 以下の図では、プロセスP1がプロセスP2によって要求されたリソースR2を獲得し、プロセスP1がリソースR1を要求していて、そのリソースR1がR2によって保持されていることがわかります。 そのため、プロセスP1とP2はデッドロックを形成します。
- 相互排除:他のプロセスが同じリソースを要求した場合、一度に1つのプロセスしかリソースを使用できません。リソースを使用しているプロセスが解放するまで待機する必要があります。
- 保留および待機:プロセスはリソースを保留し、他のプロセスによって保留されている別のリソースの獲得を待機している必要があります。
- プリエンプションなし:リソースを保持しているプロセスをプリエンプトすることはできません。 リソースを保持しているプロセスは、タスクが完了したときに自発的にリソースを解放する必要があります。
- 循環待機:プロセスは循環的にリソースを待機する必要があります。 3つのプロセス{P0、P1、P2}があるとします。 P0はP1が保持しているリソースを待つ必要があります。 P1は、プロセスP2によって保持されているリソースの取得を待つ必要があり、P2は、P0によって保持されているプロセスの取得を待つ必要があります。
デッドロックする可能性があるプログラムを検出できるアプリケーションはいくつかありますが。 しかし、オペレーティングシステムがデッドロックを防ぐ責任を負うことはありません。 デッドロックフリープログラムを設計するのはプログラマの責任です。 デッドロックが発生するのに必要な上記の条件を回避することによって実行できます。
飢餓の定義
飢餓は、あるプロセスに対するリソースの要求とそのリソースが他のプロセスによって継続的に使用されている場合に、要求側のプロセスが飢餓に直面していると定義できます。 飢餓状態では、実行可能なプロセスはCPUがリソースを割り当てるのを待ちます。 しかし、他のプロセスが要求されたリソースを継続的にブロックするため、プロセスは無期限に待機する必要があります。
飢餓の問題は一般的に優先順位スケジューリングアルゴリズムで発生する 。 優先順位スケジューリングアルゴリズムでは、優先順位の高いプロセスに常にリソースが割り当てられ、優先順位の低いプロセスが要求されたリソースを取得するのを防ぎます。
老化は飢餓の問題を解決することができます。 エージングは、リソースを長時間待機していたプロセスの優先順位を徐々に上げます。 エージングは、優先順位の低いプロセスがリソースを無期限に待機するのを防ぎます。
OSにおけるデッドロックと飢餓の主な違い
- デッドロックでは、どのプロセスも実行に進みません。各プロセスは、別のプロセスによって獲得されたリソースを待ってブロックされます。 一方、枯渇とは、優先順位の低いプロセスがリソースを獲得できないようにして、優先順位の高いプロセスがリソースを継続的に獲得できるようにして、優先順位の低いプロセスを無期限にブロックすることです。
- デッドロックは、4つの条件相互排除、保留と待機、プリエンプションなし、および循環待機が同時に発生した場合に発生します。 ただし、リソースの割り当て中にプロセスの優先順位が強制された場合、またはシステムに制御されていないリソース管理がある場合は、枯渇が発生します。
- デッドロックはしばしば循環待機という名前で呼ばれますが、飢餓はライブロックと呼ばれます 。
- デッドロックでは、リソースはプロセスによってブロックされますが、飢餓状態では、プロセスは優先度の高いプロセスによって継続的に使用されています。
- 相互排他、保留と待機、循環待機などの条件を回避し、リソースを長時間保持しているプロセスを横取りすることで、デッドロックを防ぐことができます。 一方、飢餓は老化によって防ぐことができます。
結論:
DeadlockとStarvationはどちらもブロックすることでプロセスの実行を遅らせます。 一方ではデッドロックによってプロセスが枯渇する可能性があり、他方では飢餓によってプロセスがデッドロックから解放される可能性があります。