Як Linux розказує теми, крім дитячих процесів?


21

Linux насправді не розрізняє процеси та потоки і реалізує як структуру даних task_struct.

Отже, що Linux надає деяким програмам для того, щоб розповісти нитки процесу з його дочірніх процесів? Наприклад, чи є спосіб переглянути деталі всіх потоків, які має процес в Linux?

Спасибі.

Відповіді:


28

З task_structточки зору, потоки процесу мають однаковий лідер групи потоків ( group_leaderвtask_struct ), тоді як дочірні процеси мають різного лідера групи потоків (кожен окремий дочірній процес).

Ця інформація піддається впливу робочих просторів з допомогою в /procфайлової системі. Ви можете відстежувати батьків і дітей, дивлячись на ppidполе в /proc/${pid}/statабо .../status(це дає батьківський під); Ви можете відстежувати теми, дивлячись на tgidполе в .../status(це дає ідентифікатор групи ниток, який також є лідером групи). Нитки процесу стають видимими в /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аргументі інструктує початок , щоб відобразити кожен окремий потік. Зазвичай вгорі підсумовуються всі потоки під їхнім батьківським процесом.
    • -bАргумент робить верхній прогін в пакетному режимі - інформація зібрана, відображається, а потім скидали на стандартний висновок , а не працює в інтерактивному режимі і поновлення відображаються дані.
    • За допомогою -bпараметра користувач повинен сказати зверху, скільки разів запустити, це робиться з -nаргументом і останнім аргументом, скільки разів запустити.

    Таким чином, top -H -b -n 1інструктує систему "запускати верх, відображати окремі потоки, запускати в пакетному режимі та виконувати лише один раз".

  2. psКоманда повідомляє знімок запущених процесів.

    ps -eLf
    

    -eLfАргумент (можна використовувати в якості -e -L -f, а) зривається наступним чином :

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

1

Розглянемо процес з PID p1

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

task_structОб'єкт нитки p1 матиме набір ПІД - регулятора , як, скажімо p3, але TGID набір для p1.


Отже, ви говорите те саме, що і Стівен Кітт , але набагато менш чітко. PS Навіщо турбуватися внесенням PPID в дискусію, якщо ви не збираєтесь говорити, що таке PPID потоку?
Скотт

PID і TGID завжди однакові.
Тім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.