Якщо комп’ютери починають рахувати з 0, то чому в процесі init є pid 1?


27

Не так багато, щоб покласти тут тіло.


18
pid0 має особливе значення для kill(2)системного виклику там, де він означає себе і waitpid(2)де він означає принаймні будь-який процес у моїй групі процесів . Не кажучи вже про те, що fork()повернення 0означає, що ми в дитині.
Стефан Шазелас

1
Ви повинні опублікувати це як відповідь
Джонатан Мюллер

3
Нуль призводить до автоматичного встановлення прапорів у більшості регістрів статусу процесора, коли він завантажується в реєстр, що дозволяє філії приймати на нього, не спеціально порівнюючи / тестуючи для нього. Тому воно дуже сильно використовується як "дозорне" значення, тобто значення, яке тут означає "недійсне", "кінець даних" або "спеціальний випадок". Тож, хоча комп’ютери починають рахувати з 0, буде багато випадків, коли 1 є першим дійсним значенням для відповідної програми або структури даних.
LawrenceC

4
Побічна примітка: Комп'ютери не починають рахувати з нуля. Багато мов програмування, і я вважаю, що всі машинні мови використовують компенсації, коли інші (і більшість людей) використовують індекси, але, незважаючи ні на що, підрахунок рахується. У масиві з двома елементами є два елементи (порахуйте їх), незалежно від того, чи відноситься ваша мова до них за зміщенням чи за індексом.
jthill

це, мабуть, випадок протилежних парадигм програмування: тяжіння програміста до спеціальних значень прапора (нульове, від'ємне) перетворює на менший показник сприятливості для нульових систем нумерації.
Майкл

Відповіді:


29

Процеси повинні мати батьківський (PPID). Ядро, не дивлячись на реальний процес, все-таки обробляє деякі реальні процеси, як-от принаймні init, і надає собі ідентифікатор процесу 0. Залежно від ОС воно може бути або не може відображатися як процес у 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процес традиційно надається під #1, це вже не той випадок, коли віртуалізація рівня ОС використовується як зони 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

Існують два завдання зі спеціально розрізненими ідентифікаторами процесу: swapper або sched має ідентифікатор процесу 0 і відповідає за пейджингові повідомлення, як jlliagre, наведені в прикладах раніше, і насправді є частиною ядра, а не звичайним процесом у режимі користувача.

Ідентифікатор 1 процесу, як правило, є процесом init, головним чином відповідальним за запуск і вимкнення системи. Спочатку ідентифікатор 1 процесу не був спеціально зарезервований для init будь-якими технічними заходами: він просто мав цей ідентифікатор як природний наслідок того, що це перший процес, на який викликається ядро. Більш пізні системи Unix, як правило, містять додаткові компоненти ядра, видимі як "процеси", і в цьому випадку PID 1 активно зарезервований для процесу init для підтримки узгодженості зі старими системами.


4

Взагалі 0 часто використовується для позначення "нульової посилання". Це означало, що незважаючи на те, що значення 0 існує, ви можете не використовувати його, оскільки ви хочете, щоб нуль означало спеціальне значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.