4つのスレッドは同じPIDを持ちますが、上から見た場合のみです。あなたが(ユーザーとして)PIDと呼ぶものは、カーネル(下から見て)がPIDと呼ぶものではありません。
では、カーネル、各スレッドは、スレッドのPIDである(それはおそらく、このTID、またはスレッドIDを呼び出すためのより多くの意味になるだろうが)、彼らはまたTGID(スレッドグループID)を持っているPIDと呼ばれるそれ自身のIDを持っていますそれが全体のプロセスを開始しました。
簡単に言うと、新しいプロセスが作成されると、PIDとTGIDの両方が同じ(新しい)番号であるスレッドとして表示されます。
スレッドが別のスレッドを開始すると、その開始されたスレッドは独自の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(どちらも同じ値に設定)が得られますが、新しいスレッド(右側)を開始すると、同じPIDが維持されます。 TGIDを開始したスレッド。
(a) 私の印象的なグラフィックスキルに畏怖の念を覚える:-)
getpid()
戻りTGID:asmlinkage long sys_getpid(void) { return current->tgid;}
に示すようにwww.makelinux.com/