Concurrencia en Python - Subprocesos

En general, como sabemos, el hilo es una cuerda retorcida muy delgada, generalmente de tela de algodón o seda y se usa para coser ropa y demás. El mismo término hilo también se utiliza en el mundo de la programación informática. Ahora bien, ¿cómo relacionamos el hilo utilizado para coser ropa y el hilo utilizado para la programación de computadoras? Los roles desempeñados por los dos hilos son similares aquí. En la ropa, el hilo sujeta la tela y, por el otro lado, en la programación de computadoras, el hilo sujeta el programa de computadora y permite que el programa ejecute acciones secuenciales o muchas acciones a la vez.

Threades la unidad de ejecución más pequeña en un sistema operativo. No es en sí mismo un programa, sino que se ejecuta dentro de un programa. En otras palabras, los hilos no son independientes entre sí y comparten la sección de código, la sección de datos, etc. con otros hilos. Estos subprocesos también se conocen como procesos ligeros.

Estados de hilo

Para comprender la funcionalidad de los subprocesos en profundidad, necesitamos aprender sobre el ciclo de vida de los subprocesos o los diferentes estados de los subprocesos. Normalmente, un hilo puede existir en cinco estados distintos. Los diferentes estados se muestran a continuación:

Nuevo hilo

Un nuevo hilo comienza su ciclo de vida en el nuevo estado. Sin embargo, en esta etapa, aún no ha comenzado y no se le han asignado recursos. Podemos decir que es solo una instancia de un objeto.

Runnable

Cuando se inicia el subproceso recién nacido, el subproceso se vuelve ejecutable, es decir, a la espera de ejecutarse. En este estado, tiene todos los recursos, pero el programador de tareas aún no lo ha programado para ejecutarse.

Corriendo

En este estado, el subproceso avanza y ejecuta la tarea, que ha sido elegida por el programador de tareas para ejecutar. Ahora, el hilo puede ir al estado muerto o al estado no ejecutable / en espera.

No corriendo / esperando

En este estado, el hilo está en pausa porque está esperando la respuesta de alguna solicitud de E / S o esperando la finalización de la ejecución de otro hilo.

Muerto

Un subproceso ejecutable entra en el estado terminado cuando completa su tarea o termina.

El siguiente diagrama muestra el ciclo de vida completo de un hilo:

Tipos de hilo

En esta sección, veremos los diferentes tipos de hilo. Los tipos se describen a continuación:

Hilos de nivel de usuario

Estos son hilos administrados por el usuario.

En este caso, el kernel de administración de subprocesos no es consciente de la existencia de subprocesos. La biblioteca de subprocesos contiene código para crear y destruir subprocesos, para pasar mensajes y datos entre subprocesos, para programar la ejecución de subprocesos y para guardar y restaurar contextos de subprocesos. La aplicación comienza con un solo hilo.

Los ejemplos de subprocesos a nivel de usuario son:

  • Hilos de Java
  • Hilos POSIX

Ventajas de los hilos a nivel de usuario

A continuación se muestran las diferentes ventajas de los hilos a nivel de usuario:

  • La conmutación de subprocesos no requiere privilegios de modo Kernel.
  • El hilo de nivel de usuario puede ejecutarse en cualquier sistema operativo.
  • La programación puede ser específica de la aplicación en el subproceso de nivel de usuario.
  • Los hilos de nivel de usuario son rápidos de crear y administrar.

Desventajas de los hilos de nivel de usuario

A continuación se muestran las diferentes desventajas de los hilos a nivel de usuario:

  • En un sistema operativo típico, la mayoría de las llamadas al sistema se bloquean.
  • La aplicación multiproceso no puede aprovechar el multiprocesamiento.

Hilos de nivel de kernel

Los subprocesos administrados por el sistema operativo actúan sobre el kernel, que es un núcleo del sistema operativo.

En este caso, el Kernel gestiona los hilos. No hay código de gestión de subprocesos en el área de la aplicación. Los subprocesos del kernel son compatibles directamente con el sistema operativo. Cualquier aplicación puede programarse para ser multiproceso. Todos los subprocesos de una aplicación se admiten en un solo proceso.

El Kernel mantiene información de contexto para el proceso en su conjunto y para subprocesos individuales dentro del proceso. La programación por parte del núcleo se realiza por subprocesos. El Kernel realiza la creación, programación y administración de hilos en el espacio del Kernel. Los subprocesos del núcleo son generalmente más lentos de crear y administrar que los subprocesos del usuario. Los ejemplos de subprocesos a nivel de kernel son Windows, Solaris.

Ventajas de los subprocesos a nivel de kernel

A continuación se muestran las diferentes ventajas de los subprocesos a nivel de kernel:

  • Kernel puede programar simultáneamente varios subprocesos del mismo proceso en varios procesos.

  • Si un hilo en un proceso está bloqueado, el Kernel puede programar otro hilo del mismo proceso.

  • Las propias rutinas del kernel pueden ser multiproceso.

Desventajas de los subprocesos de nivel de kernel

  • Los subprocesos del núcleo son generalmente más lentos de crear y administrar que los subprocesos del usuario.

  • La transferencia de control de un hilo a otro dentro del mismo proceso requiere un cambio de modo al Kernel.

Bloque de control de hilo - TCB

Thread Control Block (TCB) se puede definir como la estructura de datos en el núcleo del sistema operativo que contiene principalmente información sobre el hilo. La información específica del hilo almacenada en TCB destacaría información importante sobre cada proceso.

