Odpowiedzi:
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.
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.
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
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.
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.
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 ...
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.
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).