몸에 넣을 것은 아무것도 남지 않았습니다.
답변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을 원하기 때문에 아마도 이를 사용하지 않을 것임을 의미합니다.