Przełącznik kontekstu wątku Vs. przełącznik kontekstu procesu

Odpowiedzi:

204

Główna różnica między przełącznikiem wątku a przełącznikiem procesu polega na tym, że podczas przełączania wątku przestrzeń pamięci wirtualnej pozostaje taka sama, podczas gdy nie podczas przełączania procesu. Oba typy obejmują przekazanie kontroli jądru systemu operacyjnego w celu przełączenia kontekstu. Proces włączania i wyłączania jądra systemu operacyjnego wraz z kosztem przełączania rejestrów to największy stały koszt wykonania przełączenia kontekstu.

Bardziej rozmyty koszt polega na tym, że przełącznik kontekstu miesza z mechanizmami buforowania procesorów. Zasadniczo po przełączeniu kontekstu wszystkie adresy pamięci, które procesor „pamięta” w swojej pamięci podręcznej, stają się bezużyteczne. Jedyną dużą różnicą jest to, że po zmianie przestrzeni pamięci wirtualnej bufor translacji (TLB) procesora lub odpowiednik zostaje opróżniony, co powoduje, że dostęp do pamięci przez pewien czas jest znacznie droższy. Nie dzieje się tak podczas przełączania wątku.

Abhay Buch
źródło
8
Wszystko to przy założeniu, że TLB i pamięć podręczna nie przechowują pid dla każdego wpisu.
dramatyczny
2
IMHO @dramzy ma rację, system operacyjny może obsługiwać szybkie przełączanie kontekstu, o którym krótko wspomniano tutaj: youtu.be/3akTtCu_F_k?t=46m8s (patrz od początku, aby dowiedzieć się więcej o pamięci wirtualnej, tablicach stron i TLB).
piotrwest
@piotrwest Czy którykolwiek z głównych systemów operacyjnych obsługuje szybkie przełączanie kontekstu?
maksymalnie
2
@dramzy Czy chodziło Ci o to, że system operacyjny lub sprzęt mogą przechowywać pid? Czy to ma znaczenie?
maksymalnie
Mam na myśli tylko przełączanie wątków (nie na pewno) w Linuksie, więc system operacyjny Linux sprawdzi, czy następny wątek do uruchomienia ma pid zapisu z działającym wątkiem, który będzie zaplanowany?
roachsinai
16

Przełączanie kontekstu procesu obejmuje przełączanie przestrzeni adresowej pamięci. Obejmuje to adresy pamięci, mapowania, tablice stron i zasoby jądra - stosunkowo kosztowna operacja. Na niektórych architekturach oznacza to nawet opróżnianie różnych pamięci podręcznych procesorów, których nie można współużytkować w przestrzeniach adresowych. Na przykład x86 musi opróżnić TLB, a niektóre procesory ARM muszą opróżnić całą pamięć podręczną L1!

Przełączanie wątków to przełączanie kontekstu z jednego wątku na inny w tym samym procesie (przełączanie z wątku na wątek między procesami to po prostu przełączanie procesów). Przełączanie stanu procesora (takiego jak licznik programu i zawartość rejestru) jest ogólnie bardzo wydajne.

aditya dogra
źródło
13

Przede wszystkim system operacyjny przenosi wątek wychodzący w tryb jądra, jeśli jeszcze go tam nie ma, ponieważ przełączanie wątków może być wykonywane tylko między wątkami, które działają w trybie jądra. Następnie wywoływany jest program planujący w celu podjęcia decyzji o wątku, do którego zostanie wykonane przełączenie. Po podjęciu decyzji jądro zapisuje część kontekstu wątku, który znajduje się w CPU (rejestry procesora) w dedykowanym miejscu w pamięci (często na szczycie stosu jądra wychodzącego wątku). Następnie jądro dokonuje przełączenia ze stosu jądra wątku wychodzącego na stos jądra wątku przychodzącego. Następnie jądro ładuje wcześniej zapisany kontekst przychodzącego wątku z pamięci do rejestrów procesora. I w końcu przywraca sterowanie z powrotem do trybu użytkownika, ale w trybie użytkownika nowego wątku. W przypadku, gdy system operacyjny określił, że przychodzący wątek działa winny proces, jądro wykonuje jeden dodatkowy krok: ustawia nową aktywną wirtualną przestrzeń adresową.

