18Aug
Als je graag sleutelt aan Windows en leert terwijl je bezig bent, is het je misschien al opgevallen dat Windows-proces- en thread-ID's even zijn genummerd en veelvouden van vier. Waarom is dat? Today's SuperUser Q & A post heeft de antwoorden op vragen van nieuwsgierige lezers.
De vraag van vandaag &Antwoord sessie komt naar ons met dank aan SuperUser-een onderverdeling van Stack Exchange, een community-gestuurde groepering van Q & A-websites.
De vraag
SuperUser-lezer Peter Hahndorf wil weten waarom er geen oneven genummerde Windows-proces-ID's zijn:
Er zijn veel manieren om naar de proces-ID's in Windows te kijken. Met PowerShell:
krijg ik dit resultaat:
Zoals je kunt zien, zijn alle proces-ID's even genummerd, en niet alleen dat, ze zijn allemaal veelvouden van vier. U kunt er zo uitzien als u wilt en u zult nooit een oneven nummer van het proces-ID vinden, althans niet op een versie die op Windows NT is gebaseerd. Wat is de reden hiervoor?
Waarom zijn er geen oneven nummers van Windows-proces-ID's?
Het antwoord
SuperUser-bijdrager DavidPostill heeft het antwoord voor ons:
Waarom zijn er geen oneven genummerde Windows-proces-id's?
Dezelfde code die kernelhandles toewijst, wordt ook gebruikt om proces- en thread-ID's toe te wijzen. Omdat kernel-handles een veelvoud van vier zijn, zijn ook proces- en thread-ID's.
Waarom zijn proces- en thread-ID's veelvouden van vier?
Op Windows NT-gebaseerde besturingssystemen zijn proces- en thread-ID's altijd een veelvoud van vier. Is dit gewoon toeval?
Ja, het is toeval en u moet er niet op vertrouwen, omdat het geen deel uitmaakt van het programmacontract. Windows 95-proces- en thread-ID's waren bijvoorbeeld niet altijd een veelvoud van vier. Ter vergelijking: de reden waarom de kernel handelt, is altijd een veelvoud van vier, maakt deel uit van de specificatie en zal in de nabije toekomst worden gegarandeerd.
Proces- en thread-ID's zijn veelvouden van vier als een neveneffect van hergebruik van code. Dezelfde code die kernelhandles toewijst, wordt ook gebruikt om proces- en thread-ID's toe te wijzen. Omdat de kernel-handgrepen veelvouden van vier zijn, zijn ook proces- en draad-ID's. Dit is een implementatiedetail, dus schrijf geen code die erop vertrouwt. Ik zeg je gewoon om je nieuwsgierigheid te bevredigen.
Bron: Waarom zijn proces- en thread-ID's veelvouden van vier?
Waarom zijn kernel altijd een veelvoud van vier?
Iets dat niet zo bekend is, is dat de onderste twee bits van kernelhandgrepen altijd nul zijn;met andere woorden, hun numerieke waarde is altijd een veelvoud van vier. Merk op dat dit alleen van toepassing is op kernel-handles;het is niet van toepassing op pseudo-handles of op een ander type handvat( USER-handles, GDI-handles, multimedia-handles, enz.).Kernel-handgrepen zijn dingen die u kunt doorgeven aan de functie CloseHandle.
Dat ten minste het onderste deel van de kernelhandgrepen altijd nul is, wordt geïmpliceerd door de GetQueuedCompletionStatus-functie, die aangeeft dat u het onderste bit van de gebeurtenishandvat kunt instellen om de voltooiingspoormelding te onderdrukken. Om dit te laten werken, moet de onderste bit normaal nul zijn.
Deze informatie is niet nuttig voor de meeste schrijvers van toepassingen, die handvatten moeten blijven behandelen als ondoorzichtige waarden. De mensen die geïnteresseerd zouden zijn in tag-bits zijn degenen die klassenbibliotheken van een laag niveau implementeren of kernel-objecten in een groter kader omwikkelen.
Bron: Waarom zijn kernel altijd een veelvoud van vier?
Verder lezen
Het oude nieuwe ding: praktische ontwikkeling in de evolutie van Windows door Raymond Chen( Principal Software Design Engineer bij Microsoft )
Heb je nog iets toe te voegen aan de uitleg? Geluid uit in de reacties. Wilt u meer antwoorden van andere technisch onderlegde Stack Exchange-gebruikers lezen? Bekijk de volledige discussiethread hier.