Jika komputer mulai menghitung pada 0, mengapa proses init memiliki 1 pid?

27

Tidak banyak yang bisa dimasukkan ke dalam tubuh.

benwaffle
sumber
18
pid0 memiliki arti khusus untuk kill(2)pemanggilan sistem di mana itu berarti saya sendiri dan untuk di waitpid(2)mana artinya adalah setiap proses dalam grup proses saya setidaknya. Belum lagi bahwa fork()kembali 0berarti kita berada di dalam anak.
Stéphane Chazelas
1
Anda harus memposting ini sebagai jawaban
Jonathan Muller
3
Nol menyebabkan bendera ditetapkan secara otomatis pada sebagian besar register status CPU ketika dimuat dalam register, memungkinkan cabang untuk mengambilnya tanpa secara khusus membandingkan / menguji untuk itu. Oleh karena itu sangat banyak digunakan sebagai nilai "sentinel", yaitu nilai yang berarti "tidak valid", "akhir data", atau "kasus khusus" di sini. Jadi meskipun komputer mulai menghitung pada 0, akan ada banyak kasus di mana 1 adalah nilai valid pertama untuk aplikasi atau struktur data yang dimaksud.
LawrenceC
4
Catatan tambahan: Komputer tidak mulai menghitung nol. Banyak bahasa pemrograman dan saya percaya semua bahasa mesin menggunakan offset di mana orang lain (dan sebagian besar manusia) menggunakan indeks tetapi, tidak peduli apa pun, penghitungan adalah penghitungan. Array dengan dua elemen memiliki dua elemen (hitung mereka), tidak peduli apakah bahasa Anda merujuknya dengan offset atau indeks.
jthill
ini kemungkinan adalah kasus yang menentang paradigma mendasar dari pemrograman: gravitasi programmer terhadap nilai-nilai bendera khusus (nol, negatif) mengalahkan traksi yang kurang menarik dari kecenderungan untuk sistem penomoran berbasis-nol.
michael

Jawaban:

29

Proses harus memiliki orang tua (PPID). Kernel, meskipun bukan merupakan proses nyata, tetap membuat beberapa proses nyata seperti setidaknya init, dan memberikan sendiri proses ID 0. Tergantung pada OS, mungkin ditampilkan atau tidak sebagai proses dalam psoutput tetapi selalu ditampilkan sebagai PPID:

misalnya di 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]
...

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

Perhatikan juga bahwa pid 0(dan -1dan nilai negatif lainnya dalam hal ini) memiliki arti yang berbeda tergantung pada fungsi yang digunakannya kill, forkdan waitpid.

Akhirnya, sementara initproses secara tradisional diberikan pid #1, ini tidak lagi terjadi ketika virtualisasi tingkat OS digunakan seperti zona Solaris, karena mungkin ada lebih dari satu yang initberjalan:

$ 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
Jlliagre
sumber
5

Ada dua tugas dengan ID proses yang dibedakan secara khusus: swapper atau sched memiliki ID proses 0 dan bertanggung jawab untuk paging, seperti jlliagre yang dimasukkan dalam contoh sebelumnya, dan sebenarnya merupakan bagian dari kernel daripada proses mode pengguna normal.

ID Proses 1 biasanya merupakan proses init yang terutama bertanggung jawab untuk memulai dan mematikan sistem. Awalnya, ID proses 1 tidak secara khusus dicadangkan untuk init oleh tindakan teknis apa pun: ID proses itu hanya sebagai konsekuensi alami sebagai proses pertama yang dilakukan oleh kernel. Sistem Unix yang lebih baru biasanya memiliki komponen kernel tambahan yang terlihat sebagai 'proses', dalam hal ini PID 1 secara aktif dicadangkan untuk proses init untuk menjaga konsistensi dengan sistem yang lebih lama.

curratore
sumber
4

Secara umum, 0 sering digunakan untuk menandakan 'referensi nol'. Ini berarti bahwa meskipun nilai 0 ada, Anda mungkin tidak menggunakannya karena Anda ingin nol untuk menandakan nilai khusus.

pengguna606723
sumber