컴퓨터가 0부터 카운트를 시작하면 왜 init 프로세스의 pid는 1입니까?


27

몸에 많이 넣지 않아도됩니다.


18
pid0은 대한 특별한 의미가 kill(2)그 의미 곳에 시스템 호출을 자신 하고 위해 waitpid(2)어디 의미 내 프로세스 그룹의 모든 프로세스를 적어도. 그 언급하지 않는 fork()반환 0우리는 아이에 걸 의미합니다.
Stéphane Chazelas

1
답변으로 게시해야합니다
Jonathan Muller

3
0은 레지스터에로드 될 때 대부분의 CPU 상태 레지스터에 플래그가 자동으로 설정되도록하므로, 특별히 비교 / 테스트하지 않고 분기를 사용할 수 있습니다. 따라서 "센티넬"값, 즉 "잘못된", "데이터 끝"또는 "특별한 경우"를 의미하는 값으로 많이 사용됩니다. 따라서 컴퓨터가 0부터 계산을 시작하더라도 1이 문제의 응용 프로그램 또는 데이터 구조에 유효한 첫 번째 값인 경우가 많습니다.
LawrenceC

4
참고 : 컴퓨터는 0부터 계산을 시작하지 않습니다. 많은 프로그래밍 언어와 나는 모든 기계 언어가 다른 (그리고 대부분의 인간) 인덱스를 사용하는 오프셋을 사용한다고 생각하지만, 계산이 중요합니다. 두 개의 요소가있는 배열은 언어가 오프셋을 기준으로 참조하는지 또는 인덱스를 기준으로 참조하는지에 관계없이 두 개의 요소 (계수)를 갖습니다.
jthill

이는 프로그래밍의 기본 패러다임에 반대하는 경우 일 수 있습니다. 특수 플래그 값 (0, 음수 1)에 대한 프로그래머의 중력은 0부터 시작하는 번호 매기기 시스템에 대한 확률이 적습니다.
마이클

답변:


29

프로세스에는 상위 (PPID)가 있어야합니다. 그럼에도 불구하고 커널은 실제 프로세스는 아니지만 최소한 init와 같은 일부 실제 프로세스를 수작업으로 만들고 프로세스 ID 0을 제공합니다. OS에 따라 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]
...

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

PID 것이 주 0(그리고 -1그 문제에 대한 다른 부정적인 값) 함수를 사용 그들을 좋아하는지에 따라 다른 의미를 가지고 kill, fork하고 waitpid.

마지막으로 init프로세스에 전통적으로 pid가 부여 되지만 #1OS 레벨 가상화가 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

5

특별히 구별되는 프로세스 ID가있는 두 가지 작업이 있습니다. swapper 또는 sched는 프로세스 ID 0을 가지며 이전 예제에 넣은 jlliagre와 같이 페이징을 담당하며 실제로는 일반 사용자 모드 프로세스가 아닌 커널의 일부입니다.

프로세스 ID 1은 일반적으로 시스템 시작 및 종료를 주로 담당하는 init 프로세스입니다. 원래 프로세스 ID 1은 기술적 조치에 의해 init 용으로 특별히 예약되지 않았습니다.이 ID는 커널이 처음으로 호출 한 프로세스의 자연스러운 결과로 나타납니다. 보다 최근의 유닉스 시스템에는 일반적으로 '프로세스'로 보이는 추가 커널 구성 요소가 있으며,이 경우 PID 1은 이전 시스템과의 일관성을 유지하기 위해 init 프로세스에 적극적으로 예약됩니다.


4

일반적으로 0은 '널 참조'를 나타내는 데 종종 사용됩니다. 이는 0 값이 존재하더라도 특수 값을 나타 내기 위해 0을 원하기 때문에 사용하지 않을 수 있음을 의미했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.