Semáforo vs. Mutex

Introducción

Un proceso de Sistema Operativo (SO) interactúa con otros procesos que se ejecutan en el mismo sistema para completar una tarea común. Los procesos que interactúan con otros procesos se conocen como procesos cooperativos.

Basado en las estrategias de Comunicación entre Procesos (IPC) implementadas por un proceso, puede compartir su espacio de direcciones con otros procesos o comunicarse a través del intercambio de mensajes. En la primera técnica, es fundamental controlar la comunicación, ya que ambos procesos comparten un espacio de direcciones común.

Este control de la comunicación de procesos se conoce como sincronización. Sin una sincronización adecuada, los procesos pueden leer datos obsoletos o sobrescribir otros datos de proceso.

Semáforo y mutex son dos mecanismos a través de los cuales podemos implementar la sincronización y gestionar la coordinación de procesos. En este artículo, analizaremos estas dos utilidades de sincronización y compararemos varias características.

Entendiendo la Sección Crítica

Antes de discutir el semáforo y el mutex, entendamos el problema de la sección crítica.

Supongamos que tenemos un sistema que contiene n procesos. Cada uno de estos procesos tiene un segmento de código en el que el proceso puede realizar una actualización de variable común, una actualización de tabla o escribir en un archivo. Este segmento de código se conoce como la sección crítica de un proceso.

2.1. Características de un problema de Sección Crítica

La característica esencial de la sección crítica es que una vez que un proceso comienza a ejecutar su sección crítica, a ningún otro proceso se le permite ejecutar su sección crítica. Es decir, no hay dos procesos que puedan ejecutar su sección crítica simultáneamente. Este problema crítico de sección es diseñar un protocolo para que los procesos puedan usar la cooperación.

Cada proceso necesita obtener permiso para entrar en su sección crítica. El código que implementa el permiso se conoce como sección de entrada. De manera similar, la pieza de código que implementa la salida de la sección crítica se conoce como sección de salida.

2.2. Criterios de un problema de Sección Crítica

La solución de un problema de sección crítica debe satisfacer los siguientes criterios:

  • Exclusión mutua: Si un proceso está ejecutando su sección crítica, entonces ningún otro proceso puede ejecutar su sección crítica
  • Progreso: Si ningún proceso está ejecutando su sección crítica, entonces otros procesos pueden decidir ejecutar su sección crítica. En función de la solución y la implementación, se selecciona un proceso que puede ejecutar su sección crítica. Las características notables son que los procesos tienen la capacidad de proceder a un proceso de selección para ejecutar su sección crítica
  • Espera limitada: Debe haber una espera limitada para un proceso cuando ha solicitado su sección de entrada de sección crítica y el número de veces que otro proceso ejecuta su sección crítica

Bloqueos Mutex

Hay varias utilidades para resolver el problema de la sección crítica en un sistema operativo. Los bloqueos de exclusión mutua (mutex) o el mutex es la solución más simple. Utilizamos las cerraduras mutex para proteger la sección crítica y evitar las condiciones de carrera. Un proceso necesita adquirir la cerradura antes de acceder a su sección crítica, y libera la cerradura una vez que finaliza la ejecución de la sección crítica.

3.1. ¿Cómo funciona un bloqueo Mutex?

Estas dos funcionalidades para adquirir y liberar bloqueos se representan a través de dos funciones: acquire() y release(). La función de adquisición adquiere la cerradura, y la liberación libera la cerradura. Un bloqueo mutex tiene una variable booleana que decide si el bloqueo está disponible o no. Si el bloqueo está disponible, el método acquire() tiene éxito y el bloqueo se considera no disponible. Cualquier proceso que intente acceder a un bloqueo no disponible se bloqueará hasta que se libere el bloqueo.

El siguiente pseudocódigo muestra el método acquire() :

Renderizado por QuickLaTeX.com

El siguiente pseudocódigo muestra el método release() :

Renderizado por QuickLaTeX.com

3.2. Desventajas de Mutexes

El mayor inconveniente de un bloqueo mutex es que permite que el bloqueo de hilo gire si el bloqueo no está disponible.

