Si quieres saber qué es un cambio de contexto a nivel de procesos o de threads, para qué sirve, y como se produce desde el lado del sistema operativo y desde el lado de la CPU, aquí te lo explico todo de forma detallada.
Índice de contenidos
¿Qué es un proceso? ¿qué es un hilo?
Antes de continuar, es importante saber diferenciar entre un proceso y un hilo:
- Proceso: es una instancia en ejecución de un programa o software. Es una entidad activa que sigue una serie de instrucciones secuenciales, accede a recursos del sistema y se comunica con otros procesos. Cada proceso posee su propio espacio de memoria asignado, que incluye el código del programa, datos, pila de ejecución y variables. Los procesos son creados y gestionados por el sistema operativo, el cual asigna recursos como memoria, tiempo de CPU, archivos abiertos y dispositivos de entrada/salida. Cada proceso puede encontrarse en diferentes estados (ejecución, espera, terminado,…). Para que los procesos puedan interactuar entre sí, se utilizan mecanismos como la comunicación interprocesos (IPC). Esto permite el intercambio de datos y la sincronización entre diferentes procesos, facilitando la cooperación y la coordinación en el sistema informático.
- Thread: también llamado hilo, subproceso o hebra, es la unidad más pequeña de procesamiento. Un proceso puede estar compuesto por uno o varios hilos, y cada hilo representa una secuencia de instrucciones que puede ejecutarse de manera independiente dentro del proceso. A diferencia de los procesos, los hilos comparten el mismo espacio de memoria y recursos del proceso al que pertenecen. Esto significa que los hilos pueden acceder a las mismas variables, estructuras de datos y otros recursos del proceso, lo que simplifica la comunicación y sincronización entre ellos. Los hilos son útiles para realizar tareas concurrentes y paralelas, permitiendo que diferentes partes del programa se ejecuten simultáneamente y aumentando así la eficiencia y capacidad de respuesta de la aplicación. Por ejemplo, en una aplicación web, se pueden utilizar hilos para procesar solicitudes de diferentes usuarios de manera concurrente, lo que mejora la velocidad de respuesta del servidor. Sin embargo, es importante tener en cuenta que debido a que los hilos comparten recursos, deben ser coordinados adecuadamente para evitar problemas como condiciones de carrera y bloqueos mutuos. La sincronización y la gestión adecuada de los hilos son tareas cruciales para desarrollar aplicaciones concurrentes de manera segura y eficiente.
En Linux, los threads o hilos son llamados procesos ligeros o LWP (Lightweight process). Además, es importante señalar que los procesos pueden ser gestionados por el sistema operativo, mientras que los hilos no pueden ser creados por el sistema operativo si el propio proceso o programa no está preparado para ello. Por ejemplo, en lenguaje de programación C, se usa la biblioteca pthread.h, y funciones como pthread_create para crearlos. Mientras que a nivel del kernel y los procesos, se pueden usar syscalls como fork(), mientras que la llamada al sistema para los threads es clone() en el caso de Linux. Pueden variar según el SO.
Cambio de contexto de subproceso o hilo | Cambio de contexto de proceso |
---|---|
La CPU guarda el estado actual del hilo (en el TCB) y cambia a otro hilo del mismo proceso. | El planificador del sistema cambia el proceso actual por otro de mayor prioridad y guarda en el PCB el anterior proceso. |
Permite a la CPU procesar varios hilos. | Permite cargar nuevos procesos o programas según la prioridad. |
No implica cambio del espacio de memoria, ya que todos los hilos comparten el mismo espacio del proceso al que pertenecen. | Implica cambio de espacio de memoria, e incluso podría necesitarse descargar un proceso a la memoria virtual si no hay espacio en la RAM. |
La memoria caché del procesador y TLB conservan su estado. | La memoria caché del procesador y el TLB se vacían. |
Implica el cambio de registros y punteros de pila. Es más eficiente, pero aún así podría llevar varios ciclos de reloj. | Es menos eficiente, ya que implica grandes cambios, y puede llevar mayor número de ciclos de reloj, cientos o miles, según la CPU. |
Es un poco más rápido y necesita menos recursos. | Es relativamente más lento y costoso en recursos. |
¿Qué es el IPC?
El IPC (Inter-Process Communication) o Comunicación Interprocesos es un conjunto de mecanismos y técnicas utilizadas por los sistemas operativos para permitir que los procesos que se ejecutan en una computadora se comuniquen y compartan datos entre sí. La IPC es esencial en entornos donde múltiples procesos necesitan cooperar y coordinar sus actividades.
Existen varios mecanismos de IPC, algunos de los cuales son las pipes o tuberías, las colas de mensajes, la memoria compartida, sockets, uso de señales y semáforos.
¿Qué es el PCB?
El PCB (Process Control Block) o Bloque de Control de Proceso es una estructura de datos utilizada por los sistemas operativos para mantener y gestionar la información asociada a cada proceso que se encuentra en ejecución en el sistema.
Cada vez que se crea un proceso, el sistema operativo asigna un PCB en memoria para almacenar toda la información relevante sobre ese proceso. El PCB contiene detalles importantes como:
- ID del proceso
- Estado del proceso (suspendido, en espera,…)
- Información de la CPU (contenido de los registros como el PC)
- Información de memoria (espacio asignado)
- Información de recursos (archivos abiertos, E/S,…)
- Información de planificación (prioridad)
Al igual que hay un PCB, también tenemos el TCB, es decir, el Thread Control Block, que es un espacio de memoria donde se almacenan los estados de los registros durante un cambio de thread.
Cómo se realiza un cambio de contexto
Para conocer mejor cómo se realiza el cambio de contexto, o context switch, vamos a ver el caso de un proceso y de un thread, tanto a nivel de sistema operativo como de CPU:
Cambio de contexto (proceso)
Los pasos para el cambio de contexto cuando hablamos de procesos son los siguientes:
- El proceso actual en ejecución en la CPU llega a un punto en el que necesita ser interrumpido o se produce un evento que requiere un cambio de contexto, como una llamada al sistema o una interrupción de hardware.
- El núcleo del sistema operativo guarda el estado del proceso actual, que incluye los registros de la CPU, el puntero de pila y el contador de programa, en su Bloque de Control de Proceso (PCB). Esto se hace para preservar el estado del proceso y permitir su reanudación en el futuro.
- El núcleo selecciona el siguiente proceso que debe ejecutarse, ya sea de la cola de procesos listos o siguiendo algún algoritmo de planificación. Luego, actualiza el PCB del nuevo proceso seleccionado y lo pone en estado de «en ejecución».
- Se llevan a cabo las tareas necesarias para configurar el entorno del nuevo proceso, como cargar los registros de la CPU y el puntero de pila con los valores almacenados en su PCB.
- El núcleo actualiza las estructuras de memoria, como las tablas de segmentación y las tablas de páginas, para el nuevo proceso.
- Finalmente, se restaura el contexto del nuevo proceso y se le asigna la CPU para que comience su ejecución. El proceso continúa su ejecución desde el punto en el que fue interrumpido anteriormente.
También te puede interesar conocer cómo funciona la memoria RAM y la memoria virtual
Cabe destacar que este ejemplo es una simplificación del proceso real que ocurre en el cambio de contexto. En realidad, hay más tareas y consideraciones involucradas, como la gestión de dispositivos de E/S y otros recursos del sistema. Además, el kernel de un sistema operativo puede implementar diferentes políticas de planificación que determinan cómo se seleccionan los procesos para su ejecución y cómo se distribuye el tiempo de la CPU entre ellos.
Cambio de hilo
Lo que ocurre cuando se produce un cambio de contexto a nivel de hilo en la CPU es:
- Se realizan los procesos necesarios para la rutina que almacena los datos necesarios de los registros y estado del thread anterior en el TCB que estará en la estructura de control dentro de la pila del kernel del sistema operativo, almacenado en la memoria RAM.
- Realización de un proceso de limpieza de la TLB (Translation Lookaside Buffer) cuando sea necesario. Y también se limpiarán otros registros.
- Se selecciona el siguiente hilo que se ejecutará. La elección puede basarse en diversas políticas de planificación, como prioridad, tiempo de espera, algoritmos de colas, entre otros.
- Identificación de situaciones en las que se realiza el cambio entre dos hilos dentro del mismo procesador o entre hilos que pertenecen a dos procesos distintos.
- Procesamiento del nuevo hilo, lo que implica llenar la pipeline con las nuevas instrucciones del hilo actual.
- Una vez termina y se quiere volver al hilo que se estaba ejecutando anteriormente, el sistema operativo recupera el contexto del hilo seleccionado previamente. Esto implica restaurar los registros del procesador, como el contador de programa y otros datos necesarios para que el hilo pueda continuar su ejecución.
- Finalmente, se transfiere el control al hilo seleccionado, permitiéndole continuar su ejecución desde el punto donde fue suspendido.
No olvides dejar tus comentarios…