我的 Google-fu 让我失望了!
在 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
Windows 上的 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”。只是任务管理器,等人,不知道内部形式是否向左移动两位。:)