Por que o System PID 4 e não o PID 1?

1

Meu Google-fu falhou comigo!

No Linux, o processo com o PID mais baixo é init com o PID 1, já que é o primeiro processo iniciado após o carregamento do kernel e é responsável por iniciar todos os outros processos.

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]

No Windows, o processo com o PID mais baixo é System com o 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

Por que System PID 4 no Windows, não no PID 1?

    
por Hydraxan14 24.02.2017 / 01:15

1 resposta

5

Você notará que todos os PIDs são divisíveis por 4. 4 é, portanto, o primeiro PID disponível após 0 (que é o processo ocioso).

Se <<> esse for verdadeiro, veja este Post do MSDN de Raymond Chen:

Process and thread IDs are multiples of four as a side-effect of code re-use. The same code the allocates kernel handles is also used to allocate process and thread IDs. Since kernel handles are a multiple of four, so too are process and thread IDs.

Observe, no entanto, que os IDs de processo não são realmente utilizáveis para manipular valores para esses processos. Os números são gerados pelo mesmo algoritmo.

E pela razão de que as alças do kernel são sempre divisíveis por quatro ... Raymond Chen para o resgate novamente!

The availability of the bottom two bits is buried in the ntdef.h header file:

// 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

(Para aqueles que não estão familiarizados com números binários: Um inteiro binário positivo com seus dois bits de ordem baixa zero é sempre divisível por quatro, assim como um número decimal que termina em "00" é sempre divisível por 100.) p>

Então ... uma resposta caprichosa é que o primeiro PID é realmente "1". É só que o Gerenciador de Tarefas, et al , não sabe que na forma interna ele é deslocado para a esquerda por dois bits. :)

    
por 24.02.2017 / 01:18