W jaki sposób Linux odróżnia wątki od procesów potomnych?

Odpowiedzi:

28

Z task_structpunktu widzenia, nici jest procesem mają taką samą moderatora gwintu ( group_leaderwtask_struct ), podczas gdy procesy dziecko ma inną moderatora gwint (każdy indywidualny proces dziecka).

Ta informacja jest narażony na przestrzeni użytkownika poprzez w /procsystemie plików. Możesz prześledzić rodziców i dzieci, patrząc na ppidpole w /proc/${pid}/statlub .../status(daje to rodzicowi pid); możesz śledzić wątki, patrząc na tgidpole w .../status(daje to identyfikator grupy wątków, który jest również pid lidera grupy). Wątki procesu są widoczne w /proc/${pid}/taskkatalogu: każdy wątek otrzymuje własny podkatalog. (Każdy proces ma co najmniej jeden wątek.)

W praktyce programy chcące śledzić własne wątki polegałyby na interfejsach API udostępnianych przez używaną bibliotekę wątków zamiast na informacjach specyficznych dla systemu operacyjnego. Zwykle w systemach uniksowych, co oznacza używanie pthreads.

Stephen Kitt
źródło
Każdy proces w potoku powłoki (echo foo | cat) ma tego samego lidera grupy (powłokę), ale nie są wątkami w tym samym procesie.
psusi
2
Mówisz o grupach procesów; w mojej odpowiedzi lider grupy jest z perspektywy jądra. W rachunkowości jądra oddzielne procesy są liderami własnej grupy. Możesz to zobaczyć, uruchamiając (sleep 120 | sleep 120) &i sprawdzając Tgidwartości w pliku każdego sleepprocesu /proc/${pid}/status.
Stephen Kitt
O dziwne. Nie wiedziałem, że istnieje coś takiego jak „lider grupy wątków” i pomyślałem, że podobno wszystkie wątki w procesie wielowątkowym są równe i nie ma „lidera”. Każdy z nich może wyjść i dopóki nie zostanie, proces nie jest martwy.
psusi
5
  1. Uruchamia to toppolecenie z kilkoma dodatkowymi opcjami:

    top -H -b -n 1
    
    • W -Hprzesyła zlecenie argumentów góry do wyświetlenia każdego pojedynczego gwintu. Zwykle top podsumowuje wszystkie wątki w procesie nadrzędnym.
    • -bArgument ma górny bieg w trybie wsadowym - informacje gromadzone są wyświetlane, a następnie przeniesiono do stdout w przeciwieństwie do pracy w trybie interaktywnym i orzeźwiający dane wyświetlane.
    • Po wybraniu tej -bopcji użytkownik musi podać na górze, ile razy uruchomić, odbywa się to z -nargumentem, a ostatni argument z iloma uruchomieniami.

    Dlatego top -H -b -n 1instruuje system, aby „uruchomił się na górze, wyświetlił poszczególne wątki, uruchomił w trybie wsadowym i uruchomił tylko raz”.

  2. psKomenda informuje migawkę aktualnie uruchomionych procesów.

    ps -eLf
    

    -eLfArgument (może być używany jako -e -L -frównież) rozkłada się w następujący sposób:

    • ekaże pswyświetlać wszystkie procesy bez względu na to, kto jest ich właścicielem lub ich aktualny status - aktywny, spanie, wstrzymany, oczekiwanie na We / Wy itp.
    • Lmówi, psaby pokazać poszczególne wątki
    • fmówi psdo formatowania wyjścia jako wpis w pełnym formacie, aw połączeniu z Largumentacji NLWP (liczba wątków) i LWP (ID wątku) kolumny są dodawane do wyjścia.
ivanivan
źródło
1

Rozważ proces z PID p1

task_structPrzedmiotem procesu dziecko będzie miało PPID (rodzic PID) jako P1, a to PID i TGID zestaw do, powiedzmy, P2.

task_structPrzedmiotem wątku P1 będzie miał zestaw PID jak, powiedzmy P3, ale zestaw TGID do P1.

NOLFXceptMe
źródło
Mówisz to samo co Stephen Kitt , ale o wiele mniej wyraźnie. PS Po co zawracać sobie głowę wprowadzeniem PPID do dyskusji, jeśli nie chcesz powiedzieć, jaki jest PPID wątku?
Scott
PID i TGID są zawsze takie same.
Tim