Если компьютеры начинают рассчитывать в 0, почему процесс init имеет pid 1?

Когда Вы работаете ./s, Вы говорите ядру выполнять программу s. Если у Вас есть разрешение выполнения, то ядро читает первые несколько байтов файла, видит #! строка, таким образом, это знает, что это - сценарий, и выполняет интерпретатор, передавая его название сценария как его первый аргумент. Если Вы не имеете, выполняют разрешение, ядро прерывает выполнение в первом шаге.

Когда Вы работаете zsh s, Вы выполняетесь zsh, и скажите этому читать названный файл s и интерпретируйте его как команды. Вы не выполняетесь s, Вы выполняетесь zsh. То же самое с sh s или cat s.

Когда Вы работаете source s, снова, Вы говорите zsh читать файл, поэтому что имеет значение, то, что Вы прочитали разрешение на нем.

27
27.12.2018, 00:49
3 ответа

Процессы должны иметь родителя (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]
...

на Солярисе:

$ 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 процессу традиционно дают pid #1, это больше не случай, когда виртуализация уровня ОС используется как зоны Соляриса, поскольку может быть больше чем один 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
27.01.2020, 19:39

Существует две задачи со специально выдающимися идентификаторами процесса: программа подкачки или sched имеют идентификатор 0 процесса и ответственны за подкачку страниц, как jlliagre, вставленный в примеры прежде, и являются на самом деле частью ядра, а не нормального процесса непривилегированного режима.

Идентификатор 1 процесса обычно является процессом init, прежде всего, ответственным за то, что начал и закрыл систему. Первоначально, идентификатор 1 процесса не был конкретно зарезервирован для init никакими техническими мерами: это просто имело этот идентификатор как естественное следствие того, чтобы быть первым процессом, вызванным ядром. Более свежие системы Unix обычно имеют дополнительные компоненты ядра, видимые как 'процессы', в этом случае PID 1 активно резервируется, чтобы процесс init поддержал непротиворечивость с более старыми системами.

5
27.01.2020, 19:39

В целом, 0 часто используется для выражения 'нулевой ссылки'. Это означало, что даже при том, что эти 0 значений существуют, Вы не могли бы использовать их, потому что Вы хотите, чтобы нуль показал специальное значение.

4
27.01.2020, 19:39

Теги

Похожие вопросы