Wielka tajemnica Windowsa 7 w końcu wyjaśniona. Inżynier Microsoftu zabrał głos
Użytkownicy Windowsa 7 przez kilka miesięcy po jego premierze doświadczali osobliwego zjawiska, które dopiero teraz, po latach, zostało w pełni wyjaśnione przez jednego z weteranów Microsoftu. Kto by pomyślał, że wybór prostego, jednolitego koloru jako tła pulpitu mógł spowolnić proces logowania o całe 30 sekund.

Windows 7, wydany w lipcu 2009 r. był jednym z najbardziej udanych systemów operacyjnych Microsoftu. Jednak wkrótce po premierze użytkownicy zaczęli zgłaszać dziwne opóźnienia podczas logowania. Dotykały one wyłącznie tych, którzy zamiast ozdobnej tapety z obrazkiem, wybrali jako tło pulpitu jednolity kolor. Ekran powitalny pozostawał widoczny przez 30 dodatkowych sekund, zanim system ostatecznie pokazał Pulpit.
Microsoft potwierdził istnienie tego błędu w listopadzie 2009 r. i wydał odpowiednią poprawkę. Jednak prawdziwe kulisy tej zagadki pozostawały nieznane szerszej publiczności aż do teraz, gdy Raymond Chen, wieloletni inżynier Microsoftu i autor popularnego bloga The Old New Thing, postanowił ujawnić techniczne szczegóły tego problemu.
Czytaj też:
Jak działał proces logowania w Windows 7?

Jak wyjaśnia Chen, po uwierzytelnieniu się użytkownika Windows rozpoczyna tworzenie pulpitu. Jest to złożony proces, podczas którego uruchamianych jest wiele komponentów jednocześnie:
- Tworzony jest pasek zadań;
- Ładowane i inicjalizowane są komponenty odpowiedzialne za usługi systemowe;
- Okno pulpitu jest tworzone i wypełniane ikonami;
- Tło pulpitu ładuje tapetę i wyświetla ją na ekranie.
System logowania czekał na sygnał od wszystkich tych komponentów, że są gotowe. Gdy wszystkie elementy zgłosiły gotowość - lub gdy upłynęło 30 sekund - system przełączał się z ekranu powitalnego na Pulpit.
Dlaczego brak tapety powodował opóźnienie?
Przyczyna problemu tkwiła w kodzie odpowiedzialnym za ładowanie tapety. Chen przedstawił przykładowy fragment kodu, który może wyglądać następująco:
InitializeWallpaper() {
if (wallpaper bitmap defined) {
LoadWallpaperBitmap();
}
}
LoadWallpaperBitmap() {
locate the bitmap on disk
load it into memory
paint it on screen
Report(WallpaperReady);
}
Jak widać funkcja raportująca gotowość tapety (`Report(WallpaperReady)`) znajdowała się wewnątrz funkcji ładującej bitmapę. Oznaczało to, że jeśli użytkownik nie miał zdefiniowanej tapety, ale używał jednolitego koloru, raport o gotowości nigdy nie był wysyłany. System czekał na wiadomość, która nigdy nie nadchodziła, aż w końcu po 30 sekundach przerywał oczekiwanie i pokazywał Pulpit.
Podobny problem z ukrytymi ikonami
Podobny problem występował, gdy włączona była zasada grupy Ukryj wszystkie ikony na pulpicie. Zasady grup (Group Policy) są szczególnie podatne na tego typu problemy, ponieważ często są dodawane do kodu już po jego napisaniu. Chen wyjaśnia to na przykładzie:
// Oryginalny kod
InitializeDesktopIcons() {
bind to the desktop folder
enumerate the icons
add them to the screen
Report(DesktopIconsReady);
}
// Kod zaktualizowany o obsługę zasad grup
InitializeDesktopIcons() {
if (desktop icons allowed by policy) {
bind to the desktop folder
enumerate the icons
add them to the screen
Report(DesktopIconsReady);
}
}
W zaktualizowanym kodzie instrukcja warunkowa objęła również wywołanie raportu o gotowości. Jeśli zasada grupy blokowała wyświetlanie ikon raport nigdy nie był wysyłany, co powodowało to samo 30-sekundowe opóźnienie.
Co to wszystko oznacza?
Ta historia doskonale ilustruje, jak skomplikowane mogą być interakcje między pozornie niezwiązanymi ze sobą elementami systemu operacyjnego. Drobna niedoskonałość w strukturze kodu może prowadzić do zaskakujących konsekwencji dla użytkownika końcowego.
Warto zauważyć, że opóźnienie to nie wydłużało faktycznego czasu uruchamiania systemu o 30 sekund. Jak wyjaśnia Chen: Ekran powitalny pozostawał widoczny przez pełne 30 sekund, zamiast przez rzeczywisty czas potrzebny wszystkim systemom do zgłoszenia gotowości (który mógł wynosić 5 sekund lub 25 sekund, w zależności od wydajności systemu).
Historia ta pokazuje również, jak ważne jest dogłębne testowanie wszystkich kombinacji ustawień, nawet tych pozornie najprostszych. W przypadku tak złożonego oprogramowania jak system operacyjny, każda zmiana może mieć nieoczekiwane skutki uboczne.