Hvorfor er det ingen merkelige Windows-prosess-IDer?
Hvis du elsker å tinkere med Windows og lære når du går, har du kanskje lagt merke til at Windows-prosess- og tråd-ID-er er like-nummererte og flere ganger med fire. Hvorfor det? Dagens SuperUser Q & A innlegg har svar på en nysgjerrig leser spørsmål.
Dagens Spørsmål & Svar-sesjon kommer til oss med høflighet av SuperUser-en underavdeling av Stack Exchange, en fellesskapsdrevet gruppering av Q & A-nettsteder.
Spørsmålet
SuperUser leser Peter Hahndorf vil vite hvorfor det ikke finnes noen merkelige nummererte Windows-prosess-IDer:
Det er mange måter å se på prosess-IDene i Windows. Bruke PowerShell:
Jeg får dette resultatet:
Som du kan se, er alle prosess-IDene jevnt nummererte, ikke bare det, de er alle multipliser på fire. Du kan se så hardt du vil, og du vil aldri finne en merkelig prosess-ID, i hvert fall ikke på noen versjon som er Windows NT-basert. Hva er årsaken til dette?
Hvorfor er det ikke merkelig nummererte Windows-prosess-IDer?
Svaret
SuperUser-bidragsyter DavidPostill har svaret for oss:
Hvorfor er det ikke merkelig nummererte Windows-prosess-IDer?
Den samme koden som tildeler kjernehåndtak brukes også til å tildele prosess- og tråd-IDer. Siden kjernehåndtakene er et flertall på fire, er det også prosess- og tråd-IDer.
Hvorfor er prosess- og tråd-IDer flere ganger fire?
På Windows NT-baserte operativsystemer, skjer prosess- og tråd-IDer alltid som et flertall av fire. Er dette bare en tilfeldighet?
Ja, det er bare en tilfeldighet, og du bør ikke stole på det, siden det ikke er en del av programmeringskontrakten. For eksempel var Windows 95-prosess- og tråd-IDer ikke alltid flere ganger fire. Til sammenligning er årsaken til at kjernen håndterer alltid flere enn fire, en del av spesifikasjonen og vil bli garantert i overskuelig fremtid.
Prosess- og tråd-ID er multipliser med fire som en bivirkning av kodegenbruk. Den samme koden som tildeler kjernehåndtak brukes også til å tildele prosess- og tråd-IDer. Siden kjernehåndtakene er flere ganger fire, er det også prosess- og tråd-IDer. Dette er en implementeringsdetaljer, så skriv ikke kode som er avhengig av den. Jeg forteller deg bare å tilfredsstille din nysgjerrighet.
Kilde: Hvorfor er prosess- og tråd-IDer flere ganger fire?
Hvorfor er kjernehåndtak alltid et flertall på fire?
Noe som ikke er veldig kjent er at bunnen av to biter av kjernehåndtak alltid er null; med andre ord, deres numeriske verdi er alltid et flertall på fire. Vær oppmerksom på at dette bare gjelder for kjernelhåndtak; Det gjelder ikke for pseudohåndtak eller andre typer håndtak (USER-håndtak, GDI-håndtak, multimediehåndtak, etc.). Kjernelhåndtak er ting du kan overføre til handleknappen.
At minst bunnen av kjernehåndtakene alltid er null, er underforstått av GetQueuedCompletionStatus-funksjonen, som indikerer at du kan angi nederste bit av hendelseshåndtaket for å undertrykke fullførelsesportvarsling. For at dette skal fungere, må bunnbiten normalt være null.
Denne informasjonen er ikke nyttig for de fleste programforfattere, som bør fortsette å behandle håndtak som ugjennomtrengelige verdier. Folkene som ville være interessert i tagbiter, er de som implementerer klassebibliotek på lavt nivå eller pakker inn kjerneobjekter i et større rammeverk.
Kilde: Hvorfor er kjernehåndtak alltid et flertall på fire?
Videre lesning
The Old New Thing: Praktisk utvikling gjennom utviklingen av Windows av Raymond Chen (Hoveddesigner av programvaredesigner ved Microsoft)
Har du noe å legge til forklaringen? Lyder av i kommentarene. Vil du lese flere svar fra andre tech-savvy Stack Exchange-brukere? Sjekk ut hele diskusjonstråden her.