Hemsida » hur » Varför finns det inga udda nummererade Windows-process-ID?

    Varför finns det inga udda nummererade Windows-process-ID?

    Om du älskar att tinka med Windows och lära dig när du går, kanske du har märkt att Windows-process och tråd-ID är jämntalade och multiplar av fyra. Varför är det så? Dagens SuperUser Q & A-inlägg har svar på en nyfiken läsarens frågor.

    Dagens Question & Answer-session kommer till oss med tillstånd av SuperUser-en indelning av Stack Exchange, en community-driven gruppering av Q & A-webbplatser.

    Frågan

    SuperUser-läsaren Peter Hahndorf vill veta varför det finns inga udda nummererade Windows-process-ID:

    Det finns många sätt att titta på process-ID-erna i Windows. Använda PowerShell:

    Jag får detta resultat:

    Som du kan se är alla process-ID-ensnumrerade, inte bara det, de är alla multiplar av fyra. Du kan se så svårt som du vill, och du hittar aldrig ett udda nummereringsprocess ID, åtminstone inte på någon version som är Windows NT-baserad. Vad är orsaken till detta?

    Varför finns det inga udda nummererade Windows-process-ID?

    Svaret

    SuperUser-bidragare DavidPostill har svaret för oss:

    Varför finns det inga udda nummererade Windows-process-ID?

    Samma kod som allokerar kärnhandtag används också för att allokera process- och tråd-ID. Eftersom kärnhandtag är en multipel av fyra, så är process- och tråd-ID.

    Varför är process- och tråd-ID-multiplar av fyra?

    I Windows NT-baserade operativsystem råkar alltid process- och tråd-IDs vara en multipel av fyra. Är detta bara en slump?

    Ja, det är bara en slump, och du borde inte lita på det eftersom det inte ingår i programkontraktet. Exempelvis var Windows 95-process- och tråd-ID inte alltid multiplar av fyra. Som en jämförelse är orsaken till att kärnan hanterar alltid en multipel av fyra en del av specifikationen och kommer att garanteras under överskådlig framtid.

    Process- och tråd-ID är multiplar av fyra som en bieffekt av kodåteranvändning. Samma kod som allokerar kärnhandtag används också för att allokera process- och tråd-ID. Eftersom kärnhandtag är multiplar av fyra, så är process- och tråd-ID. Detta är en implementeringsdetalj, så skriv inte kod som bygger på den. Jag säger bara att du ska tillfredsställa din nyfikenhet.

    Källa: Varför är process- och tråd-ID-multiplar av fyra?

    Varför är kärnhandtag alltid en multipel av fyra?

    Något som inte är väldigt välkänt är att de två bitarna i kärnan handlar är alltid noll; med andra ord är deras numeriska värde alltid en multipel av fyra. Observera att detta endast gäller kernelhandtag; Det gäller inte pseudohandtag eller någon annan typ av handtag (USER-handtag, GDI-handtag, multimediahandtag, etc.). Kärnhandtag är saker som du kan överföra till CloseHandle-funktionen.

    Att åtminstone bottenbiten av kärnhanteringar alltid är noll är underförstådd av GetQueuedCompletionStatus-funktionen, vilket indikerar att du kan ställa in bottenbiten i händelsehandtaget för att undertrycka fulländningsportmeddelandet. För att detta ska fungera måste bottenbiten normalt vara noll.

    Denna information är inte användbar för de flesta applikationsskrivare, som bör fortsätta att behandla handtag som ogenomskinliga värden. De personer som skulle vara intresserade av tagbitar är de som genomför lågklassiga bibliotek eller wrapperar kärnobjekt i en större ram.

    Källa: Varför är kärnhandtag alltid en multipel av fyra?

    Vidare läsning

    Den gamla nyheten: Praktisk utveckling genom hela utvecklingen av Windows av Raymond Chen (Principal Software Design Engineer hos Microsoft)


    Har du något att lägga till förklaringen? Ljud av i kommentarerna. Vill du läsa mer svar från andra tech-savvy Stack Exchange-användare? Kolla in hela diskussionsgängan här.