Guía Hardware
Black Friday Corsair

Cómo se cambia de un proceso a otro: todo sobre el cambio de contexto

Actualizado a: 27 de julio de 2023

Como ya expliqué en el artículo sobre el cambio de un thread o hilo, también es importante retomar este tema de los cambios de contexto pero aplicados a los procesos esta vez. Así tendrás la pieza que faltaba de la información para comprender cómo trabajar la CPU y el sistema operativo codo con codo cuando estás ejecutando software multitarea.

¿Qué es un proceso?

Administrador de Tareas

En informática, un proceso es una instancia en ejecución de un programa o software. Puede considerarse como una entidad activa que realiza una serie de instrucciones secuenciales, accede a recursos del sistema y se comunica con otros procesos. Un proceso tiene su propio espacio de memoria asignado, que incluye el código del programa, datos, pila de ejecución y variables.

Cada proceso se crea y administra por el sistema operativo, el cual asigna recursos como memoria, tiempo de CPU, archivos abiertos y dispositivos de entrada/salida. El sistema operativo también es responsable de programar y coordinar la ejecución de los procesos, garantizando un uso eficiente de los recursos disponibles.

Cada proceso puede tener su propio estado, que puede ser activo (en ejecución), en espera (bloqueado por algún evento), suspendido (temporalmente detenido) o terminado (finalizado). Los procesos pueden comunicarse entre sí a través de mecanismos como la comunicación interprocesos (IPC), que permite el intercambio de datos y la sincronización entre procesos.

¿Qué es el IPC?

IPC (Inter-Process Communication) es un conjunto de mecanismos y técnicas utilizados por los procesos en un sistema operativo para comunicarse y compartir información entre sí. El IPC permite que los procesos se comuniquen y cooperen, ya sea en el mismo equipo o en diferentes equipos conectados en una red.

El IPC es esencial para la programación concurrente y la creación de aplicaciones que requieren interacción y sincronización entre múltiples procesos. Proporciona medios para el intercambio de datos, la sincronización de actividades y la coordinación de tareas entre los procesos.

Existen diferentes mecanismos de IPC disponibles, que incluyen:

  • Colas de mensajes: permiten el envío y recepción de mensajes entre procesos mediante una cola compartida.
  • Memoria compartida: Permite que varios procesos accedan a una región de memoria común, lo que les permite intercambiar datos de forma rápida y eficiente.
  • Sockets: proporcionan una interfaz de red para la comunicación entre procesos en diferentes máquinas a través de TCP/IP u otros protocolos de red.
  • Pipes (tuberías): permiten la comunicación unidireccional entre procesos, donde la salida de un proceso se redirige como entrada al otro proceso.
  • Sincronización: los mecanismos de sincronización, como semáforos, mutex y variables de condición, se utilizan para coordinar el acceso a recursos compartidos y evitar condiciones de carrera entre procesos.

La elección del mecanismo de IPC depende de los requisitos específicos de la aplicación y del entorno en el que se ejecuten los procesos. Cada mecanismo tiene sus propias ventajas y limitaciones en términos de rendimiento, complejidad y seguridad.

El IPC desempeña un papel fundamental en la programación concurrente y la construcción de sistemas distribuidos, ya que permite la comunicación y la colaboración entre procesos, lo que facilita el desarrollo de aplicaciones complejas y la utilización eficiente de los recursos del sistema.

¿Qué es el PCB?

En el contexto de los procesos, PCB (Process Control Block) se refiere a una estructura de datos utilizada por el sistema operativo para mantener información importante sobre un proceso en ejecución. También se conoce como Bloque de Control de Proceso.

El PCB es creado por el sistema operativo cuando se crea un nuevo proceso y se almacena en la memoria principal. Contiene información esencial sobre el estado y la administración del proceso, permitiendo al sistema operativo controlar y gestionar adecuadamente su ejecución.

