jll*_*gre 29

进程需要有一个父进程 (PPID)。内核,尽管不是一个真正的进程,但仍然手工制作一些真正的进程,至少像 init,并给自己进程 ID 0。根据操作系统,它可能会或可能不会在ps输出中显示为进程,但始终显示作为 PPID:

例如在 Linux 上:

$ ps -ef|head
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:09 ?        00:00:00 /sbin/init
root         2     0  0 09:09 ?        00:00:00 [kthreadd]
root         3     2  0 09:09 ?        00:00:00 [ksoftirqd/0]
...
Run Code Online (Sandbox Code Playgroud)

在 Solaris 上:

$ ps -ef|head
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root     0     0   0   Oct 19 ?           0:01 sched
    root     5     0   0   Oct 19 ?          11:20 zpool-rpool1
    root     1     0   0   Oct 19 ?           0:13 /sbin/init
    root     2     0   0   Oct 19 ?           0:07 pageout
    root     3     0   1   Oct 19 ?         117:10 fsflush
    root   341     1   0   Oct 19 ?           0:15 /usr/lib/hal/hald --daemon=yes
    root     9     1   0   Oct 19 ?           0:59 /lib/svc/bin/svc.startd
...
Run Code Online (Sandbox Code Playgroud)

另请注意,pid 0(以及-1其他负值)具有不同的含义,具体取决于使用它们的功能,例如kill,forkwaitpid

最后,虽然init进程传统上被赋予 pid #1,但当操作系统级虚拟化像 Solaris 区域一样使用时,情况就不再如此,因为可能有多个init运行:

$ ps -ef|head
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root  4733  3949   0 11:07:25 ?           0:26 /lib/svc/bin/svc.configd
    root  4731  3949   0 11:07:24 ?           0:06 /lib/svc/bin/svc.startd
    root  3949  3949   0 11:07:14 ?           0:00 zsched
  daemon  4856  3949   0 11:07:46 ?           0:00 /lib/crypto/kcfd
    root  4573  3949   0 11:07:23 ?           0:00 /usr/sbin/init
  netcfg  4790  3949   0 11:07:34 ?           0:00 /lib/inet/netcfgd
    root  4868  3949   0 11:07:48 ?           0:00 /usr/lib/pfexecd
    root  4897  3949   0 11:07:51 ?           0:00 /usr/lib/utmpd
  netadm  4980  3949   0 11:07:54 ?           0:01 /lib/inet/nwamd
Run Code Online (Sandbox Code Playgroud)


cur*_*ore 5

有两个具有特殊进程 ID 的任务: swapper 或 sched 进程 ID 为 0 并负责分页,就像前面例子中的 jlliagre 一样,实际上是内核的一部分,而不是普通的用户模式进程。

进程 ID 1 通常是主要负责启动和关闭系统的 init 进程。最初,进程 ID 1 并没有通过任何技术措施专门为 init 保留:它只是将这个 ID 作为内核调用的第一个进程的自然结果。较新的 Unix 系统通常有额外的内核组件作为“进程”可见,在这种情况下,PID 1 主动保留给 init 进程以保持与旧系统的一致性。