Linuxでのスレッドの実装に関連するクエリがあります。
Linuxには明示的なスレッドサポートがありません。ユーザー空間では、スレッドの作成にスレッドライブラリ(NPTLなど)を使用できます。 NPTLを使用すると、1:1マッピングがサポートされるようになりました。
カーネルはclone()
関数を使用してスレッドを実装します。
4つのスレッドを作成したとします。それはそれを意味します:
task_struct
。task_struct
、クローン(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)
。今、私は次のクエリを持っています:
4つのスレッドは同じPIDを持ちますが、上記から見た場合のみyo(ユーザーとして)PIDの呼び出しは、カーネル(下から見て)が呼び出すものではありませんPID。
kernel、で、各スレッドはPIDと呼ばれる独自のIDを持ち(これをTIDまたはスレッドIDと呼ぶ方が意味があるかもしれませんが)、TGID(スレッドグループID)も持っていますこれは、プロセス全体を開始したスレッドのPIDです。
単純に、新しいprocessが作成されると、PIDとTGIDが同じ(新しい)番号であるスレッドとして表示されます。
スレッドが別のスレッドを開始するとthread、開始されたスレッドは独自のPIDを取得します(したがって、スケジューラーは独自にPIDをスケジュールできます)が、元のスレッドからTGIDを継承します。
このようにして、プロセス(スレッドグループID)が報告される一方で、カーネルはスレッドが属するプロセスに関係なくスレッドを喜んでスケジュールできます。
次のスレッドの階層が役立つ場合があります(a):
USER VIEW
<-- PID 43 --> <----------------- PID 42 ----------------->
+---------+
| process |
_| pid=42 |_
_/ | tgid=42 | \_ (new thread) _
_ (fork) _/ +---------+ \
/ +---------+
+---------+ | process |
| process | | pid=44 |
| pid=43 | | tgid=42 |
| tgid=43 | +---------+
+---------+
<-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->
KERNEL VIEW
新しいプロセス(左側)を開始すると新しいPIDが得られることがわかりますおよび新しいTGID(両方とも同じ値に設定)、新しい- thread(右側)は、開始したスレッドと同じTGIDを維持しながら、新しいPIDを提供します。
(a) we敬の念を起こさせる私の印象的なグラフィカルスキル:-)
スレッドは、PIDとTGID(スレッドグループID)を使用して識別されます。彼らはまた、どのスレッドが誰の親であるかを知っているので、本質的にプロセスは開始したスレッドとPIDを共有します。スレッドIDは通常、スレッドライブラリ自体(pthreadなど)によって管理されます。 4つのスレッドが開始される場合、それらは同じPIDを持つ必要があります。カーネル自体がスレッドのスケジューリングなどを処理しますが、ライブラリはスレッドを管理するものです(スレッドの実行と使用に応じて、スレッドが実行できるかどうか)。
注:これは、カーネル2.6.36の思い出です。現在のカーネルバージョンでの私の作業はI/O層であるため、それ以降変更されたかどうかはわかりません。