Si les ordinateurs commencent à compter à 0, pourquoi le processus init a-t-il un pid de 1?

27

Pas grand chose à mettre ici dans le corps.

benwaffle
la source
18
pid0 a une signification particulière pour l' kill(2)appel système où cela signifie que moi - même et waitpid(2)où cela signifie tout processus dans mon groupe de processus au moins. Sans oublier que le fork()retour 0signifie que nous sommes dans l'enfant.
Stéphane Chazelas
1
vous devriez poster ceci comme une réponse
Jonathan Muller
3
Zéro entraîne la définition automatique d'indicateurs sur la plupart des registres d'état du processeur lorsqu'il est chargé dans un registre, ce qui permet à une branche de s'y attaquer sans la comparer / le tester spécifiquement. Par conséquent, il est très utilisé comme valeur "sentinelle", c'est-à-dire une valeur qui signifie "invalide", "fin des données" ou "cas spécial" ici. Ainsi, même si les ordinateurs commencent à compter à 0, il y aura de nombreux cas où 1 est la première valeur valide pour l'application ou la structure de données en question.
LawrenceC
4
Remarque: les ordinateurs ne commencent pas à compter à zéro. De nombreux langages de programmation et je crois que tous les langages machine utilisent des décalages là où d'autres (et la plupart des humains) utilisent des index mais, quoi qu'il en soit, compter c'est compter. Un tableau à deux éléments a deux éléments (comptez-les), que votre langue s'y réfère par décalage ou par index.
jthill
il s'agit probablement d'un cas de paradigmes sous-jacents de programmation opposés: la gravitation du programmeur vers des valeurs de drapeau spéciales (zéro, un négatif) l'emporte sur la moindre attraction d'une propension pour les systèmes de numérotation à base zéro.
michael

Réponses:

29

Les processus doivent avoir un parent (PPID). Le noyau, bien qu'il ne s'agisse pas d'un processus réel, crée néanmoins à la main des processus réels comme au moins init et se donne l'ID de processus 0. Selon le système d'exploitation, il peut ou non s'afficher en tant que processus en pssortie, mais il est toujours affiché. comme PPID:

par exemple sous 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]
...

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

Notez également que pid 0(et d' -1autres valeurs négatives d'ailleurs) ont des significations différentes selon la fonction qui les utilise kill, forket waitpid.

Enfin, alors que le initprocessus est traditionnellement donné pid #1, ce n'est plus le cas lorsque la virtualisation au niveau du système d'exploitation est utilisée comme les zones Solaris, car il peut y avoir plus d'une initexécution:

$ 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
la source
5

Il y a deux tâches avec des ID de processus spécialement distingués: swapper ou sched a l'ID de processus 0 et est responsable de la pagination, comme jlliagre mis dans les exemples précédents, et fait en fait partie du noyau plutôt qu'un processus normal en mode utilisateur.

L'ID de processus 1 est généralement le processus d'initialisation principalement responsable du démarrage et de l'arrêt du système. À l'origine, l'ID de processus 1 n'était pas spécifiquement réservé à init par des mesures techniques: il avait simplement cet ID comme conséquence naturelle d'être le premier processus invoqué par le noyau. Les systèmes Unix plus récents ont généralement des composants de noyau supplémentaires visibles en tant que «processus», auquel cas le PID 1 est activement réservé au processus init pour maintenir la cohérence avec les systèmes plus anciens.

curratore
la source
4

En général, 0 est souvent utilisé pour signifier une «référence nulle». Cela signifie que même si la valeur 0 existe, vous ne pouvez pas l'utiliser car vous voulez que zéro signifie une valeur spéciale.

user606723
la source