С task_structточки зрения, потоки процесса имеют одного и того же лидера группы потоков ( group_leaderintask_struct ), тогда как дочерние процессы имеют другого лидера группы потоков (каждый отдельный дочерний процесс).
Эта информация подвергается воздействию пользовательского пространства с помощью в /procфайловой системе. Вы можете отследить родителей и детей, посмотрев на ppidполе в /proc/${pid}/statили .../status(это дает родительский pid); Вы можете отслеживать потоки, посмотрев на tgidполе в .../status(это дает идентификатор группы потоков, который также является pid лидера группы). Потоки процесса становятся видимыми в /proc/${pid}/taskкаталоге: каждый поток получает свой собственный подкаталог. (У каждого процесса есть хотя бы один поток.)
На практике программы, желающие отслеживать свои собственные потоки, будут полагаться на API, предоставляемые библиотекой потоков, которую они используют, вместо использования информации, специфичной для ОС. Обычно в Unix-подобных системах это означает использование pthreads.
Каждый процесс в конвейере оболочки (echo foo | cat) имеет одного и того же лидера группы (оболочку), но они не являются потоками в одном и том же процессе.
psusi
2
Вы говорите о группах процессов; в моем ответе лидер группы с точки зрения ядра. В учете ядра отдельные процессы являются лидерами своих групп. Вы можете увидеть это, запустив (sleep 120 | sleep 120) &и посмотрев Tgidзначения в файле каждого sleepпроцесса /proc/${pid}/status.
Стивен Китт
Ох странно Я не знал, что существует такая вещь, как «лидер группы потоков», и я думал, что предположительно все потоки в многопоточном процессе равны, и «лидера» нет. Любой из них может выйти, и пока он остается, процесс не умер.
psusi
5
Это запускает topкоманду с некоторыми дополнительными параметрами:
top -H -b -n 1
-H аргументе инструктирует начало , чтобы отобразить каждый отдельный поток. Обычно top суммирует все потоки в родительском процессе.
-bАргумент делает верхний прогон в пакетном режиме - информация собрана, отображается, а затем сбрасывали на стандартный вывод , а не работает в интерактивном режиме и обновления отображаются данные.
С помощью -bопции пользователь должен указать top, сколько раз запустить, это делается с -nаргументом и последним аргументом с тем, сколько раз запустить.
Поэтому top -H -b -n 1инструктирует систему «запускать сверху, отображать отдельные потоки, запускать в пакетном режиме и запускать только один раз».
Команда psсообщает о снимке запущенных в данный момент процессов.
ps -eLf
-eLfАргумент (можно использовать в качестве -e -L -f, а) срывается следующим образом :
e говорит ps отображать все процессы независимо от того, кому они принадлежат или их текущее состояние - активный, спящий, приостановленный, ожидающий ввода-вывода и т. д.
L говорит ps показать отдельные темы
fговорит psдля форматирования вывода в качестве полного формата списка, а также в сочетании с Lаргументом NLWP (число нитей) и LWP (резьба ID) столбцы добавляются к выходу.
Итак, вы говорите то же самое, что и Стивен Китт , но гораздо менее ясно. PS Зачем беспокоиться о включении PPID в обсуждение, если вы не собираетесь говорить, что такое PPID потока?
(sleep 120 | sleep 120) &
и посмотревTgid
значения в файле каждогоsleep
процесса/proc/${pid}/status
.Это запускает
top
команду с некоторыми дополнительными параметрами:-H
аргументе инструктирует начало , чтобы отобразить каждый отдельный поток. Обычно top суммирует все потоки в родительском процессе.-b
Аргумент делает верхний прогон в пакетном режиме - информация собрана, отображается, а затем сбрасывали на стандартный вывод , а не работает в интерактивном режиме и обновления отображаются данные.-b
опции пользователь должен указать top, сколько раз запустить, это делается с-n
аргументом и последним аргументом с тем, сколько раз запустить.Поэтому
top -H -b -n 1
инструктирует систему «запускать сверху, отображать отдельные потоки, запускать в пакетном режиме и запускать только один раз».Команда
ps
сообщает о снимке запущенных в данный момент процессов.-eLf
Аргумент (можно использовать в качестве-e -L -f
, а) срывается следующим образом :e
говоритps
отображать все процессы независимо от того, кому они принадлежат или их текущее состояние - активный, спящий, приостановленный, ожидающий ввода-вывода и т. д.L
говоритps
показать отдельные темыf
говоритps
для форматирования вывода в качестве полного формата списка, а также в сочетании сL
аргументом NLWP (число нитей) и LWP (резьба ID) столбцы добавляются к выходу.источник
Рассмотрим процесс с PID p1
task_struct
Объект дочернего процесса будет иметь PPID (родительский PID) в p1, и это PID и TGID набор, скажем, p2.task_struct
Объект нити p1 будет иметь набор ПИД - регулятора , как, скажем p3, но TGID набор для p1.источник