2011-02-10 6 views
1

私は、現在のスレッドがクリティカルセクションを完了したときに、ミューテックスとセマフォが待機中のプロセスのリストを保持し、それらを起動させることを読んでいます。ミューテックスとセマフォはどうしたらできますか?彼らはプロセススケジューラの決定に干渉しませんか?ミューテックスまたはセマフォーはどのようにプロセスを起動させますか?

答えて

5

スケジューラで待機中および起床は通常行われます。待機中のスレッドの特定の1つを強制的にウェイクさせるミューテックスの実装は、通常、実装が不良であるとみなされます。

代わりに、ミューテックスまたはセマフォは、スレッドが待機中であることをスケジューラに通知し、「実行準備」リストから取り除くことになります。そして、ミューテックスのロックが解除されているか、セマフォが合図、実装はすべてスケジューラに通知

  1. スケジューラの判断で待機中のスレッドの1を覚ますために、スケジューラを頼むか、

  2. しますか待機中のスレッドは実行準備が整っており、次に待機中のスレッドに論理を持たせることで、スケジューラが目を覚ます最初のスレッドを除くすべてのスレッドが再びスリープ状態に戻るようにします。

前者が好ましい実装選択であるが、必ずしも利用可能であるとは限らない。 2番目の方法はしばしば "雷の群れ"と呼ばれています.1000スレッドが待機している場合は、1000スレッドがすべて目覚め(大きな雷の群れ)、999回だけスリープ状態に戻ります。これはCPUリソースの無駄であり、実装は可能な限り回避します。

+0

情報提供中!しかし、私はまだ疑問を持っています。なぜスケジューラは、キュー内のすべてのスレッドをスリープ状態にすることなく、キュー内の最初のキューをフェッチできないのですか? 2つのうちどれが現在Linux上のposixスレッドライブラリを実装していますか?ありがとう! – zach

+0

これは上記のオプション1です:スケジューラの裁量で1つ目を起こしてください。 –

+0

私はLinux上でpthread_mutex_tが1つのスレッドしか起きないと思います。 –

0

これは、実装に大きく依存します。これらのことについて言えば、私たちは通常、オペレーティングシステムをサポートしているスレッドを参照しているか、言語で完全に実装されているため、スレッドサポートのためにO/Sと対話していません。

これらはプロセスを参照することもできますが、これらの実装では通常、プロセス管理のO/Sサポートに加えて複雑なメッセージパッシングパターンが必要です。

0

はい、単純な説明は、待機条件が満たされるまで、待機プロセス(セマフォまたは入出力)がスケジューラの実行キューから削除されるという単純な説明です。

関連する問題