La naturaleza de los estados de procesos
Los estados de procesos son una representación cuantitativa que el sistema operativo utiliza para describir fases de ejecución. Esta clasificación existe tanto a nivel lógico como físico.
Representación en el PCB
El Bloque de Control de Procesos (PCB) contiene un campo crítico que registra el estado actual. Durante la creación, planificación o terminación de procesos, el sistema operativo actualiza este campo prioritariamente.
Implementación en el kernel
El kernel de Linux define los estados mediente constantes en include/linux/sched.h:
#define TASK_ACTIVO 0
#define TASK_INTERRUMPIBLE 1
#define TASK_NO_INTERRUMPIBLE 2
#define __TASK_DETENIDO 4
#define __TASK_RASTREADO 8
#define EXIT_ZOMBI 16
#define EXIT_MUERTO 32
Estos valores enteros se almacenan en el campo state de task_struct. Por ejemplo, al esperar entrada de teclado, un proceso se marca como TASK_INTERRUMPIBLE.
Estados fundamentales
Ejecución (Activo)
Incluye dos situaciones:
- Ejecutándose actualmente en CPU
- En cola de preparados, esperando asignación de CPU
Bloqueado
Ocurrre cuando un proceso espera recursos no-CPU como E/S de disco o semáforos. El proceso libera la CPU hasta que el recurso está disponible.
Semáforos
Contadores que gestionan acceso a recursos compartidos. Si un semáforo está en 0, los procesos solicitantes se bloquean hasta su liberación.
Diferencia clave: Preparado vs Bloqueado
| Estado | Recurso faltante | Ejecutable inmediato |
|---|---|---|
| Preparado | Solo CPU | Sí |
| Bloqueado | Recursos no-CPU | No |
Ejemplo de bloqueo
#include <stdio.h>
int main() {
int valor;
printf("Ingrese un número: ");
scanf("%d", &valor); // Bloqueo hasta entrada
printf("Cuadrado: %d\n", valor * valor);
return 0;
}
Al ejecutar scanf(), el proceso entra en estado bloqueado y se mueve a la cola de espera del teclado.
Suspendido
Cuando la memoria física es insuficiente, el sistema intercambia procesos a la partición swap del disco. Existen dos variantes:
- Preparado suspendido
- Bloqueado suspendido
Los sistemas modernos priorizan suspander procesos bloqueados para minimizar impacto en el rendimiento.
Ejemplo de suspensión
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Esperando operación E/S...\n");
sleep(120); // Simula E/S lenta
while(1) {
int* bloque = malloc(1048576); // 1MB
if (!bloque) {
perror("Error de asignación");
break;
}
}
return 0;
}
La combinación de E/S prolongada y consumo intensivo de memoria puede desencadenar suspensión.
Estados específicos en Linux
Visualizables mediante ps o top en la columna STAT:
ps -o pid,stat,cmd -p [PID]
R (Activo/Preparado)
Incluye procesos ejecutándose o esperando CPU. En sistemas multinúcleo, múltiples procesos pueden mostrar estado R simultáneamente.
S (Dormido interrumpible)
Procesos esperando recursos, cancelables con señales. Ejemplo: sleep.
D (Dormido no interrumpible)
Usado en operaciones críticas de disco. No responde a señales para evitar corrupción de datos.
T (Detenido)
Proceso pausado por señal SIGSTOP, reanudable con SIGCONT.
t (Detenido por depuración)
Pausado por un depurador como GDB durante puntos de interrupción.
Z (Zombie)
Proceso terminado cuyo PCB permanece hasta que el padre lee su estado de salida. Su acumulación consume recursos del sistema.
X (Terminado)
Estado final tras liberación completa de recursos. Raramente visible por su brevedad.
Procesos huérfanos
Cuando el proceso padre termina primero, el kernel reasigna estos procesos a init (PID 1) para garantizar su correcta liberación.
Transiciones de estado
La conmutación implica:
- Actualizar el campo
stateentask_struct - Mover el PCB entre colas (ej: de bloqueados a preparados)
La lentitud del sistema suele deberse a retrasos en estas transiciones, especialmente por intercambio intensivo en swap o contención de CPU.