Документація може бути досить заплутаною, тому ось " справжня " модель Linux:
- всередині ядра Linux те, що можна запустити (і запланувати), називається "процесом",
- кожен процес має унікальний ідентифікатор процесу (PID) та ідентифікатор групи ниток (TGID),
- "нормальний" процес має PID = TGID, і жоден інший процес не поділяє це значення TGID,
- "потоковий" процес - це процес, значення якого TGID поділяється іншими процесами,
- кілька процесів спільного використання одного і того ж TGID також діляться, принаймні, тим самим простором пам'яті та обробниками сигналів (іноді більше),
- якщо "потоковий" процес має PID = TGID, його можна назвати "основним потоком",
- дзвінок
getpid()
з будь-якого процесу поверне свій TGID (= "PID основного потоку"),
- дзвінок
gettid()
з будь-якого процесу поверне PID (!),
- будь-який процес може бути створений за допомогою
clone(2)
системного виклику,
- числові імена папок, з якими ви можете перелічити,
ls /proc
як /proc/NUMBER
TGID,
- числові імена папок,
/proc/TGID/task
як /proc/TGID/task/NUMBER
і PID,
- незважаючи на те, що ви не бачите всіх існуючих PID
ls /proc
, ви все одно можете це зробити cd /proc/any_PID
.
Висновок : з точки зору ядра, існують лише процеси, кожен з яких має свій унікальний PID, а так званий потік - це просто різного роду процес.
Примітка: реалізація концепції "потоку" в Linux призвела до плутанини лексики, і якщо getpid()
брехня вам не робить те, що ви думали, це тому, що її поведінка відповідає сумісності POSIX (потоки повинні мати спільний PID) .