If-Koubou

De ce nu există Id-uri de proces Windows cu numere impare?

De ce nu există Id-uri de proces Windows cu numere impare? (Cum să)

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 și thread-urilor Windows sunt numerotate par și multipli de patru. De ce este asta? Postarea 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 Q & A.

Intrebarea

Cititorul superutilizatorului Peter Hahndorf dorește să știe de ce nu există ID-uri de procesare cu numere impare:

Există numeroase moduri de a vedea ID-urile de proces în Windows. Utilizarea PowerShell:

Obțineți 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 la fel de mult cum doriți și nu veți găsi niciodată un ID de proces numit impar, cel puțin nu pe nici o versiune care este bazată pe Windows NT. Care este motivul pentru aceasta?

De ce nu există numere de proces Windows cu numere impare?

Răspunsul

Contribuabilul SuperPlayer DavidPostill are răspunsul pentru noi:

De ce nu există numere de proces Windows cu numere impare?

Același cod care alocă mânerele kernelului este, de asemenea, folosit pentru a aloca ID-urile de proces și de fire. Din moment ce mânerele kernel-ului sunt mai multe decât patru, identitatea procesului și a thread-ului.

De ce ID-urile proceselor și thread-urilor 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. E 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 Windows 95 și thread-urile nu au fost întotdeauna multiplii 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ânerele kernelului este, de asemenea, folosit pentru a aloca ID-urile de proces și de fire. Deoarece mânerele kernel-ului 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 proceselor și thread-urilor 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 altor tipuri 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 implicit 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 biți tag-uri 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 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 comentarii. Doriți să citiți mai multe răspunsuri de la alți utilizatori de tehnologie Stack Exchange? Check out discuția completă aici.