NICI: Wątki jądra a wątki obsługiwane przez jądro vs. wątki na poziomie użytkownika?

9

Czy ktoś wie, jaka jest między nimi różnica?

Wydaje mi się, że wątki jądra odpowiadają kodowi, który uruchamia jądro (intuicyjnie), ale nie jestem pewien co do dwóch pozostałych ...

Ponadto, czy standard pthreads będzie uważany za poziom użytkownika i obsługiwany przez jądro, skoro uzyskujesz dostęp do biblioteki, podczas gdy jądro wykonuje wszystkie planowanie / przełączanie wątków?

Mroczny Templariusz
źródło

Odpowiedzi:

14

Termin „wątki jądra” może być użyty w odniesieniu do rzeczywistych wątków, które działają całkowicie w przestrzeni jądra lub może odnosić się do wątków przestrzeni użytkownika zaplanowanych przez jądro. Termin „obsługiwane przez jądro” wątki oznacza te ostatnie, które działają w przestrzeni użytkownika, ale są obsługiwane przez jądro, co zwykle oznacza, że ​​jądro je planuje.

„Wątki na poziomie użytkownika” zwykle oznaczają wątki widoczne w przestrzeni użytkownika. Oznacza to, co tworzysz, gdy wywołujesz funkcję tworzenia wątku w standardzie wątków. Ogólnie termin „wątek na poziomie użytkownika” oznacza wątek utworzony przez kod aplikacji, niezależnie od tego, jak jest on implementowany przez system. Może to być czysty wątek przestrzeni użytkownika z niewielkim wsparciem dla jądra lub go wcale lub może być wątkiem zaplanowanym przez jądro.

Standard pthreads może być zaimplementowany jako wątki w przestrzeni użytkownika (gdzie jądro planuje proces, a proces planuje wątki), wątki obsługiwane przez jądro (gdzie jądro planuje wątki bezpośrednio) lub podejście hybrydowe (gdzie jądro planuje wątek na poziomie jądra, który następnie w przestrzeni użytkownika planuje wątek na poziomie użytkownika). Standard nie wymaga żadnego konkretnego sposobu implementacji. Najczęstszą implementacją jest mapowanie 1 do 1, w którym każdy wątek na poziomie użytkownika ma odpowiadający mu wątek, który jest planowany przez jądro.

David Schwartz
źródło
jaka jest implementacja w systemie Linux?
yati sagade
3
We wszystkich współczesnych systemach Linux (jądro 2.6 lub nowsze), o których wiem, domyślna implementacja wątkowania w systemie to 1 do 1, każdy wątek na poziomie użytkownika ma odpowiedni KSE (jednostka planowania jądra - w zasadzie wątek zaplanowany przez Jądro Linux). Wątek utworzony za pomocą „pthread_create” zostanie zaplanowany bezpośrednio przez jądro. Nowoczesne systemy zazwyczaj używają NPTL , starsze systemy używały LinuxThreads - oba są od 1 do 1.
David Schwartz,
„lub podejście hybrydowe (gdzie jądro planuje wątek na poziomie jądra, który następnie w przestrzeni użytkownika planuje wątek na poziomie użytkownika).” Hej David, mógłbyś to jeszcze raz wyjaśnić? Nie jestem pewien, co się dzieje ... Kiedy mówisz, że mapowanie 1 na 1 odnosi się do bloków kontroli wątków, wspominając teady na poziomie jądra?
Dark Templar
Przez 1-do-1 rozumiem, że za każdym razem, gdy wywołujesz „pthread_create”, tworzony jest nowy kontekst, który jest zaplanowany przez jądro. W podejściu hybrydowym liczba kontekstów zaplanowanych przez jądro jest mniejsza niż liczba utworzonych wątków - jądro planuje jeden z tych kontekstów, a następnie biblioteka wątków planuje jeden z wątków utworzonych przez aplikację.
David Schwartz,