Почему системный PID 4, а не PID 1?

1638
Hydraxan14

Мой Google-фу подвел меня!

В Linux процесс с наименьшим PID выполняется initс PID 1, поскольку это первый процесс, который запускается после загрузки ядра и отвечает за запуск всех других процессов.

pi@raspberry:~ $ ps -ef --sort=pid | head -n 5 UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jan22 ? 00:02:20 /sbin/init root 2 0 0 Jan22 ? 00:00:00 [kthreadd] root 3 2 0 Jan22 ? 00:05:54 [ksoftirqd/0] root 5 2 0 Jan22 ? 00:00:00 [kworker/0:0H] 

В Windows процесс с самым низким PID - это SystemPID 4.

PS C:\Users\msbob> Get-Process | Sort-Object Id | Select -First 5  Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 0 0 0 24 0 0 Idle 755 0 144 844 4 4 System 32 1 556 1268 4 388 smss 521 82 139796 124204 390 6.07 424 iexplore 661 12 2268 4728 49 604 csrss 

Почему SystemPID 4 в Windows, а не PID 1?

1

1 ответ на вопрос

5
Jamie Hanrahan

Вы заметите, что все 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". Просто диспетчер задач и др. Не знают, что во внутренней форме он сдвинут влево на два бита. :)

Ага! Погуглив «pid окон, делимых на 4», я привел меня к [этому ответу] (http://superuser.com/a/571470/676912), в котором более подробно. Спасибо! Hydraxan14 7 лет назад 0
Я добавил больше информации, основываясь на сообщениях в блоге MSDN Раймонда Чена, первый из которых был отреагирован на этот ответ. Jamie Hanrahan 7 лет назад 0
Спасибо кому угодно за «лучший ответ» и дополнительные отзывы. :) Jamie Hanrahan 7 лет назад 0