Considere los siguientes puntos relacionados con los hilos contenidos en TCB:

  • Thread identification - Es el ID de hilo único (tid) asignado a cada hilo nuevo.

  • Thread state - Contiene la información relacionada con el estado (Ejecutando, Ejecutable, No Ejecutando, Muerto) del hilo.

  • Program Counter (PC) - Apunta a la instrucción del programa actual del hilo.

  • Register set - Contiene los valores de registro del hilo que se les asignaron para los cálculos.

  • Stack Pointer- Apunta a la pila del hilo en el proceso. Contiene las variables locales bajo el alcance del hilo.

  • Pointer to PCB - Contiene el puntero al proceso que creó ese hilo.

Relación entre proceso e hilo

En multiproceso, proceso e hilo son dos términos muy relacionados que tienen el mismo objetivo de hacer que la computadora pueda hacer más de una cosa a la vez. Un proceso puede contener uno o más subprocesos, pero por el contrario, el subproceso no puede contener un proceso. Sin embargo, ambos siguen siendo las dos unidades básicas de ejecución. Un programa, que ejecuta una serie de instrucciones, inicia el proceso y el hilo de ambos.

La siguiente tabla muestra la comparación entre proceso y subproceso:

Proceso Hilo
El proceso es pesado o requiere muchos recursos. El hilo es ligero y requiere menos recursos que un proceso.
La conmutación de procesos necesita interacción con el sistema operativo. El cambio de hilo no necesita interactuar con el sistema operativo.
En varios entornos de procesamiento, cada proceso ejecuta el mismo código pero tiene su propia memoria y recursos de archivo. Todos los hilos pueden compartir el mismo conjunto de archivos abiertos, procesos secundarios.
Si un proceso está bloqueado, ningún otro proceso puede ejecutarse hasta que se desbloquee el primer proceso. Mientras un hilo está bloqueado y esperando, se puede ejecutar un segundo hilo en la misma tarea.
Múltiples procesos sin usar subprocesos consumen más recursos. Los procesos de varios subprocesos utilizan menos recursos.
En múltiples procesos, cada proceso opera independientemente de los demás. Un hilo puede leer, escribir o cambiar los datos de otro hilo.
Si hubiera algún cambio en el proceso principal, no afectará a los procesos secundarios. Si hubiera algún cambio en el hilo principal, puede afectar el comportamiento de otros hilos de ese proceso.
Para comunicarse con procesos hermanos, los procesos deben utilizar la comunicación entre procesos. Los subprocesos pueden comunicarse directamente con otros subprocesos de ese proceso.

Concepto de multiproceso

Como hemos comentado anteriormente, el subproceso múltiple es la capacidad de una CPU para administrar el uso del sistema operativo mediante la ejecución de varios subprocesos al mismo tiempo. La idea principal del subproceso múltiple es lograr el paralelismo dividiendo un proceso en varios subprocesos. De una manera más sencilla, podemos decir que el multithreading es la forma de lograr multitarea utilizando el concepto de threads.

El concepto de multiproceso se puede entender con la ayuda del siguiente ejemplo.

Ejemplo

Supongamos que estamos ejecutando un proceso. El proceso podría consistir en abrir MS Word para escribir algo. En tal proceso, se asignará un hilo para abrir MS Word y se requerirá otro hilo para escribir. Ahora, supongamos que si queremos editar algo, se requerirá otro hilo para realizar la tarea de edición y así sucesivamente.

El siguiente diagrama nos ayuda a comprender cómo existen varios subprocesos en la memoria:

Podemos ver en el diagrama anterior que puede existir más de un hilo dentro de un proceso donde cada hilo contiene su propio conjunto de registros y variables locales. Aparte de eso, todos los subprocesos de un proceso comparten variables globales.

Ventajas del multiproceso

Veamos ahora algunas ventajas del multihilo. Las ventajas son las siguientes:

  • Speed of communication - El subproceso múltiple mejora la velocidad de cálculo porque cada núcleo o procesador maneja subprocesos separados al mismo tiempo.

  • Program remains responsive - Permite que un programa siga respondiendo porque un hilo espera la entrada y otro ejecuta una GUI al mismo tiempo.

  • Access to global variables - En multiproceso, todos los subprocesos de un proceso en particular pueden acceder a las variables globales y si hay algún cambio en la variable global, también es visible para otros subprocesos.

  • Utilization of resources - La ejecución de varios subprocesos en cada programa hace un mejor uso de la CPU y el tiempo de inactividad de la CPU se reduce.

  • Sharing of data - No se requiere espacio adicional para cada hilo porque los hilos dentro de un programa pueden compartir los mismos datos.

Contras de multiproceso

Veamos ahora algunas desventajas del multihilo. Las desventajas son las siguientes:

  • Not suitable for single processor system - El subproceso múltiple tiene dificultades para lograr un rendimiento en términos de velocidad de cálculo en un sistema de un solo procesador en comparación con el rendimiento en un sistema multiprocesador.

  • Issue of security - Como sabemos que todos los hilos dentro de un programa comparten los mismos datos, siempre existe un problema de seguridad porque cualquier hilo desconocido puede cambiar los datos.

  • Increase in complexity - El subproceso múltiple puede aumentar la complejidad del programa y la depuración se vuelve difícil.

  • Lead to deadlock state - El subproceso múltiple puede llevar al programa a un riesgo potencial de alcanzar el estado de interbloqueo.

  • Synchronization required- Se requiere sincronización para evitar la exclusión mutua. Esto conduce a una mayor utilización de la memoria y la CPU.