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


27

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


18
pid0のために特別な意味があるkill(2)、それは意味システムコール自身とのためにwaitpid(2)、それが意味する私のプロセスグループ内の任意のプロセス少なくともを。言うまでもなく、fork()戻る0ということは、私たちが子供の中にいるということです。
ステファンシャゼル

1
これを回答として投稿する必要があります
ジョナサンミュラー

3
ゼロは、レジスタにロードされると、ほとんどのCPUのステータスレジスタにフラグを自動的に設定します。これにより、特に比較/テストすることなく、分岐を取得できます。したがって、「センチネル」値、つまりここで「無効」、「データの終わり」、または「特別なケース」を意味する値として非常によく使用されます。そのため、コンピューターは0からカウントを開始しますが、問題のアプリケーションまたはデータ構造の最初の有効な値は1である場合が多くあります。
ローレンス

4
補足:コンピューターはゼロからカウントを開始しません。多くのプログラミング言語と私は、すべての機械語が他の人(およびほとんどの人間)がインデックスを使用するオフセットを使用すると信じていますが、カウントは何であれカウントしています。2つの要素を持つ配列には、言語がオフセットで参照するかインデックスで参照するかに関係なく、2つの要素があります(カウントします)。
jthill

これはおそらく、プログラミングの根本的なパラダイムに反対する場合です。プログラマーの特別なフラグ値(ゼロ、負の値)への引力は、ゼロベースのナンバリングシステムの傾向の低いプルに勝ります。
マイケル

回答:


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とそのことについては、他の負の値)のようにそれらを使用する機能をものに応じて異なる意味を持っている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

5

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

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


4

一般に、「null参照」を示すために0がよく使用されます。これは、0の値が存在していても、特別な値を示すために0が必要なため、使用しない可能性があることを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.