セマフォは有界待ちを満たすか、または相互排除を提供するだけであるか?セマフォは有界待ちを満たす
7
A
答えて
2
回答
あなたは以下を参照してくださいますように、それは理論的に有界待っている状態を破壊することがあります。実際には、どのスケジューリングアルゴリズムが使用されているかによって大きく異なります。
wait()
とsignal()
プリミティブの古典的な実装は次のとおりです。
//primitive
wait(semaphore* S)
{
S->value--;
if (S->value < 0)
{
add this process to S->list;
block();
}
}
//primitive
signal(semaphore* S)
{
S->value++;
if (S->value <= 0)
{
remove a process P from S->list;
wakeup(P);
}
}
プロセスがwait()
を呼び出し、テスト「あれば」、それは待機リストに自分自身を配置します失敗した場合。同じセマフォ上で複数のプロセスがブロックされている場合、それらはすべてこのリストに入れられます(または、どういうわけか想像できるようにリンクされています)。別のプロセスがクリティカルセクションを離れ、signal()を呼び出すと、待機リストの1つのプロセスが起床し、CPUを再び競争できる状態になります。ただし、待機リストから選択するプロセスを決定するのはスケジューラです。たとえば、スケジューリングがLIFO(先入れ先出し)方式で実装されている場合、一部のプロセスが停止している可能性があります。
例
T1: thread 1 calls wait(), enters critical section
T2: thread 2 calls wait(), blocked in waiting list
T3: thread 3 calls wait(), blocked in waiting list
T4: thread 1 leaves critical section, calls signal()
T5: scheduler wakes up thread 3
T6: thread 3 enters critical section
T7: thread 4 calls wait(), blocked in waiting list
T8: thread 3 leaves critical section, calls signal()
T9: scheduler wakes up thread 4
..
あなたが見ることができるようにあなたが/正しくセマフォを使用して実装しているが、スレッド2は、新しいプロセスの連続のように入力して生じた、でもおそらく飢餓、無制限の待機時間があります。
関連する問題
- 1. GCDセマフォが待ちません(スウィフト)
- 2. 限界を満たしている有界自然界と自然界の同型性を確立するか?
- 3. string.contains()の条件が満たされるまで待ちます
- 4. セマフォを使用したバインド待機
- 5. fgets()境界の場合は入力待ちを防ぎます
- 6. セマフォと共有メモリ
- 7. 共有リソースへのアクセスロック解除または通知待ち
- 8. このコードセクションはどのように有界待ちを維持していますか?
- 9. オーディオストリーミングの方法iPhoneで50ミリ秒未満の待ち時間
- 10. 待ち
- 11. 待ち
- 12. 待ち
- 13. 待ち
- 14. 待ち()
- 15. 誰かが共有セマフォを待っている場合、C Posixスレッドをチェックインする方法は?
- 16. [Q/KDB +]:qでのwaitfor(信号待ちまたはタイムアウト待ち)実装
- 17. セマフォとミューテックスはどちらが速いのですか?
- 18. イテレータまたはforeachの待ち時間
- 19. 即時待ちの返り値対延期待ちの待ち時間
- 20. C#非同期タスク待機待ちvs待ち受け
- 21. Windows上のPythonと共有メモリのセマフォ?
- 22. 共有メモリ内のセマフォ、プロセス、インクリメント変数
- 23. 待ち1
- 24. エスプレッソ待ちテキストビュー
- 25. フォームリターン待ちvb.net
- 26. C#待ちタスクコンソールスプラッシュ
- 27. 待ち次
- 28. レンジマッチングループが境界条件を満たさないのはなぜですか?
- 29. Total.jsはローカライゼーションのイベントを待ちます
- 30. ネイティブは/ asyncとwebpackを待ちます