Estados de Procesos en Linux

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
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:

  1. Actualizar el campo state en task_struct
  2. 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.

Etiquetas: linux Estados_de_Procesos Kernel PCB semáforos

Publicado el 7-27 14:57