De ce nu există numere de proces Windows cu numere impare?
Dacă vă placeți să vă grăbiți cu Windows și să învățați pe măsură ce mergeți, este posibil să fi observat că ID-urile proceselor Windows și thread-urilor sunt numerotate în par și multipli de patru. De ce este asta? Postul de astăzi SuperUser Q & A are răspunsurile la întrebările curioase ale cititorului.
Sesiunea de întrebări și răspunsuri din ziua de astăzi vine de la amabilitatea SuperUser - o subdiviziune a Stack Exchange, o grupare bazată pe comunitate a site-urilor web Q & A.
Intrebarea
Cititorul de super-utilizatori Peter Hahndorf dorește să știe de ce nu există numere de proces numere impare în Windows:
Există mai multe moduri de a vedea ID-urile de proces în Windows. Utilizarea PowerShell:
Am obtinut acest rezultat:
După cum puteți vedea, toate ID-urile proceselor sunt numerotate în par, nu numai că acestea sunt toate multipli de patru. Puteți arăta atât de tare cum doriți și nu veți găsi niciodată un ID de proces numerotat ciudat, cel puțin nu pe nici o versiune bazată pe Windows NT. Care este motivul pentru asta??
De ce nu există numere de proces numere impare în Windows?
Răspunsul
Contribuitorul SuperPlayer DavidPostill are răspunsul pentru noi:
De ce nu există numere de proces numere impare în Windows?
Același cod care alocă mânere de kernel este, de asemenea, utilizat pentru alocarea ID-urilor de proces și thread. Deoarece mânerele kernel-ului sunt un multiplu de patru, identitatea proceselor și a thread-ului.
De ce ID-urile procesului și thread-ului sunt multipli de patru?
Pe sistemele de operare bazate pe Windows NT, ID-urile proceselor și thread-urilor se întâmplă întotdeauna a fi un multiplu de patru. Este doar o coincidență?
Da, este doar o coincidență și nu trebuie să vă bazați pe ea deoarece nu face parte din contractul de programare. De exemplu, ID-urile proceselor și thread-urilor Windows 95 nu au fost întotdeauna multipli de patru. Prin comparație, motivul pentru care mânerele kernelului sunt întotdeauna un multiplu de patru, face parte din specificație și vor fi garantate pentru viitorul previzibil.
Identificările proceselor și thread-urilor sunt multiplii de câte patru ca efect secundar al reutilizării codului. Același cod care alocă mânere de kernel este, de asemenea, utilizat pentru alocarea ID-urilor de proces și thread. Deoarece mânerele kernelului sunt multipli de patru, identitatea procesului și a thread-ului. Acesta este un detaliu al implementării, deci nu scrieți cod care se bazează pe acesta. Îți spun doar să îți satisfaci curiozitatea.
Sursă: De ce ID-urile procesului și thread-ului sunt multipli de patru?
De ce sunt mânerele de kernel întotdeauna un multiplu de patru?
Ceva care nu este foarte bine cunoscut este că cei doi biți de bază ai mânerelor kernelului sunt întotdeauna zero; cu alte cuvinte, valoarea lor numerică este întotdeauna un multiplu de patru. Rețineți că acest lucru se aplică numai mânerelor kernel-ului; nu se aplică pseudo-mânerelor sau oricărui alt tip de mâner (manere USER, mânere GDI, mânere multimedia etc.). Mânerele de kernel sunt lucruri pe care le puteți trece la funcția CloseHandle.
Că cel puțin bitul inferior al mânerelor kernelului este întotdeauna zero este sugerat de funcția GetQueuedCompletionStatus, ceea ce indică faptul că puteți seta bitul inferior al mânerului evenimentului pentru a suprima notificarea portului de finalizare. Pentru ca aceasta să funcționeze, bitul inferior trebuie în mod normal să fie zero.
Aceste informații nu sunt utile pentru majoritatea scriitorilor de aplicații, care ar trebui să continue tratarea mânerelor ca valori opace. Persoanele care ar fi interesate de tag-ul biți sunt cei care implementează biblioteci de clasă de nivel inferior sau împachetează obiecte kernel într-un cadru mai larg.
Sursă: De ce sunt mânerele de kernel întotdeauna un multiplu de patru?
Citirea în continuare
Vechiul lucru nou: Dezvoltarea practică pe tot parcursul evoluției Windows de Raymond Chen (Principal Inginer Software Design la Microsoft)
Aveți ceva de adăugat la explicație? Sunați în comentariile. Doriți să citiți mai multe răspunsuri de la alți utilizatori de tehnologie Stack Exchange? Check out discuția completă aici.