Elegir espacio

Dos espacios

¿Qué quieres consultar?

Elige el espacio al que quieres entrar.

Recorrido · SistemasBloque II · Unidad 2.2

Bloque II · Módulo 2 · Unidad 2.2

Procesos, señales, planificación y jobs

Un modelo para relacionar programa, proceso, hilo, parentesco, estados, señales, prioridad y control de trabajos sin confundirlos con servicios.

Antes de empezar#

Ejecutar un programa crea una entidad con contexto: un proceso. Observar un PID solo no basta para saber qué trabajo hace, quién lo creó, qué hijos tiene, si espera, si terminó o si un supervisor lo volverá a crear.

Dependencias. El mapa de proceso/servicio de 1.1, códigos de salida y shell de 1.2, método diagnóstico de 1.3 y descriptores de 2.1.

Alcance. Programa, proceso, hilo, PID/PPID, grupos, sesiones, estados, foreground/background, señales, exit status, zombies, prioridad nice, planificación conceptual, límites y /proc.

Fuera de alcance. Programar fork, exec o handlers; diseñar un scheduler; políticas de tiempo real; cgroups y gestores de servicios en profundidad.

1. Programa, proceso e hilo#

Un programa es código y datos almacenados. Un proceso es una ejecución con:

  • espacio de direcciones y memoria;
  • credenciales;
  • descriptores;
  • PID y relaciones;
  • uno o más hilos;
  • estado y contabilidad de recursos.

exec sustituye el programa que ejecuta un proceso sin cambiar necesariamente su PID. Por eso PID y nombre de ejecutable no son una identidad suficiente para autorizar una acción: el PID puede permanecer durante exec y reutilizarse después de una salida.

Un hilo es una unidad de ejecución dentro de un proceso. Los hilos POSIX comparten dirección y recursos del proceso, aunque el kernel planifica tareas individuales y expone identificadores. Una herramienta puede agregar por proceso o mostrar hilos: hay que leer su contrato.

EntidadQué representaPregunta útil
ProgramaCódigo almacenado.¿Qué binario o script se cargará?
ProcesoInstancia con contexto y recursos.¿Qué ejecuta este PID ahora?
HiloFlujo planificable dentro del proceso.¿Cuántas tareas participan?
JobUnidad de control de una shell.¿Qué pipeline controla esta shell?
ServicioCapacidad operativa gestionada.¿Está disponible la operación?

2. Identidad, parentesco y grupos#

Cada proceso tiene PID y conoce el PID del padre. El parentesco permite razonar sobre creación, herencia y recolección, pero no implica que el padre controle siempre toda la vida del hijo.

Los grupos de procesos permiten actuar sobre un pipeline como unidad. Una sesión agrupa procesos y puede tener una terminal de control. El grupo de foreground recibe ciertas señales generadas por la terminal.

sesión 200, terminal pts/2
├─ grupo 200, foreground: bash PID 200
└─ grupo 240, job:
   ├─ producer PID 240
   ├─ transform PID 241
   └─ writer PID 242

pstree destaca parentesco. ps -o pid,ppid,pgid,sid,tty,state,cmd permite comparar varias identidades. Ninguna salida aislada prueba que un proceso pertenezca al intento correcto: añade tiempo de inicio, argumentos, cgroup, namespace o etiqueta según el entorno.

3. Estados y transiciones#

Los estados de Linux describen qué hace una tarea en el instante observado:

  • R: ejecutándose o preparada para ejecutar;
  • S: espera interrumpible;
  • D: espera no interrumpible, frecuente alrededor de I/O;
  • T: detenida o trazada;
  • Z: terminada, pendiente de recolección.

Otros caracteres y modificadores dependen de la herramienta y versión. Descubre su leyenda con ps --help o man ps.

creada → preparada/ejecutando ↔ espera
                   │            │
                   ├─ stop → detenida ─ cont ─┘
                   └─ salida → zombie → recolección

4. Foreground, background y jobs#

Foreground y background son relaciones con una shell y su terminal, no sinónimos de «visible» y «servicio». Bash asigna jobs a pipelines y usa grupos de procesos para entregar o recuperar el control de la terminal.

  • jobs muestra trabajos conocidos por esa shell;
  • Ctrl+Z suele provocar una señal de parada al grupo de foreground;
  • bg continúa un job sin entregarle foreground;
  • fg lo continúa y le entrega la terminal;
  • & inicia una lista de forma asíncrona desde la shell.

Cerrar la terminal puede producir SIGHUP según shell, job, sesión y configuración. nohup, disown o un supervisor modifican aspectos diferentes; no convierten automáticamente un programa en un servicio bien operado.

