2

私は、ユーザー空間スレッドを実装する仕組みを理解しようとしています。スタックとフレームの仕組みがわかりません。スレッド化とその実装方法を説明している 2 つの非常に優れたリソース (ここここ)に出くわしましたが、次の詳細をまだ理解していません。

  1. スレッドの実行でマシン コンテキストはどのように使用されますか? スタック ポインターと一連のレジスタ値で構成されていることはわかっています。しかし、OS はそれをどのように使用してスレッドを実行するのでしょうか?
  2. なぜトランポリン関数 (mctx_create_trampoline) が必要なのですか? リンク #2 では、マシン コンテキストを保存し、スレッド関数 (mctx_create_boot) を開始するシグナル ハンドラーとして関数をセットアップします。
  3. これらの関数に基づいて、スレッドが呼び出すことができる「yield」関数をどのように実装しますか? また、実行中のスレッドをどのように中断できますか? タイマーと、オフになったときにシグナルハンドラーを呼び出す SIGALRM があると思います。ただし、yield 関数がコンテキストを切り替えると、シグナル ハンドラーが返されず、それ以上のシグナルの配信がブロックされます。
4

1 に答える 1

1
  1. スレッドが物理 CPU での実行を開始すると、タイム スライスが期限切れになるか、その他の再スケジュールが必要になるまで、OS は関与しなくなります。重要な質問は、スレッドが物理 CPU に対してどのようにスケジュールされているかということです。OS は物理 CPU レジスタを適切な値に設定し、スレッドが最後に中断された場所にジャンプします (実際には、命令ポインタが設定されます)。この時点で、OS は制御を失い、関与しなくなります。ハードウェア割り込みが発生した場合、または他の物理 CPU コアが CPU の制御を取得することを決定した場合にのみ、制御を取り戻すことができます。
  2. 現在、そのドキュメントを開けません。
  3. 「yield」はユーザー空間では実装できません。これは通常、他のスレッドを選択してスケジュールし、それを現在の CPU にスケジュールするカーネル API です。
于 2013-03-30T22:20:25.343 に答える