Вопрос: Почему нет нечетных идентификаторов процессов Windows?


Существует много способов проверить идентификаторы процессов в Windows.

Например, используя команду PowerShell:

ps | select Id, ProcessName  | Sort Id | ft -AutoSize

Мы видим следующий результат:

  Id ProcessName         
  -- -----------         
   0 Idle                
   4 System              
 264 svchost             
 388 smss                
 476 csrss               
 536 wininit             
 580 winlogon                      
 620 services            
 628 lsass                          
 728 svchost             
 828 dwm                                     
1060 chrome              
1080 rundll32            
1148 vmms                                        
1620 spoolsv                                                
2912 taskhostex          
3020 explorer       
...     

Все идентификаторы процесса - это четные числа, и, кроме того, все они кратные 4,

Нет никаких нечетных идентификаторов процессов на любой версии Windows, основанной на Windows NT.

Что является причиной этого?


158
2017-07-06 08:21


Источник


Возможно интересно: некоторые подробности о Linux - justskins.com/forums/why-are-process-ids-204416.html - Dave
На самом деле их нет. Странно. - AndreKR


Ответы:


«Почему нет лишних идентификаторов процессов Windows?»

Тот же код, который выделяет дескрипторы ядра, также используется для   распределять идентификаторы процессов и потоков. Поскольку дескрипторы ядра являются множественными   из четырех, так же, как и идентификаторы процессов и потоков.


Почему идентификаторы процессов и потоков кратно четырем?

В операционных системах на базе Windows NT происходит идентификация процессов и потоков   всегда быть кратным четырем. Это просто совпадение?

Да, это просто совпадение, и вы не должны полагаться на него, поскольку оно   не является частью контракта на программирование. Например, процесс Windows 95   и идентификаторы потоков не всегда были кратными четырем. (Для сравнения,   причина, по которой ручки ядра всегда кратно четырем, является частью   спецификация и будет гарантирована в обозримом будущем.)

Идентификаторы процессов и потоков кратно четырем в качестве побочного эффекта кода   повторное использование. Тот же код, который выделяет дескрипторы ядра, также используется для   распределять идентификаторы процессов и потоков. Поскольку дескрипторы ядра являются множественными   из четырех, так же, как и идентификаторы процессов и потоков. Это реализация   детали, поэтому не пишите код, который опирается на него. Я просто говорю вам:   удовлетворить ваше любопытство.

Источник Почему идентификаторы процессов и потоков кратно четырем?


Почему ядро ​​HANDLEs всегда кратно четырем?

Не очень хорошо известно, что нижние два бита ядра HANDLE   всегда ноль; другими словами, их числовое значение всегда является кратным   из 4. Обратите внимание, что это относится только к ядру HANDLE; он не применяется   к псевдо-ручкам или к любому другому типу дескриптора (ручки USER, GDI   ручками, мультимедийными ручками ...) Ручки ядра - это вещи, которые вы можете пройти   к функции CloseHandle.

Доступность нижних двух бит похоронена в файле ntdef.h   файл заголовка:

//
// Low order two bits of a handle are ignored by the system and available
// for use by application code as tag bits.  The remaining bits are opaque
// and used to store a serial number and table index.
//

#define OBJ_HANDLE_TAGBITS  0x00000003L

То, что по крайней мере нижний бит ядра HANDLE всегда равен нулю,   подразумевается функцией GetQueuedCompletionStatus, которая указывает   что вы можете установить нижний бит дескриптора события для подавления   завершение port сообщение. Чтобы это работало, нижняя   бит должен быть равен нулю.

Эта информация не полезна для большинства авторов приложений, которые   должны продолжать обрабатывать РУЧКИ как непрозрачные значения. Люди, которые   были бы заинтересованы в битах тегов, которые выполняют   низкоуровневые библиотеки классов или обертывают объекты ядра внутри   более крупные рамки.

Источник Почему ядро ​​HANDLEs всегда кратно четырем?


дальнейшее чтение



166
2017-07-06 09:13



Одна цитата говорит «вы не должны полагаться на него, поскольку он не является частью контракта на программирование», но затем следующие утверждения ntdef.h говорят, что бит «доступный для использования кодом приложения как биты битов».  Документация в общем заголовочном файле примерно так же близка к «контракт на программирование» как вы можете получить, поэтому первое требование неверно. - BlueRaja - Danny Pflughoeft
@BlueRaja: «Не очень хорошо известно, что нижние два бита Ядро HANDLE всегда равно нулю; другими словами, их числовое значение всегда кратно 4.«Код в ntdef.h применяется и к другим типам дескрипторов (дескрипторы USER, дескрипторы GDI, мультимедийные дескрипторы ...) - DavidPostill♦
@BlueRaja: дескрипторы ядра несколько из четырех, и это контрактно, поэтому вы можете положиться на него; идентификаторы процессов (которые не то же самое, что и обрабатываемые процессы), вместо этого, случаться быть кратным четырем, но это всего лишь деталь реализации, поэтому вы не должны полагаться на нее. - Matteo Italia
@BlueRaja Я думаю, Раймонд сказал бы вам, что тот, кто писал документацию, смотрел на мир через очки из цветного стекла и поэтому они относятся только к ручкам ядра, а не к другим видам ручек. - CodesInChaos
@Mehrdad: ну, дескрипторы USER и GDI обычно не называются «ядровыми» дескрипторами (хотя они генерируются компонентами, работающими в так называемом режиме ядра). - Matteo Italia