マルチタスクシステムでは、いくつかの異常な状態により、プロセスまたはスレッドの実行の進行が妨げられます。プロセスとスレッドの両方を単に「プロセス」と呼びます。これらの条件のうち2つは、デッドロックとライブロックと呼ばれます。
前者は、お互いをブロックしているプロセスを指し、そのため、どちらも実行できません。後者は、お互いの進行を妨げるプロセスを指しますが、実際には実行をブロックしません。例えば、それらはトランザクションをロールバックし、どちらもトランザクションを終了することはできません。
別の状態はリソース不足と呼ばれ、プロセスの進行に必要な1つ以上の有限のリソースが枯渇し、プロセスが進行しない限り復元できない状態です。これは、ライブロックの特殊なケースでもあります。
「資源の枯渇」に限定されない「飢v」について、他の定義、特に学術的な定義があるかどうかを知りたい。参照は特に歓迎します。
そして、いや、これは宿題ではありません。 :-)
リソースの枯渇がライブロックの特殊なケースであるとは言いません。通常:
ライブロックでは、スレッドは進行しませんが、実行を続けます。 (デッドロックでは、実行さえ続けません)
飢star状態になると、一部のスレッドは進行し、一部のスレッドは実行されません。
適切な説明: http://docs.Oracle.com/javase/tutorial/essential/concurrency/starvelive.html 。しかし、用語の選択は異なる場合があることを理解しています。
飢starに関しては、私が聞いた定義は次のとおりです。
スレッドTがリソースを待機して一時停止し、無限に可能な場合でも再開されないように、仮定(セマフォセマンティクス、OSスケジューラの動作...)と一貫性のある無限の実行パス(インターレース)を指定できると仮定します。 。 Tは飢えと呼ばれます。
しかし、慣習はそれと一致しません。 2つのスレッドがクリティカルセクションを無限ループで実行するとします。同期コードにより、最初のスレッドは1時間に1回、クリティカルセクションに入ることができます。飢starですか?両方のスレッドの進行は許可されていますが、最初のスレッドはゆっくりと作業を行っています。
飢starの最も単純な原因は弱いセマフォです。同様に動作する同期プリミティブを使用している(または独自に構築している)場合、飢starが発生します。
飢starがよく知られている古典的な問題:
読者と作家の問題。 (1)リーダーがライターを飢えさせることができるように(2)ライターがリーダーを飢えさせることができるように(3)飢starが発生しないようにスレッドを同期することができます( http:// en.wikipedia.org/wiki/Readers-writers_problem )
食事する哲学者( http://en.wikipedia.org/wiki/Dining_philosophers_problem )
詳細については、The Little Book of Semaphores(無料)を心からお勧めします: http://www.greenteapress.com/semaphores/ 。
すべての飢starが何らかのリソースを待つことによって引き起こされているかどうかを尋ねています。私は言う-はい。
スレッドを中断できます:
(1)ブロッキングシステムコールの一部-ミューテックス、セマフォ、条件変数の待機/取得。 write()、poll()など。
(2)いくつかの非ブロッキング操作-計算の実行など。
(1)の飢えは、リソース(ミューテックス、バッファなど)に飢えています。
(2)の飢えはCPUに飢えています-リソースと見なすことができます。発生した場合、問題はスケジューラにあります。
HTH
妊娠中の女性が優先されるレストランで食べ物を購入するために列に並んでいると想像してください。そして、常に到着する妊婦の束があります。
あなたはすぐに飢えます。 ;)
今、あなたは優先度の低いプロセスであり、妊婦は優先度の高いプロセスであると想像してください。 =)
飢orまたは「無期限のブロック」が通常発生する別の領域は、優先度スケジューリングアルゴリズムについて話すときです。優先度スケジューリングアルゴリズムには、低優先度プロセスを無期限に待機させる可能性があります。優先度の高いプロセスの安定したストリームは、優先度の低いプロセスが実行されるのを防ぐことができます。
優先度スケジューラの場合、解決策は「エージング」です。エージングとは、システムで長時間待機するプロセスの優先度を徐々に高める手法です。
飢ationとは、システムにデッドロックがない場合でも、プロセスまたはサービスが提供されていない場合です。
これは、説明のためだけに作成した例です。
WANまたはそのようなものへのコンピューターアクセスを制御するアルゴリズムを想像してください。このアルゴリズムには、「より少ない帯域幅を使用するコンピューターへの優先アクセスを提供する」というポリシーがあります。適切なポリシーに似ていますが、数GBを送信するFTPアップロードのために1台のコンピューターがネットワークにアクセスしようとするとどうなります。このポリシーだけでは、アルゴリズムがそのコンピューターを選択しないため、そのコンピューターは飢えます。常により小さな帯域幅の使用を要求する他のコンピューターであること。
それは飢starと呼ばれます。
Workも一種のリソースです。生産者と消費者のセットアップでの作業配分が公平でない(または理想的でない)場合、一部のスレッドは常に作業を続けるのに十分な作業項目を取得できない可能性があります。
プロセスは、1つまたは複数のリソースを長時間取得しません。 1つのプロセスが問題なく実行されるため、これはデッドロックではありません。エージングはこの問題を解決するために使用できます。エージング係数は各リクエストに使用されます。