Budowa Windows NT - fundamentów dla dzisiejszych "okienek"
Ostatnie zmiany w Windows 11 są często komentowane jako powierzchowne, a nowości z wersji 23H2 okazują się być tak skromne, że Microsoft wprowadza je wcześniej, innymi aktualizacjami. Wiele osób czeka na poważniejsze zmiany "pod maską", ale możliwe, że Windows wcale ich nie potrzebuje. Jest bowiem zbudowany na solidnych fundamentach.
Na temat architektury Windows często można usłyszeć bardzo dużo złych słów. Choć minęły już czasy, w których system ten jest oskarżany o bycie opartym o MS-DOS, pod jego adresem kierowane jest dużo krytyki, niekoniecznie uprawionej. Popularne są porównania do systemów linuksowych, implikujące nierzadko że skoro Linux (i UNIX) stosują przemyślany design, to w przypadku Windowsa coś takiego nie ma miejsca i system był "wymyślany" na bieżąco, bez jasnego planu. To nieprawda.
Choć klasyczny Windows był zbieraniną doraźnych potrzeb rynkowych, splecioną wieloma hackami, Windows NT (podstawa dla dzisiejszych Okienek) stanowił bardzo rygorystycznie zaprojektowane przedsięwzięcie, implementowane (zwłaszcza na początku) przez specjalistów najwyższej klasy.
Dalsza część artykułu pod materiałem wideo
Windows NT - co to jest?
Aby wytłumaczyć projekt NT poprawnie, konieczne jest odniesienie się do trzech ogólników: założeń, referencyjnej implementacji oraz podstawowych różnic między NT a Uniksem. Założenia NT nie precyzowały żadnych szczegółów implementacji, definiując jedynie główne cechy, jakie miał wykazywać ukończony produkt. Do cech tych należały: przenośność, skalowalność, wydajność, niezawodność i kompatybilność z aplikacjami Windows oraz… UNIX (!). Choć dziś każda z tych cech jest oczywista (jak można sprzedawać niewydajne i zawodne oprogramowanie…?), w momencie powstawania - czyli w 1988 roku - własności te były dodatkowo płatne i bardzo drogie.
Systemy były przenośne tylko między komputerami, ale nie architekturami, nie skalowały się na więcej niż jeden procesor, niekoniecznie dysponowały ochroną pamięci (byle co mogło je zawiesić), a wspólny model programowania był bardzo umowny. To, co NT miał wprowadzić na serwery i stacje robocze, dotychczas było kosztownym oprogramowaniem, specyficznym dla uniksowych systemów pracujących na komputerach o wiele "cięższych" niż biurkowe pecety.
Nowy, ale sprawdzony
Za tymi ogólnikami dalej idą już dokładniejsze kwestie. Implementacja NT mocno przypomina projekt systemu VMS (znacząco zmodernizowany). Nad NT i VMS pracowali ci sami ludzie - wynajęty przez Microsoft zespół pod przywództwem Dave'a Cutlera. System stosuje warstwę abstrakcji sprzętowej (HAL), mikrojądro i wewnętrzne, natywne API, w którym rozmawiają ze sobą niższe warstwy systemu. Warstwa użytkownika znajduje się nad nimi i oferuje usługi oraz podsystemy wykonawcze, z których najważniejszym (i najbardziej uprzywilejowanym) jest Win32. WSL (ani stary, ani nowy) nie jest takim podsystemem.
Mikrojądro oznacza, że w trybie kernela pracują rozłączne zbiory usług: HAL, pula sterowników, właściwe jądro (z planistą) oraz "silnik NT" czyli Centrum Wykonawcze, oferujące usługi nad jądrem. To tutaj zachodzi zarządzanie procesami (!), bezpieczeństwem i niestety również tutaj, ze względu na wydajność, znajduje się menedżer okien (GDI i DWM). Znajdziemy tu również mechanizmy logowania zdarzeń i interfejsy komunikacji międzyprocesowej. Przestrzeń użytkownika, ze swoim menedżerem usług i sesji, znajduje się poza Centrum Wykonawczym.
Oznacza to, że zarządzanie sesją i usługami nie odbywa się w jądrze, tylko w mechanizmie SCM i CRSS. W jądrze obecne są też wszystkie składniki definiujące bezpieczeństwo, ale jego obsługą także zajmuje się wydzielony składnik: LSASS. Widać zatem, że choć GDI przeniesiono w głąb, wiele istotnych elementów znajduje się w przestrzeni użytkownika, czyli "na powierzchni".
A jak jest z Linuksem?
Linux jest o wiele bardziej monolitycznym systemem. Również zawiera warstwę abstrakcji a dużo swoich usług oferuje poprzez oddzielne składniki i procesy - ale nie istnieje podział na mikrokernel i Centrum Wykonawcze. Z kolei środowisko graficzne jest całkowicie odseparowane: kompozytor Wayland i serwer X11 to aplikacje trybu użytkownika. To jednak nie jest podstawowa różnica między Linuksem a Windowsem. Linux nalega, by wszystko zawsze było strumieniem bajtów. Windows usiłuje każdą informację zamknąć w zarządzalny obiekt. Różnica ta musi być opisywana z ostrożnością. Wszak wszystko zawsze na jakimś poziomie jest "strumieniem bajtów", a struktury/obiekty nie są ciałem obcym w Linuksie: podręczniki programowania POSIX operują swobodnie na strukturach.
Różnica ta jest lepiej widoczna (i łatwiejsza do wytłumaczenia) warstwę wyżej, w przestrzeni użytkownika. Można tam od razu dostrzec mechanizmy podstawowe dla Windowsa, nieobecne w Linuksach i całkowicie niewidoczne dla użytkownika końcowego. Mowa o COM, RPC i Rejestrze. Ich obecność nie jest charakterystyczna stricte dla NT, ale niewątpliwie stanowią one cechę szczególną Windowsów. To raczej one, a nie samo NT, są źródłem (tej racjonalnej/uzasadnionej) krytyki Windows - ze względu zarówno na projekt, jak i długą historię problemów z bezpieczeństwem. Parę słów o nich - następnym razem.
Kamil J. Dudek, współpracownik redakcji dobreprogramy.pl