Creación de procesos:
La forma principal en que se crea un nuevo proceso es a través de la llamada del sistema `Fork ()`. `Fork ()` Crea una copia casi idéntica del proceso de llamada (el proceso * parent *). Tanto el padre como el recién creado proceso * infantil * continúan la ejecución desde el punto de la llamada `fork ()`. La diferencia clave es el valor de retorno de `fork ()`:
* En el proceso principal: `Fork ()` Devuelve la ID del proceso (PID) del proceso infantil. Este PID es un identificador único para el niño.
* En el proceso infantil: `Fork ()` Devuelve 0.
Después de `bife ()`, los procesos de los padres y el hijo generalmente siguen diferentes rutas de ejecución. El proceso infantil a menudo usa la `Exec ()` Family of System Llamadas (`Execl`,` execv`, `execvp`, etc.) para reemplazar su imagen actual con un nuevo programa. `exec ()` sobrescribe el espacio de memoria del niño con el código y los datos del nuevo programa. Si el niño no usa `exec ()`, continúa ejecutando el mismo código que el padre, creando un clon verdadero.
Otras formas en que se crean los procesos incluyen:
* `vfork ()` (menos común y potencialmente problemático): Similar a `Fork ()`, pero con diferencias sutiles en el intercambio de memoria. Generalmente evitado debido a los posibles puntos muertos.
* `clone ()` (más avanzado): Ofrece un control de grano más fino sobre los recursos compartidos entre los procesos de los padres e hijos. Utilizado en bibliotecas y modelos de roscado avanzados.
* Inicialización del sistema: El proceso init (PID 1) es el antepasado de todos los demás procesos en el sistema. Es responsable de iniciar otros procesos durante el arranque.
* `pthread_create ()`: Esta función se utiliza para crear hilos dentro de un proceso. Si bien los hilos comparten el mismo espacio de memoria que su proceso principal, todavía se consideran unidades de ejecución separadas administradas por el núcleo.
Deleción del proceso (terminación):
Un proceso termina (se elimina) en varias circunstancias:
* Terminación normal: El proceso completa su ejecución y llama a la llamada del sistema `Exit ()`. Esto señala el sistema operativo que ha terminado. El estado de salida se puede usar para transmitir el éxito o el fracaso.
* terminación anormal: El proceso se bloquea debido a una falla de segmentación, instrucción ilegal u otro error. El núcleo termina el proceso.
* Terminación de la señal: Otro proceso (o el núcleo en sí) puede enviar una señal (por ejemplo, `Sigterm`,` Sigkill`) a un proceso, forzando su terminación. `Sigterter` permite que el proceso se limpie antes de salir, mientras que` Sigkill` termina inmediatamente el proceso sin ninguna limpieza.
* Terminación del proceso principal: Si un proceso principal termina, los procesos de sus hijos también pueden finalizarse, dependiendo de la configuración del sistema operativo (a menudo heredado del grupo de procesos de los padres). El proceso 'init` generalmente adopta niños huérfanos.
El papel del núcleo:
El núcleo juega un papel crucial en la gestión de procesos a lo largo de su ciclo de vida. Maneja la creación de procesos, la programación, la asignación de memoria, la gestión de recursos, el manejo de señales y la terminación del proceso. El núcleo mantiene estructuras de datos (como la tabla de procesos) para rastrear información sobre cada proceso de ejecución.
En resumen, la creación y eliminación de procesos en UNIX se sienten cuidadosamente orquestados por el núcleo e involucran un conjunto de llamadas de sistema que permiten a los programadores controlar el ciclo de vida del proceso. El `bift ()` y `exec ()` Family (para la creación) y `Exit ()` y las señales (para la eliminación) son los componentes centrales.