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

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?

Hydraxan14
источник

Ответы:

5

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

Jamie Hanrahan
источник
Ага! Погуглив "пид окна делится на 4" привел меня к этот ответ который имеет больше деталей. Спасибо!
Hydraxan14
Я добавил больше информации, основываясь на сообщениях в блоге MSDN Раймонда Чена, первый из которых был отреагирован на этот ответ.
Jamie Hanrahan
Спасибо всем за «лучший ответ» и дополнительные голоса. :)
Jamie Hanrahan