誰かがLinuxの睡眠/覚醒力学を説明できますか?

誰かがLinuxの睡眠/覚醒力学を説明できますか?

私はオペレーティングシステムのロックメカニズムを研究中に、次の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操作が完了したときに再スケジュールされるようにカーネルスペースのリストに配置されているかのように、条件変数を待っているスレッドは、その条件変数のユーザースペースのリストに配置されます。したがって、あなたの質問に対する答えは「はいまたはいいえ」です。 :-)

そして、現在のスレッド実装は長年にわたって最適化されてきたので、実装が(より単純な)原則と一致しなくても詰まらないでください。

おすすめ記事