Разница между PID и TID
В чем разница между PID и TID?
Стандартный ответ будет заключаться в том, что PID для процессов, а TID - для потоков. Однако я видел, что некоторые команды используют их взаимозаменяемо. Например, htop
имеет столбец для PID, в котором показаны PID для потоков одного и того же процесса (с разными значениями). Итак, когда PID представляет поток или процесс?
Ответы
Ответ 1
Это сложно: pid - идентификатор процесса; tid - это идентификатор потока.
Но, как это бывает, ядро не делает реального различия между ними: потоки - это как процессы, но они имеют некоторые вещи (память, fds...) с другими экземплярами одной и той же группы.
Таким образом, tid на самом деле является идентификатором планируемого объекта в ядре (потоке), тогда как pid является идентификатором группы планируемых объектов, которые совместно используют память и fds (процесс).
Но для того, чтобы сделать вещи более интересными, когда процесс имеет только один поток (исходная ситуация и в старые добрые времена единственная), pid и tid всегда одинаковы. Таким образом, любая функция, которая работает с tid, автоматически будет работать с pid.
Стоит отметить, что многие функции/системные вызовы/утилиты командной строки, задокументированные для работы с pid, фактически используют tids. Но если эффект является процессом, вы просто не заметите разницы.
Ответ 2
Фактически, каждый поток в процессе Linux - это процесс с легким весом (LWP). Таким образом, люди могут назвать поток как процесс... Но, безусловно, есть разница.
Каждый поток в процессе имеет другой идентификатор потока (TID) и использует один и тот же идентификатор процесса (PID).
Если вы работаете с библиотечными функциями pthread, эти функции не используют эти TID, потому что это идентификаторы потоков уровня ядра/OS.
Ответ 3
Чтобы добавить к другим ответам, в соответствии с man gettid
:
Идентификатор потока, возвращаемый этим вызовом, - это не то же самое, что и идентификатор потока POSIX (т.е. непрозрачное значение, возвращаемое pthread_self (3)).
Таким образом, TID могут иметь две разные вещи:
Ответ 4
pid и tid одинаковы, за исключением случаев, когда процесс создается с вызовом clone
с CLONE_THREAD
(на man-страницы gettid
). В этом случае вы получаете уникальный идентификатор потока, но все потоки, принадлежащие к одной группе потоков, имеют один и тот же идентификатор процесса.
Однако я также помню, как читал (хотя я не могу найти источник), что значения, возвращаемые из getpid
, могут быть кэшированы.
[ОБНОВЛЕНИЕ]
См. Раздел NOTES
здесь для обсуждения эффектов кеширования pids
.