
私はオペレーティングシステムのロックメカニズムを研究中に、次のPOSIX機能を発見しました。
pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m);
pthread_cond_signal(pthread_cond_t *c);
私はここで睡眠/覚醒の概念を完全に理解しています。しかし、これがハードウェアでどのように実行されるのか、スケジューリングにどのような影響があるのかわかりません。
私の理解は、スレッドが実行されるとpthread_cond_wait()がスリープモード(ブロック)に切り替わるということです。しかし、これは実際に何を意味しますか?はい、スケジュールはキャンセルされ、特権キューのどこかでブロックされた状態になります。しかし、他のプロセスがpthread_cond_signal()を実行すると、CPUはブロックされたスレッドをどのように起動しますか?カーネルは、タイマー割り込み中にすべての条件変数をチェックし、解放されたスレッドに関連したスレッドを目覚めさせることを決定しますか?
オンラインでこれの詳細な説明が見つからないか、私が間違って見たかもしれません。
どんな助けでも大変感謝します。
答え1
スケジュールするプロセス/スレッドのキューにプロセス/スレッドを挿入して、そのプロセス/スレッドを起動します。見たら源泉その中には、signal
条件変数を待っているスレッドのユーザー空間のリストがあり、そのうちの1つはfutex
システムコールによって起動されます。マティックごとに条件変数の配列を確認するのは非常に遅くなります。
もしそうなら、ブロックされるスレッドを説明するとき、これはI / Oを待っているスレッドのようにブロックキューに入ることを意味しません。
スレッドは、ユーザー空間とカーネル空間を混在させることで実装されます。 I / Oを待っているスレッド/プロセスが、特定のI / O操作が完了したときに再スケジュールされるようにカーネルスペースのリストに配置されているかのように、条件変数を待っているスレッドは、その条件変数のユーザースペースのリストに配置されます。したがって、あなたの質問に対する答えは「はいまたはいいえ」です。 :-)
そして、現在のスレッド実装は長年にわたって最適化されてきたので、実装が(より単純な)原則と一致しなくても詰まらないでください。
答え2
スレッドがスリープメソッドを呼び出すと、スレッドがスリープキューに追加されます。計算されたクロック周波数が100HZの場合、現在実行中のプロセスが10msごとに中断されることを意味します。スレッドの現在のコンテキストを維持した後、スレッドごとにこの値(-10ms)を減らします。 0の場合、スレッドは「CPU待機中」キューに移動されます。このスレッドにタイムスライスが来ると再実行されます。また、すぐに実行が開始されないため、実際のスリープ時間は設定した値よりも長くなります。