Mientras un hilo ha adquirido el bloqueo y está en su sección crítica, todos los demás hilos que intentan adquirir el bloqueo están en un bucle donde el hilo comprueba periódicamente si el bloqueo está disponible. Por lo tanto, gira para el bloqueo y desperdicia ciclos de CPU que podrían haber sido utilizados por otros subprocesos de forma productiva.

Este es un problema importante en una sola máquina CPU. Spinlock también se conoce como espera ocupada, ya que el hilo está «ocupado» esperando el bloqueo.

3.3. Ventajas de Mutexes

Aunque los bloqueos mutex sufren el problema de los spinlock, tienen una ventaja. A medida que el proceso se bloquea en la CPU, elimina la necesidad de cambiar el contexto del proceso, que de otro modo habría requerido.

El cambio de contexto de un proceso es una operación que requiere mucho tiempo, ya que requiere guardar estadísticas de proceso de ejecución en el Bloque de Control de Proceso (PCB) y recargar otro proceso en la CPU. Hay CPU de varios procesadores en las que un proceso puede girar en un núcleo de procesador y otro puede ejecutar su sección crítica. Por lo tanto, un spinlock de corta duración en algunos escenarios es más útil que un cambio de contexto de proceso.

Semáforo

Un semáforo es otra utilidad que también proporciona características de sincronización similares a los bloqueos mutex, pero es más robusto y sofisticado.

Un semáforo es una variable entera a la que, aparte de la inicialización, se accede a través de dos operaciones atómicas estándar: wait() y signal(). La operación wait() se denomina P, y la operación signal() se denomina V.

Echemos un vistazo a la operación wait() :

Renderizado por QuickLaTeX.com

Finalmente, veamos la operación signal() :

Renderizado por QuickLaTeX.com

!

Todas las operaciones al valor entero del semáforo en wait() y signal() ejecutadas atómicamente. Es decir, una vez que un proceso modifica el valor del semáforo, ningún otro proceso puede modificar simultáneamente el mismo valor del semáforo.

Basado en el valor del semáforo S, se clasifica en dos categorías: semáforo de conteo y semáforo binario. El valor de un semáforo de conteo puede variar entre 0 y un valor finito. Considerando que, el valor de un semáforo binario puede estar entre 0 y 1.

4.1. Contar semáforos

Contar semáforos puede controlar el N número de instancias de un recurso dado. Expliquemos el semáforo de conteo con una analogía.

Supongamos que existe una biblioteca con tres salas de estudio, y hay un bibliotecario que tiene diez llaves, cada una para una habitación diferente. Una vez que un lector requiere acceso a una habitación, necesita obtener una llave para usar la habitación. Una vez que el lector ha terminado con su uso, devuelve la llave de la habitación al bibliotecario. Una vez que todas las habitaciones están en uso, un nuevo lector debe esperar hasta que un lector existente desocupe una habitación.

En el ejemplo anterior, el recurso es una habitación, y hay diez instancias de ella. Estas instancias se gestionan a través de un semáforo de conteo que se inicializa con diez. Este valor de semáforo se controla a través de los métodos wait() y signal() del semáforo. El siguiente diagrama ilustra esto:

4.2. Semáforos binarios

Un semáforo binario tiene dos valores posibles, 0 y 1. Si el recurso administrado por el semáforo está disponible, el valor del semáforo es 1. De lo contrario, se establece en 0, lo que indica que el recurso no está disponible.

Un semáforo binario tiene la misma funcionalidad que un bloqueo mutex. Los sistemas que no admiten bloqueos mutex pueden aprovechar semáforos binarios para lograr la misma funcionalidad.

el siguiente diagrama ilustra El semáforo binario:

Semáforo frente Mutex

La siguiente tabla resume las características importantes de los bloqueos de semáforos y mutex:

Renderizado por QuickLaTeX.com

Conclusión

En este artículo, discutimos varios aspectos de mutexes y semáforos.

En primer lugar, discutimos la sección crítica y la necesidad de un mutex o semáforo para controlar la ejecución de la sección crítica. Luego hablamos de mutex y semáforo.

Por último, proporcionamos una comparación de semáforos y mutex.

Si tiene algunos años de experiencia en Ciencias de la Computación o investigación, y está interesado en compartir esa experiencia con la comunidad, eche un vistazo a nuestras Pautas de Contribución.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.