Algunos de los datos almacenados en el PCB pueden incluir:

  • Identificación del proceso: un identificador único para el proceso, como un número de proceso o un nombre.
  • Estado del proceso: indica si el proceso está en ejecución, en espera, listo para ejecutarse, suspendido o terminado.
  • Información de la administración de memoria: tamaño de la memoria asignada al proceso, dirección base, límites de memoria, tablas de páginas, etc.
  • Información de administración de recursos: lista de archivos abiertos por el proceso, permisos de acceso, descriptores de archivos, etc.
  • Información del planificador: prioridad del proceso, tiempo de CPU utilizado, planificación y asignación de recursos, entre otros.
  • Información de control: datos de contexto del proceso, como los registros de la CPU, punteros de pila, contador de programa, registros de estado, etc.

El PCB se actualiza continuamente por el sistema operativo a medida que el proceso cambia de estado o se produce un cambio de contexto. Cuando un proceso se suspende o se cambia a otro proceso, el sistema operativo guarda el estado actual del proceso en su PCB y carga el estado del próximo proceso a ejecutar.

El PCB es fundamental para la gestión eficiente de los procesos por parte del sistema operativo, permitiendo el control y la coordinación adecuada de los recursos y la programación de la CPU. Cada vez que se realiza una operación de cambio de contexto, el sistema operativo consulta el PCB correspondiente para obtener la información necesaria sobre el proceso en ejecución.

Diferencias entre proceso y thread

Los threads (hilos) y los procesos son dos conceptos importantes en el ámbito de la programación y la ejecución de programas en un sistema operativo. A continuación, se presentan algunas diferencias clave entre threads y procesos:

  • Contexto de ejecución: un proceso tiene su propio contexto de ejecución independiente, que incluye su propio espacio de memoria, registros de CPU, identificador de proceso, archivos abiertos y otros recursos. Por otro lado, los threads comparten el mismo contexto de ejecución dentro de un proceso. Comparten el mismo espacio de memoria, archivos abiertos y otros recursos del proceso padre.
  • Creación y destrucción: los procesos se crean mediante una llamada al sistema operativo y tienen su propio ciclo de vida independiente. Pueden crearse y destruirse de forma independiente, lo que significa que la finalización de un proceso no afecta a otros procesos en ejecución. En cambio, los threads se crean dentro de un proceso existente. Un proceso puede tener múltiples threads, y la creación y destrucción de threads se realiza dentro del contexto del proceso padre.
  • Comunicación y sincronización: los procesos generalmente se comunican y se sincronizan utilizando mecanismos de comunicación interprocesos (IPC), como tuberías, colas de mensajes o memoria compartida. Los threads, al compartir el mismo espacio de memoria, pueden comunicarse y sincronizarse directamente mediante variables compartidas o bloqueos de exclusión mutua.
  • Rendimiento y eficiencia: debido a que los threads comparten recursos y tienen un menor costo de creación y destrucción que los procesos, el cambio entre threads dentro de un proceso es generalmente más rápido y eficiente que el cambio entre procesos. Esto hace que los threads sean adecuados para tareas concurrentes y paralelas que pueden beneficiarse del procesamiento simultáneo y la compartición de recursos.
  • Protección de recursos: los threads comparten el mismo espacio de memoria y recursos dentro de un proceso, lo que significa que deben tener cuidado al acceder y modificar los mismos recursos compartidos. Se requiere una sincronización adecuada para evitar condiciones de carrera y garantizar la consistencia de los datos compartidos. En contraste, los procesos tienen su propio espacio de memoria y recursos, lo que los hace más independientes y menos propensos a conflictos de recursos.

Diferencias entre cambio de contexto de proceso y thread

