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