Как Linux отличает потоки от дочерних процессов?

21

Linux на самом деле не различает процессы и потоки и реализует их как структуру данных task_struct.

Так что же Linux предоставляет некоторым программам, чтобы они могли отличить потоки процесса от его дочерних процессов? Например, есть ли способ увидеть детали всех потоков, которые есть у процесса в Linux?

Спасибо.

Тим
источник

Ответы:

28

С 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
  1. Это запускает topкоманду с некоторыми дополнительными параметрами:

    top -H -b -n 1
    
    • -H аргументе инструктирует начало , чтобы отобразить каждый отдельный поток. Обычно top суммирует все потоки в родительском процессе.
    • -bАргумент делает верхний прогон в пакетном режиме - информация собрана, отображается, а затем сбрасывали на стандартный вывод , а не работает в интерактивном режиме и обновления отображаются данные.
    • С помощью -bопции пользователь должен указать top, сколько раз запустить, это делается с -nаргументом и последним аргументом с тем, сколько раз запустить.

    Поэтому top -H -b -n 1инструктирует систему «запускать сверху, отображать отдельные потоки, запускать в пакетном режиме и запускать только один раз».

  2. Команда psсообщает о снимке запущенных в данный момент процессов.

    ps -eLf
    

    -eLfАргумент (можно использовать в качестве -e -L -f, а) срывается следующим образом :

    • e говорит ps отображать все процессы независимо от того, кому они принадлежат или их текущее состояние - активный, спящий, приостановленный, ожидающий ввода-вывода и т. д.
    • L говорит ps показать отдельные темы
    • fговорит psдля форматирования вывода в качестве полного формата списка, а также в сочетании с Lаргументом NLWP (число нитей) и LWP (резьба ID) столбцы добавляются к выходу.
ivanivan
источник
1

Рассмотрим процесс с PID p1

task_structОбъект дочернего процесса будет иметь PPID (родительский PID) в p1, и это PID и TGID набор, скажем, p2.

task_structОбъект нити p1 будет иметь набор ПИД - регулятора , как, скажем p3, но TGID набор для p1.

NOLFXceptMe
источник
Итак, вы говорите то же самое, что и Стивен Китт , но гораздо менее ясно. PS Зачем беспокоиться о включении PPID в обсуждение, если вы не собираетесь говорить, что такое PPID потока?
Скотт
PID и TGID всегда одинаковы.
Тим