Zrozumienie trybu użytkownika i trybu jądra

Większość systemów operacyjnych ma jakąś metodę wyświetlania wykorzystania procesora. W systemie Windows jest to Menedżer zadań.

Menedżer zadań pokazujący wykorzystanie CPU i czas jądra

Zużycie CPU jest zwykle przedstawiane jako prosty procent czasu procesora spędzonego na zadaniach bezczynności. Jest to jednak pewne uproszczenie. W każdym nowoczesnym systemie operacyjnym, CPU w rzeczywistości spędza czas w dwóch bardzo różnych trybach:

  1. Tryb jądra

    W trybie jądra, wykonujący kod ma pełny i nieograniczony dostęp do sprzętu bazowego. Może wykonać dowolną instrukcję CPU i odwołać się do dowolnego adresu pamięci. Tryb jądra jest ogólnie zarezerwowany dla najniższego poziomu, najbardziej zaufanych funkcji systemu operacyjnego. Awarie w trybie jądra są katastrofalne; powodują zatrzymanie całego komputera.

  2. Tryb użytkownika

    W trybie użytkownika kod wykonawczy nie ma możliwości bezpośredniego dostępu do sprzętu ani odwoływania się do pamięci. Kod działający w trybie użytkownika musi delegować do systemowych API, aby uzyskać dostęp do sprzętu lub pamięci. Ze względu na ochronę zapewnianą przez ten rodzaj izolacji, awarie w trybie użytkownika są zawsze możliwe do odzyskania. Większość kodu uruchomionego na twoim komputerze będzie wykonywana w trybie użytkownika.

Możliwe jest włączenie wyświetlania czasu jądra w Menedżerze zadań, jak mam na powyższym zrzucie ekranu. Zielona linia to całkowity czas CPU; czerwona linia to czas jądra. Luka między nimi to czas użytkownika.

Te dwa tryby nie są zwykłymi etykietami; są one wymuszane przez sprzęt CPU. Jeśli kod wykonujący się w trybie użytkownika spróbuje zrobić coś poza swoim zasięgiem – na przykład uzyskać dostęp do uprzywilejowanej instrukcji procesora lub zmodyfikować pamięć, do której nie ma dostępu – zostanie rzucony wyjątek. Zamiast zawiesić cały system, zawodzi tylko ta konkretna aplikacja. Taka jest wartość trybu użytkownika.

Sprzęt procesora x86 zapewnia w rzeczywistości cztery pierścienie ochronne: 0, 1, 2 i 3. Zazwyczaj używane są tylko pierścienie 0 (Kernel) i 3 (User).

Model pierścienia CPU

Jeśli używamy tylko dwóch pierścieni izolacyjnych, jest trochę niejasne, gdzie powinny trafić sterowniki urządzeń – kod, który pozwala nam używać naszych kart graficznych, klawiatur, myszy, drukarek i tak dalej. Czy te sterowniki działają w trybie jądra, aby uzyskać maksymalną wydajność, czy też w trybie użytkownika, aby uzyskać maksymalną stabilność? Przynajmniej w systemie Windows odpowiedź brzmi: to zależy. Sterowniki urządzeń mogą działać w trybie użytkownika lub jądra. Większość sterowników jest obecnie przenoszona na stronę użytkownika, z godnym uwagi wyjątkiem sterowników kart graficznych, które wymagają pełnej wydajności trybu jądra. Ale nawet to się zmienia; w Windows Vista, sterowniki wideo są podzielone na sekcje Użytkownika i Jądra. Być może dlatego gracze skarżą się, że Vista działa około 10 procent wolniej w grach.

Dokładna granica między tymi trybami jest nadal nieco niejasna. Jaki kod powinien być uruchamiany w trybie użytkownika? Jaki kod powinien działać w trybie jądra? A może po prostu ponownie zdefiniujemy podłogę jako piwnicę – wzrost wirtualizacji doprowadził do stworzenia nowego pierścienia poniżej wszystkich innych, pierścienia -1, który teraz znamy jako wirtualizację sprzętu x86.

Tryb Użytkownika jest wyraźnie dobrem publicznym netto, ale wiąże się z kosztami. Przechodzenie między trybem użytkownika a trybem jądra jest kosztowne. Naprawdę drogie. To dlatego oprogramowanie, które rzuca wyjątki, jest powolne, na przykład. Wyjątki implikują przejścia w trybie jądra. Przyznaję, mamy teraz tak dużą wydajność, że rzadko musimy dbać o wydajność przejścia, ale kiedy potrzebujesz ostatecznej wydajności, zdecydowanie zaczynasz dbać o te rzeczy.

Prawdopodobnie najbardziej publiczny przykład przerysowania linii użytkownik / jądro jest w serwerach internetowych. IIS 6 Microsoftu przeniósł znaczną część swojej podstawowej funkcjonalności do trybu jądra, zwłaszcza po tym, jak konkretny serwer WWW z otwartym kodem źródłowym wykorzystał tryb jądra do stworzenia ogromnego zwycięstwa w benchmarku branżowym. To był rodzaj bezsensownej wojny, jeśli o mnie chodzi, ponieważ optymalizacje jądra (w obu obozach) mają zastosowanie tylko do statycznej zawartości HTML. Ale taka jest droga wszystkich wojen, benchmarkowych lub innych.

Ścisła segregacja kodu CPU między trybem użytkownika i jądra jest całkowicie przezroczysta dla większości z nas, ale jest to dosłownie różnica między komputerem, który ulega awarii przez cały czas, a komputerem, który ulega katastrofalnej awarii przez cały czas. To jest to, co my, programiści piszący kod, lubimy nazywać „postępem”. Więc w imieniu wszystkich programistów na całym świecie, chciałbym powiedzieć dzięki User mode. You rock!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.