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

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

56 голосов
/ 23 декабря 2010

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

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

Ответы [ 4 ]

83 голосов
/ 09 января 2012

Сложно: pid - идентификатор процесса; tid - идентификатор потока.

Но, как оказалось, ядро ​​не делает между ними реального различия: потоки похожи на процессы, но они разделяют некоторые вещи (память, fds ...) с другими экземплярами той же группы .

Таким образом, tid фактически является идентификатором планируемого объекта в ядре (потоке), тогда как pid является идентификатором группы планируемых объектов, которые совместно используют память и FDS (процесс).

Но, чтобы сделать вещи более интересными, когда у процесса есть только один поток (исходная ситуация и в старые добрые времена единственный), pid и tid всегда тот же самый. Поэтому любая функция, которая работает с tid , будет автоматически работать с pid .

Стоит отметить, что многие функции / системные вызовы / утилиты командной строки, задокументированные для работы с pid , на самом деле используют tids . Но если эффект распространяется на весь процесс, вы просто не заметите разницу.

3 голосов
/ 09 января 2012

На самом деле, каждый поток в процессе Linux - это Облегченный процесс (LWP). Таким образом, люди могут называть нить как процесс ... Но, безусловно, есть разница. Каждый поток в процессе имеет свой идентификатор (TID) и использует один и тот же идентификатор процесса (PID).

Если вы работаете с функциями библиотеки pthread, то эти функции не используют эти TID, потому что это идентификаторы потоков уровня ядра / ОС.

2 голосов
/ 07 мая 2016

Просто чтобы добавить к другим ответам, согласно man gettid:

Идентификатор потока, возвращаемый этим вызовом, не совпадает с идентификатором потока POSIX (т.е. непрозрачное значение, возвращаемое pthread_self (3)).

Итак, есть две разные вещи, которые можно понимать под TID!

0 голосов
/ 23 декабря 2010

pid и tid одинаковы, за исключением случаев, когда процесс создается с вызовом clone с CLONE_THREAD (для справочных страниц gettid).В этом случае вы получаете уникальный идентификатор потока, но все потоки, принадлежащие к одной и той же группе потоков, имеют один и тот же идентификатор процесса.

Однако я также вспоминаю чтение (хотя я не могу найти источник), что значения возвращаются изgetpid может быть кэшировано.

[ОБНОВЛЕНИЕ] См. Раздел NOTES здесь для обсуждения эффектов кэширования pids.

...