Cambio de contexto de subproceso o hiloCambio de contexto de proceso
TCS ocurre cuando la CPU guarda el estado actual del hilo y cambia a otro hilo del mismo proceso.PCS ocurre cuando el planificador del sistema operativo guarda el estado actual del programa en ejecución (incluido el estado de la PCB) y cambia a otro programa.
TCS ayuda a la CPU a manejar múltiples subprocesos simultáneamente.PCS implica la carga de los estados del nuevo programa para su ejecución.
TCS no implica el cambio de espacios de direcciones de memoria. Todas las direcciones de memoria que las cuentas del procesador permanecen guardadas.PCS implica el cambio de espacios de direcciones de memoria. Todas las direcciones de memoria que cuenta el procesador se vacían.
La memoria caché del procesador y el búfer de búsqueda de traducción conservan su estado.La memoria caché del procesador y el TLB se vacían.
Aunque TCS implica el cambio de registros y punteros de pila, no permite el costo de cambiar el espacio de direcciones. Por lo tanto, es más eficiente.PCS implica el alto costo de cambiar el espacio de direcciones. Por lo tanto, es menos eficiente.
TCS es un poco más rápido y más barato.PCS es relativamente más lento y costoso.

En el caso de los procesos de un solo hilo, el subproceso en sí mismo representa todo el proceso. Sin embargo, en los procesos con múltiples hilos, es necesario realizar cambios entre diferentes subprocesos para la ejecución del programa:

  • Cambio de hilo: el cambio de hilo implica cambiar de un hilo a otro dentro del mismo proceso. Este tipo de cambio de contexto es altamente eficiente y económico, ya que solo implica cambiar identidades y recursos específicos, como el contador de programa, registros y punteros de pila. El costo de cambiar de un hilo a otro es casi equivalente al costo de entrar y salir del kernel.
  • Cambio de proceso: el cambio de proceso implica cambiar de un proceso a otro. En este caso, se deben cambiar todos los recursos asociados al proceso actual por los recursos necesarios para el nuevo proceso. Esto implica cambiar el espacio de direcciones de memoria, incluyendo las direcciones de memoria, las tablas de páginas y los recursos del kernel, así como las cachés del procesador.

Cómo se realiza un cambio de contexto

Vamos a ver cómo se cambia de contexto en un sistema informático, y para ello, primero tenemos que conocer algunos conceptos:

Mientras en los antiguos procesadores se necesitaban cientos de nanosegundos para cambiar de contexto, en los procesadores más modernos solo se necesitan unos cuantos ns para ello. El impacto de un cambio de contexto depende del procesador, y se puede medir en ciclos de reloj necesarios para ello, siendo en algunos casos de cientos de ellos o hasta de más de mil en otros. Ten en cuenta que el cambio de contexto conlleva un costo adicional debido a la limpieza de la TLB (Translation Lookaside Buffer), el compartimiento de la caché entre múltiples tareas y la ejecución del planificador de tareas, entre otros. El cambio de contexto entre dos hilos del mismo proceso es más rápido que entre dos procesos diferentes, ya que los hilos comparten los mismos mapas de memoria virtual. Debido a esto, no es necesario realizar la limpieza de la TLB…

¿Qué es el cambio de contexto o context switch?

El cambio de contexto, o context switch, es el proceso de guardar el estado de un proceso para su posterior restauración y reanudación, y luego cargar un estado previamente guardado y diferente. Esto permite que varios procesos compartan una única unidad central de procesamiento (CPU) y es una característica fundamental de los sistemas operativos multiprogramación o multitarea. En un sistema de CPU tradicional, cada proceso en ejecución utiliza registros de la CPU para almacenar datos y mantener su estado actual. Sin embargo, en un sistema multitarea, el sistema operativo alterna entre procesos o subprocesos para permitir la ejecución simultánea de múltiples procesos. En cada cambio, el sistema operativo debe guardar el estado del proceso actualmente en ejecución y luego cargar el estado del siguiente proceso que se ejecutará en la CPU. Esta secuencia de operaciones que implica guardar y cargar estados de procesos se conoce como cambio de contexto.

Coste del cambio de contexto: impacto en el rendimiento

Los cambios de contexto suelen requerir una cantidad significativa de recursos de hardware y gran parte del diseño de los sistemas operativos se enfoca en optimizar su uso. Cambiar de un proceso a otro implica realizar diversas tareas de administración, como guardar y cargar registros y mapas de memoria, actualizar tablas y listas, entre otras. La naturaleza exacta de un cambio de contexto depende de la arquitectura del sistema, el sistema operativo y la cantidad de recursos compartidos. Los subprocesos que pertenecen al mismo proceso comparten muchos recursos, a diferencia de procesos no relacionados que no colaboran entre sí.