Główny koszt w obu scenariuszach jest związany z zanieczyszczeniem pamięci podręcznej. W większości przypadków zestaw roboczy używany przez wątek wychodzący będzie się znacznie różnić od zestawu roboczego używanego przez wątek przychodzący. W rezultacie nadchodzący wątek rozpocznie swoje życie lawiną chybień w pamięci podręcznej, usuwając w ten sposób stare i bezużyteczne dane z pamięci podręcznej i ładując nowe dane z pamięci. To samo dotyczy TLB (Translation Look Aside Buffer, który znajduje się na CPU). W przypadku resetowania wirtualnej przestrzeni adresowej (wątki działają w różnych procesach) kara jest jeszcze gorsza, bo reset wirtualnej przestrzeni adresowej prowadzi do opróżnienia całej TLB, nawetjeśli nowy wątek faktycznie musi załadować tylko kilka nowych wpisów. W rezultacie nowy wątek rozpocznie swój kwant czasu z wieloma brakami TLB i częstym chodzeniem po stronach. Bezpośredni koszt przełączania wątków również nie jest bez znaczenia (od ~ 250 do ~ 1500-2000 cykli) i zależy od złożoności procesora, stanów obu wątków i zestawów rejestrów, których faktycznie używają.

PS: Dobry post na temat zmiany kontekstu: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html

ZarathustrA
źródło
3
  • przełączanie procesów: jest to przejście między dwoma rezydentami pamięci procesu w środowisku wieloprogramowym;
  • przełączanie kontekstu: jest to zmiana kontekstu z wykonywanego programu na procedurę obsługi przerwań (ISR).
Jan
źródło
2

W przypadku przełączania kontekstu wątków przestrzeń pamięci wirtualnej pozostaje taka sama, podczas gdy nie jest w przypadku przełączania kontekstu procesu. Ponadto przełącznik kontekstu procesu jest droższy niż przełącznik kontekstu wątku.

Palak Jain
źródło
0

Myślę, że główna różnica dotyczy wywołania, switch_mm()które obsługuje deskryptory pamięci starego i nowego zadania. W przypadku wątków przestrzeń adresowa pamięci wirtualnej pozostaje niezmieniona (wątki współdzielą pamięć wirtualną), więc niewiele trzeba zrobić, a zatem jest mniej kosztowna.

Dražen G.
źródło
0

Chociaż przełączanie kontekstu wątków musi zmienić kontekst wykonania (rejestry, wskaźniki stosu, liczniki programów), nie muszą one zmieniać przestrzeni adresowej, tak jak robią to przełączniki kontekstu procesów. Zmiana przestrzeni adresowej, większy dostęp do pamięci (stronicowanie, segmentacja itp.) Wiąże się z dodatkowymi kosztami i musisz opróżnić TLB podczas wchodzenia lub wychodzenia z nowego procesu ...

Herr Günther
źródło
-1

Krótko mówiąc, przełącznik kontekstu wątku nie przypisuje zupełnie nowego zestawu pamięci i pid, używa tego samego co rodzic, ponieważ działa w ramach tego samego procesu. Jeden proces tworzy nowy proces, a tym samym przypisuje nowe pamięci i pid.

Jest w tym dużo więcej. Napisali o tym książki.

Jeśli chodzi o koszt, przełącznik kontekstu procesu >>>> wątek, ponieważ musisz zresetować wszystkie liczniki stosu itp.

CtrlDot
źródło
-1

Zakładając, że procesor, na którym działa system operacyjny, ma podłączone urządzenia o dużym opóźnieniu,

Sensowne jest uruchomienie kolejnego wątku przestrzeni adresowej procesu, podczas gdy urządzenie o dużym opóźnieniu odpowiada.

Ale jeśli urządzenie o wysokim opóźnieniu reaguje szybciej niż czas potrzebny na ustawienie tabeli + tłumaczenie pamięci wirtualnych na fizyczne dla NOWEGO procesu, wątpliwe jest, czy przełącznik jest w ogóle niezbędny.

Lepszym wyborem jest również pamięć podręczna HOT (dane potrzebne do uruchomienia procesu / wątku są osiągalne w krótszym czasie).

Usuń mnie
źródło