Подтвердить что ты не робот

Разница между PID и TID

В чем разница между PID и TID?

Стандартный ответ будет заключаться в том, что PID для процессов, а TID - для потоков. Однако я видел, что некоторые команды используют их взаимозаменяемо. Например, htop имеет столбец для PID, в котором показаны PID для потоков одного и того же процесса (с разными значениями). Итак, когда PID представляет поток или процесс?

4b9b3361

Ответ 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.