Bilgisayarlar 0'dan saymaya başlarsa, neden init işlemi neden 1 pid?


27

Burada vücutta koymak için çok fazla değil.


18
pid0, kendim için anlam ifade eden kill(2)sistem çağrısı ve en azından benim süreç grubumdaki herhangi bir işlem anlamına geldiği için özel bir anlama sahiptir . Geri dönmenin çocuk olduğumuz anlamına geldiğinden bahsetmiyorum bile . waitpid(2)fork()0
Stéphane Chazelas 19:13

1
Bunu bir cevap olarak göndermelisin
Jonathan Muller

3
Sıfır, bayrakların bir yazmaç içine yüklendiğinde çoğu işlemcinin durum kaydında otomatik olarak ayarlanmasına neden olur, böylece dalın özel olarak karşılaştırmadan / test etmeden dalın alınmasına olanak tanır. Bu nedenle, bir "sentinel" değeri, yani "geçersiz", "veri sonu" veya "özel durum" anlamına gelen bir değer olarak kullanılır. Böylece bilgisayarlar 0'dan saymaya başlasa da, söz konusu uygulama veya veri yapısı için 1'in geçerli ilk değer olduğu birçok durum olacaktır.
LawrenceC

4
Yan not: Bilgisayarlar sıfırda saymaya başlamaz. Birçok programlama dili ve tüm makine dillerinin, başkalarının (ve çoğu insanın) indeks kullandığı ofsetleri kullandığına inanıyorum, ancak ne olursa olsun, sayım sayılıyor. İki öğeli bir dizide iki öğe vardır (dilleri sayınız), dilinizin onları ofset mi yoksa indeks mi gösterdiği önemli değildir.
jthill

Bu, muhtemel altta yatan programlama paradigmalarına karşı bir durum olabilir: programcının özel bayrak değerlerine (sıfır, negatif bir) doğru yerçekimi, sıfır tabanlı numaralandırma sistemleri için bir eğilimin azalmasına neden olur.
michael

Yanıtlar:


29

İşlemlerin bir ebeveyni (PPID) olması gerekir. Çekirdek, gerçek süreç olmama rağmen, yine de en azından init gibi bazı gerçek süreçleri handcrafting edilir ve kendisine o ya bir süreç olarak görüntülenebilir olmayabilir belki OS bağlı işlem kimliğini 0. veriyor psçıktı ama her zaman görüntülenir PPID olarak:

örneğin Linux'ta:

$ 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'te:

$ 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 olması da Not 0(ve -1ve bu konuda diğer olumsuz değerler) fonksiyonu kullanımı onlara ne gibi bağlı farklı anlamlara sahiptir kill, forkve waitpid.

Son olarak, initsüreç geleneksel olarak ödenmesine #1rağmen, işletim sistemi düzeyinde sanallaştırmanın Solaris bölgeleri gibi kullanıldığı durumlarda, birden fazla işlem yapılabileceği için bu durum geçerli değildir 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

Özel olarak ayırt edilmiş işlem ID'lerine sahip iki görev vardır: takas veya zamanlama ID 0 işlemine sahiptir ve daha önce örneklerde verilen jlliagre gibi sayfalama işleminden sorumludur ve aslında normal bir kullanıcı modu işleminden ziyade çekirdeğin bir parçasıdır.

İşlem Kimliği 1 genellikle sistemin başlatılması ve kapatılmasından sorumlu olan başlangıç ​​sürecidir. Başlangıçta, işlem kimliği 1 herhangi bir teknik önlem tarafından özel olarak başlatılmadı: bu kimliği çekirdeğin başlattığı ilk işlem olmanın doğal bir sonucu olarak görüyordu. Daha yeni Unix sistemleri tipik olarak 'işlemler' olarak görülebilen ilave çekirdek bileşenlere sahiptir; bu durumda, PID 1, init işleminin daha eski sistemlerle tutarlılığını korumak için aktif olarak ayrılmıştır.


4

Genel olarak 0, 'boş bir referans' belirtmek için sıklıkla kullanılır. Bu, 0 değeri olsa da, özel bir değeri belirtmek için sıfır istediğiniz için kullanmayabileceğiniz anlamına geliyordu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.