1

複数のユーザー モード スレッドを作成した実行中のプロセスがあります。カーネルがプロセスの状態をTASK_UNINTERRUPTIBLE(またはTASK_INTERRUPTIBLE) に変更した場合、プロセスによって作成されたスレッドは自動的に中断されますか?

これは宿題の質問ではありません。セマフォの実装方法を説明しているオペレーティング システムの本を読んでいます。それらの実装では、セマフォ構造体は、現在セマフォを待機しているプロセスのリンクされたリストを維持します。私がこれまでに学んだことから、そのようなセマフォはスレッドではなくプロセスを同期するためにのみ使用できました。正しい?リンク リスト内のスレッドはTASK_INTERRUPTIBLE、セマフォが使用可能になるまで状態に置かれます。セマフォが使用可能になった時点で、1 つのプロセスがその状態を に設定することによって起動されますTASK_RUNNING

4

1 に答える 1

4

Linuxでは、各スレッドはtaskプロセススコープ内で個別に実行されます。を参照してください/proc/self/task/。それらは、新しいプロセスと同じカーネル関数で作成されます。Linuxのスレッドは、「軽量プロセス」として生まれました。各タスクにはtid、プロセスID(pid)と同様の一意のタスクID()があり、実際、マスタースレッド(main()を実行するスレッド)はtidプロセスと同じpidです。

Linuxのスレッドとプロセスの唯一の機能上の違いは、すべてのスレッド(タスク)が以下のすべてのプロセスリソースを共有することです。

  • スケジューリングパラメータ(TASK_UNINTERRUPTIBLEを含むTASK_INTERRUPTIBLE
  • スタック
  • タスクID
  • main()スレッドはプロセスを識別します

したがってTASK_INTERRUPTIBLE、各スレッドに個別に適用できます。

そのため、セマフォはスレッドの同期に使用するのに完全に有効です。この場合、1つのスレッドがセマフォでブロックすると、その1つのスレッドがjusになります。

于 2012-11-19T19:19:59.827 に答える