18Aug

Dlaczego nie ma niepoprawnych numerów identyfikacyjnych systemu Windows?

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 SuperUser Q & A ma odpowiedzi na ciekawe pytania czytelnika.

Dzisiejsze pytanie &Sesja odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser - poddziału Stack Exchange, opartego na społecznościach grupy Q & A.

Pytanie Czytnik

SuperUser Peter Hahndorf chce wiedzieć, dlaczego nie ma identyfikatorów procesów Windows o nieparzystych numerach:

Istnieje wiele sposobów sprawdzania identyfikatorów procesów w systemie Windows. Używanie PowerShell:

Otrzymuję ten wynik:

Jak widać, wszystkie identyfikatory procesów są parzyste, nie tylko to, 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 identyfikatorów procesów systemu Windows?

Odpowiedź Autor

SuperUser DavidPostill ma dla nas odpowiedź:

Dlaczego nie ma niepoprawnych identyfikatorów procesów systemu Windows?

Ten sam kod, który przydziela uchwyt jądra, służy również do przydzielania identyfikatorów procesów i wątków. Ponieważ uchwyty jądra są wielokrotnością czterech, tak samo są identyfikatory procesów i wątków.

Dlaczego liczba identyfikatorów procesów i wątków wynosi cztery?

W systemach operacyjnych opartych na systemie 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 on 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ściami czterech?

Dlaczego kernel 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 przynajmniej dolny bit uchwytów jądra ma zawsze wartość zero, jest implikowane przez funkcję GetQueuedCompletionStatus, która wskazuje, że możesz 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 kernel obsługuje zawsze wielokrotność czterech?

Czytaj dalej

Stara nowa rzecz: praktyczny rozwój w całej ewolucji Windows Raymonda Chena( , główny inżynier projektowania oprogramowania w 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.