为什么系统 PID 是 4,而不是 PID 1?

为什么系统 PID 是 4,而不是 PID 1?

我的 Google-fu 让我失望了!

在 Linux 上,PID 最小的进程是initPID 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

为什么SystemWindows 上的 PID 是 4,而不是 PID 1?

答案1

您会注意到所有 PID 都能被 4 整除。因此 4 是 0(即空闲进程)之后第一个可用的 PID。

因为是真的,看看这篇 MSDN 帖子作者:Raymond Chen:

进程和线程 ID 是 4 的倍数,这是代码重用的副作用。分配内核句柄的代码也用于分配进程和线程 ID。由于内核句柄是 4 的倍数,因此进程和线程 ID 也是 4 的倍数。

但请注意,进程 ID 实际上并不是这些进程可用的句柄值。这些数字只是由相同的算法生成的。

由于内核句柄总是可以被四整除...Raymond Chen 对救援再次!

底部两位的可用性隐藏在 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”。只是任务管理器,等人,不知道内部形式是否向左移动两位。:)

相关内容