Jeśli uwielbiasz majsterkowanie w systemie Windows i uczenie się z dowolnego miejsca, możesz zauważyć, że proces systemu Windows i identyfikatory wątków są parzyste i mają wielokrotność czterech. Dlaczego? Dzisiejszy post z pytaniami i odpowiedziami dla SuperUser zawiera odpowiedzi na ciekawe pytania czytelnika.
Dzisiejsza sesja pytań i odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser - poddziału Stack Exchange, społecznościowego forum z pytaniami i odpowiedziami.
Czytnik SuperUser Peter Hahndorf chce wiedzieć, dlaczego nie ma niepoprawnych identyfikatorów procesów Windows:
Istnieje wiele sposobów sprawdzania identyfikatorów procesów w systemie Windows. Korzystanie z PowerShell:
Otrzymuję ten wynik:
Jak widać, wszystkie identyfikatory procesów są parzyste, a nie tylko, wszystkie są wielokrotnościami czterech. Możesz wyglądać tak ciężko, jak chcesz i nigdy nie znajdziesz identyfikatora procesu o numerach nieparzystych, przynajmniej nie w żadnej wersji opartej na systemie Windows NT. Jaki jest tego powód?
Dlaczego nie ma niepoprawnych numerów identyfikacyjnych procesów systemu Windows?
Współpracownik SuperUser DavidPostill ma dla nas odpowiedź:
Dlaczego nie ma niepoprawnych numerów identyfikacyjnych procesów systemu Windows?
Ten sam kod, który przydziela uchwyty jądra, służy również do przydzielania identyfikatorów procesów i wątków. Ponieważ obsady jądra są wielokrotnością czterech, tak samo są identyfikatory procesów i wątków.
Dlaczego identyfikatory procesów i wątków są wielokrotnością czterech?
W systemach operacyjnych Windows NT identyfikatory procesów i wątków zawsze są wielokrotnością czterech. Czy to tylko zbieg okoliczności?
Tak, to tylko zbieg okoliczności i nie powinieneś na nim polegać, ponieważ nie jest to częścią umowy programistycznej. Na przykład identyfikatory procesów i wątków systemu Windows 95 nie zawsze były wielokrotnościami czterech. Dla porównania, powód, dla którego jądro obsługuje zawsze wielokrotność czterech, jest częścią specyfikacji i będzie zagwarantowany w przewidywalnej przyszłości.
Identyfikatory procesów i wątków to wielokrotności czterech jako efekt uboczny ponownego użycia kodu. Ten sam kod, który przydziela uchwyty jądra, służy również do przydzielania identyfikatorów procesów i wątków. Ponieważ obsady jądra są wielokrotnościami czterech, są to także identyfikatory procesów i wątków. To jest szczegół implementacji, więc nie pisz kodu, który na nim polega. Po prostu mówię ci, żebyś zaspokoił swoją ciekawość.
Źródło: Dlaczego identyfikatory procesów i wątków są wielokrotnością czterech?
Dlaczego jądro obsługuje zawsze wielokrotność czterech?
Coś, co nie jest dobrze znane, to to, że dwa dolne bity uchwytów jądra są zawsze zerowe; innymi słowy, ich wartość liczbowa jest zawsze wielokrotnością czterech. Zauważ, że odnosi się to tylko do uchwytów jądra; nie ma zastosowania do pseudo-uchwytów ani do żadnego innego typu uchwytu (obsługa USER, uchwyty GDI, uchwyty multimedialne itp.). Uchwyty jądra to rzeczy, które można przekazać do funkcji CloseHandle.
To, że co najmniej dolny bit uchwytów jądra ma zawsze wartość zero, jest implikowane przez funkcję GetQueuedCompletionStatus, która wskazuje, że można ustawić dolny bit uchwytu zdarzenia, aby wyłączyć powiadamianie o porcie zakończenia. Aby to zadziałało, dolny bit musi normalnie wynosić zero.
Ta informacja nie jest przydatna dla większości programów piszących, które powinny traktować uchwyty jako wartości nieprzezroczyste. Ludzie, którzy byliby zainteresowani bitami znaczników, to ci, którzy implementują biblioteki klas niskiego poziomu lub owijają obiekty jądra w większe ramy.
Źródło: Dlaczego jądro obsługuje zawsze wielokrotność czterech?
Dalsze czytanie
The Old New Thing: Praktyczny rozwój w całym systemie Windows Raymonda Chena (Główny inżynier ds. Projektowania oprogramowania w firmie Microsoft)
Czy masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych użytkowników Stack Exchange, którzy znają się na technologii? Sprawdź cały wątek dyskusji tutaj.