Вы заметите, что все PID делятся на 4. Следовательно, 4 - это первый PID, доступный после 0 (это процесс Idle).
По той причине, что это правда, см. Этот пост MSDN Рэймонда Чена:
Идентификаторы процессов и потоков кратны четырем, что является побочным эффектом повторного использования кода. Тот же код, который выделяет дескрипторы ядра, также используется для выделения идентификаторов процессов и потоков. Так как дескрипторы ядра кратны четырем, то же самое происходит с идентификаторами процессов и потоков.
Обратите внимание, что идентификаторы процессов на самом деле не могут использоваться для обработки значений этих процессов. Числа просто генерируются одним и тем же алгоритмом.
И по той причине, что дескрипторы ядра всегда делятся на четыре ... Раймонд Чен снова на помощь !
Наличие двух нижних битов скрыто в заголовочном файле 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 // and used to store a serial number and table index. #define OBJ_HANDLE_TAGBITS 0x00000003L
(Для тех, кто не знаком с двоичными числами: положительное двоичное целое число с двумя нулевыми битами всегда делится на четыре, точно так же как десятичное число, оканчивающееся на «00», всегда делится на 100.)
Итак ... капризный ответ заключается в том, что первый PID на самом деле "1". Просто диспетчер задач и др. Не знают, что во внутренней форме он сдвинут влево на два бита. :)