Por ejemplo, en el kernel de Linux, un cambio de contexto implica cargar el bloque de control de proceso (PCB) correspondiente almacenado en la tabla de PCB en la pila del kernel para obtener información sobre el estado del nuevo proceso. Se cargan datos del estado de la CPU, como registros, puntero de pila y contador del programa, así como información de administración de memoria, como tablas de segmentación y tablas de páginas (a menos que el proceso anterior comparta memoria con el nuevo). Para evitar errores de traducción de direcciones en el caso de que los procesos anteriores y actuales utilicen diferentes espacios de memoria, se debe limpiar el búfer de búsqueda de traducción (TLB). Esto afecta negativamente el rendimiento, ya que después de la mayoría de los cambios de contexto, se pierden todas las referencias de memoria en la TLB, ya que queda vacía.

Además, ocurre un cambio de contexto similar entre subprocesos o hilos de usuario, especialmente en subprocesos verdes, y suele ser muy liviano, guardando y restaurando solo un contexto mínimo. En casos extremos, como cambiar entre rutinas en Go, un cambio de contexto es equivalente al rendimiento de una rutina y es solo marginalmente más costoso que una llamada a una subrutina.

Resumen del proceso

Los pasos involucrados en el cambio de contexto son los siguientes:

  1. Guardar el contexto del proceso que se está ejecutando actualmente en la CPU. Actualizar el bloque de control del proceso y otros campos importantes.
  2. Mover el bloque de control del proceso anterior a la cola correspondiente, como la cola de procesos listos, cola de E/S, etc.
  3. Seleccionar un nuevo proceso para su ejecución.
  4. Actualizar el bloque de control del proceso seleccionado. Esto incluye actualizar el estado del proceso a «en ejecución».
  5. Actualizar las estructuras de datos de gestión de memoria según sea necesario.
  6. Restaurar el contexto del proceso que se estaba ejecutando previamente cuando se carga nuevamente en el procesador. Esto se hace cargando los valores anteriores del bloque de control del proceso y los registros.

Por ejemplo, en el caso de Linux en particular, que es el sistema que mejor conozco, sería:

  1. El proceso actual que se está ejecutando en la CPU llega a un punto en el que debe ser interrumpido o se produce un evento que requiere un cambio de contexto, como una llamada al sistema o una interrupción de hardware.
  2. El kernel del sistema operativo guarda el estado del proceso actual, incluyendo los registros de la CPU, el puntero de pila y el contador del programa, en su bloque de control de proceso (PCB). Esto se realiza para preservar el estado del proceso y permitir su posterior reanudación.
  3. El kernel selecciona el próximo proceso que debe ejecutarse, ya sea de la cola de procesos listos o según algún algoritmo de planificación. Se actualiza el PCB del nuevo proceso seleccionado, estableciendo su estado como en ejecución.
  4. Se realizan 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.
  5. El kernel actualiza las estructuras de memoria, como las tablas de segmentación y las tablas de páginas, para el nuevo proceso.
  6. Finalmente, se restaura el contexto del nuevo proceso y se le asigna la CPU para su ejecución. El proceso continúa su ejecución desde donde se interrumpió anteriormente.

Cabe destacar que este ejemplo es una simplificación del proceso real que ocurre en el cambio de contexto de Linux. 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 Linux implementa 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.

Espero que te haya servido de ayuda, junto con el artículo de cambio de thread… Si te interesan estos tutoriales, puedes ver más aquí.

Jaime Herrera

Jaime Herrera

Ingeniero Informático apasionado por el hardware y la tecnología. Llevo más de diez años dedicándome al análisis de componentes como procesadores, tarjetas gráficas y sistemas de almacenamiento. Mi objetivo es ofrecer información clara y precisa, combinando mi experiencia técnica con un enfoque práctico para ayudar a los lectores a entender mejor el mundo del hardware.

>
Guía Hardware
Logo