Si las computadoras comienzan a contar en 0, ¿por qué el proceso de inicio tiene un pid de 1?

27

No hay mucho que poner aquí en el cuerpo.

benwaffle
fuente
18
pid0 tiene un significado especial para la kill(2)llamada al sistema donde significa yo mismo y waitpid(2)donde significa cualquier proceso en mi grupo de procesos al menos. Sin mencionar que fork()regresar 0significa que estamos en el niño.
Stéphane Chazelas
1
deberías publicar esto como respuesta
Jonathan Muller
3
Cero hace que los indicadores se configuren automáticamente en la mayoría de los registros de estado de la CPU cuando se carga en un registro, lo que permite que una rama se tome sin compararlo / probarlo específicamente. Por lo tanto, se usa mucho como un valor "centinela", es decir, un valor que significa "no válido", "fin de datos" o "caso especial" aquí. Entonces, aunque las computadoras comiencen a contar en 0, habrá muchos casos en los que 1 es el primer valor válido para la aplicación o estructura de datos en cuestión.
LawrenceC
44
Una nota al margen: las computadoras no comienzan a contar en cero. Muchos lenguajes de programación y creo que todos los lenguajes de máquina usan compensaciones donde otros (y la mayoría de los humanos) usan índices pero, no importa qué, contar es contar. Una matriz con dos elementos tiene dos elementos (cuéntelos), sin importar si su idioma se refiere a ellos por desplazamiento o por índice.
2013
Este es probablemente un caso de paradigmas subyacentes opuestos de programación: la gravitación del programador hacia valores especiales de bandera (cero, uno negativo) supera la menor atracción de una propensión a los sistemas de numeración basados ​​en cero.
Michael

Respuestas:

29

Los procesos deben tener un padre (PPID). El kernel, a pesar de no ser un proceso real, está elaborando a mano algunos procesos reales, como al menos init, y se da a sí mismo el ID de proceso 0. Dependiendo del sistema operativo, puede o no mostrarse como un proceso en la pssalida, pero siempre se muestra como un PPID:

por ejemplo en 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]
...

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

Tenga en cuenta también que pid 0(y -1otros valores negativos para esa materia) tienen diferentes significados dependiendo de qué función los use kill, forky waitpid.

Finalmente, aunque el initproceso tradicionalmente se da pid #1, este ya no es el caso cuando la virtualización a nivel del sistema operativo se utiliza como zonas de Solaris, ya que puede haber más de una initejecución:

$ 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
fuente
5

Hay dos tareas con ID de proceso especialmente distinguidas: swapper o sched tiene ID de proceso 0 y es responsable de la paginación, como jlliagre en los ejemplos anteriores, y en realidad es parte del núcleo en lugar de un proceso normal en modo de usuario.

El ID de proceso 1 suele ser el proceso de inicio principalmente responsable de iniciar y apagar el sistema. Originalmente, el ID de proceso 1 no estaba reservado específicamente para init por ninguna medida técnica: simplemente tenía este ID como consecuencia natural de ser el primer proceso invocado por el núcleo. Los sistemas Unix más recientes suelen tener componentes de kernel adicionales visibles como 'procesos', en cuyo caso el PID 1 se reserva activamente para el proceso init para mantener la coherencia con los sistemas más antiguos.

curratore
fuente
4

En general, 0 se usa a menudo para significar una 'referencia nula'. Esto significaba que aunque exista el valor 0, es posible que no lo use porque desea que cero signifique un valor especial.

usuario606723
fuente