5. Señales#

Una señal notifica un evento a un proceso o hilo. kill es una interfaz para enviar señales; el nombre no significa que toda señal mate.

El proceso puede:

  • aceptar la disposición predeterminada;
  • ignorar algunas señales;
  • instalar un handler;
  • bloquear temporalmente su entrega;
  • tener señales pendientes.

SIGKILL y SIGSTOP no pueden capturarse, bloquearse ni ignorarse. Esto los hace contundentes, no apropiados como primer paso. SIGKILL no permite cleanup del proceso y puede dejar trabajo parcial que otros componentes deban reparar.

SeñalIntención frecuenteQué verificar
SIGTERMSolicitar terminación ordenada.Handler, drenaje, salida, hijos y operación.
SIGINTInterrupción interactiva.Disposición del programa; no asumir equivalencia con TERM.
SIGSTOP/SIGCONTDetener o continuar.Estado y efecto sobre timeouts/dependencias.
SIGHUPTerminal cerrada o convención de recarga.Contrato específico del programa.
SIGKILLTerminación forzada del objetivo.Identidad, hijos, supervisor, datos y recuperación.

6. Salida, zombies y recolección#

Al terminar, un proceso produce estado de salida. El kernel conserva una entrada mínima hasta que el padre la recoge mediante una operación de espera. Esa entrada es un zombie: ya no ejecuta código ni conserva su memoria ordinaria.

Un zombie persistente señala que el padre no está recolectando adecuadamente. Enviar otra señal al zombie no hace que ejecute cleanup; hay que entender el padre y su ciclo.

El código de salida observado por una shell puede representar salida normal o terminación por señal según su convención. En un pipeline, recuerda la Unidad 1.2: el estado del pipeline no siempre expone todos los fallos sin configuración o captura explícita.

7. Planificación y prioridad#

El scheduler elige tareas ejecutables. Para cargas ordinarias, el valor nice influye en la prioridad relativa dentro de la política normal. Un valor más alto cede preferencia; no reserva una cuota ni garantiza latencia.

nice inicia con un ajuste; renice modifica procesos existentes sujeto a permisos. Interpreta junto con:

  • número de CPU disponibles;
  • tareas ejecutables;
  • afinidad y límites;
  • política de planificación;
  • cgroups o cuotas;
  • espera de I/O;
  • ventana temporal.

Las políticas de tiempo real y deadlines pueden bloquear trabajo ordinario si se usan mal. Quedan fuera del bloque; no las cambies para «hacer más rápido» un laboratorio inicial.

8. /proc y observación#

/proc expone vistas del estado del kernel. Para un PID:

  • status: estado legible, PPID, UIDs/GIDs, hilos, memoria y máscaras de señales;
  • stat: campos compactos para herramientas;
  • cmdline: argumentos, si son visibles;
  • fd: descriptores;
  • limits: límites de recursos;
  • cgroup: pertenencia de control;
  • task: hilos/tareas.
PreguntaVistaNo demuestra
¿Existe y desde cuándo?ps, start time, /proc/PID/stat.Que sea el proceso esperado sin más identidad.
¿Quién lo creó?PPID y árbol.Que el padre aún gestione su salud.
¿Qué espera?state, wchan, stack cuando sea seguro.Causa final a partir de una instantánea.
¿Qué señal puede recibir?permisos, máscaras y contrato.Que el handler completará a tiempo.

9. Demostración razonada#

Supón que un worker no desaparece cinco segundos después de una solicitud:

estado: D
PPID: supervisor
hijo: Z
grace period: 20 s

No concluyas «TERM está roto». El estado D sugiere espera no interrumpible; el hijo zombie requiere recolección del padre; y todavía no venció el periodo. La siguiente observación debería aclarar operación bloqueada, disposición de señales y contrato del supervisor.

Si se fuerza al worker, el supervisor puede recrearlo y repetir el problema. Verifica árbol, servicio y síntoma original, no solo ausencia del PID anterior.

10. Errores conceptuales frecuentes#

11. Síntesis y dominio#

Un proceso es ejecución con contexto; los hilos son tareas relacionadas; el parentesco explica creación, los grupos permiten control y los jobs pertenecen a una shell. Estados y señales son un protocolo observable, no botones universales.

Has alcanzado el dominio cuando puedes:

  • dibujar PID, PPID, PGID, SID y terminal de un pipeline;
  • interpretar R/S/D/T/Z sin convertir estado en causa;
  • explicar foreground, background y job desde la shell;
  • elegir señal, espera y escalado proporcionados;
  • validar identidad y observar /proc reconociendo carreras y namespaces.

Prácticas relacionadas#

12. Fuentes#