컴퓨터가 0부터 세기 시작하면 init 프로세스의 pid가 1인 이유는 무엇입니까?

컴퓨터가 0부터 세기 시작하면 init 프로세스의 pid가 1인 이유는 무엇입니까?

몸에 넣을 것은 아무것도 남지 않았습니다.

답변1

프로세스에는 상위 프로세스(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]
...

솔라리스의 경우:

$ 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
...

또한 pid 0(및 -1해당 문제에 대한 기타 음수 값)는 이를 사용하는 함수에 따라 다른 의미를 갖습니다(예: kill, fork및 ) waitpid.

마지막으로, 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

답변2

특수 프로세스 ID를 가진 두 가지 작업이 있습니다. swapper 또는 sched는 프로세스 ID 0을 갖고 페이징을 담당하며 이전 예의 jlliagre와 마찬가지로 실제로 일반 사용자 모드 프로세스가 아닌 커널의 일부입니다.

프로세스 ID 1은 일반적으로 시스템 시작 및 종료를 주로 담당하는 init 프로세스입니다. 처음에 프로세스 ID 1은 기술적 조치에 의해 init 전용으로 예약되지 않았습니다. 단순히 커널이 호출한 첫 번째 프로세스의 자연스러운 결과로 이 ID를 갖게 되었습니다. 최신 Unix 시스템에는 "프로세스"로 간주할 수 있는 추가 커널 구성 요소가 있는 경우가 많습니다. 이 경우 PID 1은 이전 시스템과의 일관성을 유지하기 위해 init 프로세스용으로 적극적으로 예약됩니다.

답변3

일반적으로 0은 "널 참조"를 나타내는 데 자주 사용됩니다. 이는 0 값이 존재하더라도 특수 값을 나타내기 위해 0을 원하기 때문에 아마도 이를 사용하지 않을 것임을 의미합니다.

관련 정보