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 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .