ベストプラクティスはポーリングしないことですが、スレッドがwait()を呼び出したときに内部でポーリングが発生しないのですか?


13

別のスレッドがタスクを終了したときにチェックしたいスレッドがあるとします。他のスレッドが終了したという通知を受け取るまでこのスレッドを待機させるwait()タイプの関数を呼び出す必要があることを読みました。そして、これは私たちが高価なポーリングを実行していないことを意味するため、これは良いことです。

しかし、とにかく内部で低レベルでポーリングが行われていませんか?つまり、スレッドをwait()にすると、カーネルは他のスレッドがいつ終了するかをチェックして、最初のスレッドに通知できるようにポーリングを実行しますか?

私はここで何かを見逃していると思いますが、誰かが私を啓発できますか?

回答:


28

オペレーティングシステムは、ポーリングを必要としないこの種のプロセス間通信に特定のプリミティブを提供します。

プロセスAがミューテックスMで待機している場合、OSはAが実行できないことを認識し、何かが発生するのを待っているプロセスのバケットにそれを置いておきます。Mを保持しているプロセスが解放すると、OSはそれを待機しているプロセスのリストを確認します。リストの最初のプロセス(おそらくA)は、アイドルバケットから削除され、実行キューに入れられます。Aが次にタイムスライスを取得すると、呼び出したwait()が返され、プログラムが続行されます。


ある意味ではポーリングですが、OSレベルでですか?
tgkprog

7
@tgkprogはありません。これはポーリングではありません。待機プロセスは、OSまたは別のプロセスがミューテックスを解放するまで実行されるようにスケジュールされていないためです。ポーリングプロセスは、CPUスケジューリングで競合を続け、待機を停止する必要があるかどうかを確認します。この種のポーリングプロセスは、待機中にCPU時間のかなりの部分を消費する可能性があります。
joshp

OSプロセスがミューテックスステータスをポーリングすることを意味しました。しかし、私はそれが最適化され、私たちができることよりも優れていると確信しています。おそらくスケジューラの一部として実行されます。
tgkprog

4
@tgkprog:OSは、mutexを保持しているプロセスがそれを解放するか終了するまで、mutexで何が起こっているかに少し注意を払いません。これらのイベントのいずれかにより、OSは待機リストの最初のプロセスにmutexロックを渡し、そのプロセスを実行可能としてマークします。ポーリングは必要ありません。イベントへの応答だけです。joshpが述べたすべての内容は参照により含まれています。:-)
Blrfl

2
@csss:かなり。プロセスは、自発的(例:_exit(2)POSIX-yシステムでの呼び出し)または非自発的(例:ゼロ除算のようなエラーが割り込みまたはその他の呼び出しを生成するkill(2))で終了する場合があります。どちらの場合でも、制御は明示的にOSに戻され、OSは実行中のプロセスまたは強制終了されるプロセスを認識します。プロセスを終了するジョブには、mutexを含むリソースの解放が含まれます。ミューテックスが現在デッドプロセスによって保持されている場合、OSはそれを解放します。プロセスがミューテックスの待機リストにあった場合、削除されます。
Blrfl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.