Czy wątki jądra Linuksa są tak naprawdę procesami jądra?


19

Czytałem w wielu miejscach, że Linux tworzy wątek jądra dla każdego wątku użytkownika w maszynie wirtualnej Java. (Widzę termin „wątek jądra” używany na dwa różne sposoby:

  1. wątek stworzony do pracy z podstawowym systemem operacyjnym i
  2. wątek, o którym wie system operacyjny i planuje wykonanie pracy użytkownika.

Mówię o tym drugim typie.)

Czy wątek jądra jest taki sam jak proces jądra, ponieważ procesy Linux obsługują współużytkowane przestrzenie pamięci między rodzicem a dzieckiem, czy też jest to naprawdę inna jednostka?

Odpowiedzi:


23

W Linuksie nie ma absolutnie żadnej różnicy między wątkiem a procesem. Jeśli spojrzysz na klon (2) , zobaczysz zestaw flag, które określają, co jest udostępniane, a co nie, między wątkami.

Klasyczne procesy to tylko wątki, które niczego nie dzielą; możesz udostępniać wybrane komponenty w systemie Linux.

Nie dotyczy to innych implementacji systemu operacyjnego, w których występują znacznie większe różnice.


22

Dokumentacja może być dość myląca, więc oto „ prawdziwy ” model Linuksa:

  • w jądrze Linuksa coś, co można uruchomić (i zaplanować), nazywa się „procesem”,
  • każdy proces ma unikalny w systemie identyfikator procesu (PID) i identyfikator grupy wątków (TGID),
  • „normalny” proces ma PID = TGID i żaden inny proces nie ma tej wartości TGID,
  • proces „wątkowy” to proces, którego wartość TGID jest współdzielona przez inne procesy,
  • kilka procesów współużytkujących ten sam TGID również współdzieli co najmniej tę samą przestrzeń pamięci i procedury obsługi sygnałów (czasami więcej),
  • jeśli proces „wątkowy” ma PID = TGID, można go nazwać „głównym wątkiem”,
  • wywołanie getpid()z dowolnego procesu zwróci jego TGID (= „główny wątek” PID),
  • wywołanie gettid()z dowolnego procesu zwróci jego PID (!),
  • za pomocą clone(2)wywołania systemowego można utworzyć dowolny proces ,
  • nazwy numeryczne folderów, z którymi można wymienić, ls /procpodobnie jak /proc/NUMBERTGID,
  • nazwy numeryczne folderów, /proc/TGID/taskpodobnie jak /proc/TGID/task/NUMBERPID,
  • nawet jeśli nie widzisz wszystkich istniejących identyfikatorów PID ls /proc, nadal możesz to zrobić cd /proc/any_PID.

Wniosek : z punktu widzenia jądra istnieją tylko procesy, z których każdy ma swój własny unikalny PID, a tak zwany wątek to po prostu inny rodzaj procesu.

Uwaga: implementacja koncepcji „wątku” w Linuksie doprowadziła do pomieszania słownictwa, a jeśli getpid() kłamie, nie robi tego, co myślisz, dzieje się tak, ponieważ jej zachowanie jest zgodne z POSIX (wątki powinny mieć wspólny PID) .


1
Sugestia: użycie słowa „zadanie” może pomóc odnieść się do czegoś, co można uruchomić, bez zbytniego zamieszania w proces / wątek.
Totor

17

Wątki to procesy w systemie Linux. Są one tworzone za pomocą clonewywołania systemowego, które zwraca identyfikator procesu, który może zostać wysłany za pośrednictwem killwywołania systemowego, podobnie jak proces. Procesy wątku są widoczne w psdanych wyjściowych. clonePołączenie jest przekazywane flagi, które określają, ile środowiska procesu nadrzędnego jest dzielona z procesem nici.


1
Mężczyzna pthreads(7)mówi, że w bieżącej implementacji NPTL (natywna biblioteka wątków POSIX) „wszystkie wątki w procesie są umieszczane w tej samej grupie wątków; wszyscy członkowie grupy wątków mają ten sam PID”. W przestarzałej implementacji LinuxThreads każdy „wątek” ma swój własny PID.
Totor
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.