web-dev-qa-db-ja.com

コンピューターが0からカウントを開始する場合、initプロセスのpidが1になるのはなぜですか?

ここに体に入れることはあまりありません。

27
benwaffle

プロセスには親(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_とそのほかの負の値)は、killforkwaitpidなどの関数を使用する関数によって意味が異なることにも注意してください。

最後に、initプロセスには伝統的にpid _#1_が指定されますが、OSの仮想化が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
_
29
jlliagre

特別に区別されたプロセスIDを持つ2つのタスクがあります。スワッパーまたはschedはプロセスID 0を持ち、ページングを担当します。たとえば、前の例でjlliagreが使用したように、実際には通常のユーザーモードプロセスではなくカーネルの一部です。

プロセスID 1は通常、システムの起動とシャットダウンを主に担当するinitプロセスです。もともと、プロセスID 1は、技術的な手段によって特に初期化のために予約されていませんでした。カーネルによって最初に呼び出されたプロセスの当然の結果として、このIDがあっただけです。最近のUnixシステムには通常、「プロセス」として表示される追加のカーネルコンポーネントがあります。この場合、PID 1は、古いシステムとの一貫性を維持するためにinitプロセス用に積極的に予約されています。

5
curratore

一般に、0は「null参照」を示すためによく使用されます。つまり、0の値が存在していても、ゼロに特別な値を指定したいので、その値を使用しない場合があります。

4
user606723