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:
wątek stworzony do pracy z podstawowym systemem operacyjnym i
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?
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.
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) .
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.
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.
Wątki to procesy w systemie Linux. Są one tworzone za pomocą
clone
wywołania systemowego, które zwraca identyfikator procesu, który może zostać wysłany za pośrednictwemkill
wywołania systemowego, podobnie jak proces. Procesy wątku są widoczne wps
danych wyjściowych.clone
Połączenie jest przekazywane flagi, które określają, ile środowiska procesu nadrzędnego jest dzielona z procesem nici.źródło
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.