logo

Mutex vs semáforo

Según la terminología del sistema operativo, mutex y semáforos son recursos del núcleo que brindan servicios de sincronización, también llamados primitivas de sincronización . La sincronización de procesos juega un papel importante en el mantenimiento de la coherencia de los datos compartidos. Tanto las soluciones de software como de hardware están presentes para manejar problemas de secciones críticas. Pero las soluciones de hardware para problemas de secciones críticas son bastante difíciles de implementar. Mutex y semaphore brindan servicios de sincronización, pero no son lo mismo.

¿Qué es Mutex?

Mutex es un objeto de exclusión mutua que sincroniza el acceso a un recurso. Se crea con un nombre único al inicio de un programa. El mecanismo de bloqueo mutex garantiza que solo un subproceso pueda adquirir el mutex e ingresar a la sección crítica. Este hilo solo libera el mutex cuando sale en la sección crítica.

Mutex vs semáforo

Es un tipo especial de semáforo binario que se utiliza para controlar el acceso al recurso compartido. Incluye un mecanismo de herencia de prioridad para evitar problemas de inversión de prioridad extendida. Permite que las tareas actuales de mayor prioridad se mantengan en estado bloqueado durante el menor tiempo posible. Sin embargo, la herencia de prioridad no corrige la inversión de prioridad sino que sólo minimiza su efecto.

Ejemplo

Esto se muestra con la ayuda del siguiente ejemplo,

 wait (mutex); ..... Critical Section ..... signal (mutex); 

Uso de exclusión mutua

Un mutex proporciona exclusión mutua, ya sea productor o consumidor que puede tener la clave (mutex) y continuar con su trabajo. Mientras el productor llene el búfer, el usuario deberá esperar y viceversa. En el bloqueo Mutex, todo el tiempo, solo un subproceso puede funcionar con todo el búfer.

Cuando se inicia un programa, solicita al sistema que cree un objeto mutex para un recurso determinado. El sistema crea el objeto mutex con un nombre o ID único. Siempre que el hilo del programa quiere utilizar el recurso, ocupa el bloqueo del objeto mutex, utiliza el recurso y, después de su uso, libera el bloqueo del objeto mutex. Luego, se permite que el siguiente proceso adquiera el bloqueo en el objeto mutex.

Mientras tanto, un proceso ha adquirido el bloqueo en el objeto mutex y ningún otro hilo o proceso puede acceder a ese recurso. Si el objeto mutex ya está bloqueado, el proceso que desea adquirir el bloqueo en el objeto mutex tiene que esperar y el sistema lo pone en cola hasta que se desbloquea el objeto mutex.

Ventajas de Mutex

Estas son las siguientes ventajas del mutex, tales como:

  • Mutex son simplemente bloqueos que se obtienen antes de ingresar a su sección crítica y luego liberarla.
  • Dado que solo hay un subproceso en su sección crítica en un momento dado, no hay condiciones de carrera y los datos siempre permanecen consistentes.

Desventajas de Mutex

Mutex también tiene algunas desventajas, tales como:

  • Si un subproceso obtiene un bloqueo y se pone en suspensión o se le adelanta, es posible que el otro subproceso no avance. Esto puede provocar hambruna.
  • No se puede bloquear ni desbloquear desde un contexto diferente al que lo adquirió.
  • Sólo se debe permitir un hilo en la sección crítica a la vez.
  • La implementación normal puede provocar un estado de espera ocupado, lo que desperdicia tiempo de CPU.

¿Qué es el semáforo?

El semáforo es simplemente una variable que no es negativa y se comparte entre subprocesos. Un semáforo es un mecanismo de señalización y otro hilo puede señalar a un hilo que está esperando en un semáforo.

Mutex vs semáforo

Un semáforo utiliza dos operaciones atómicas,

1. Espera: La operación de espera disminuye el valor de su argumento S si es positivo. Si S es negativo o cero, entonces no se realiza ninguna operación.

 wait(S) { while (S<=0); s--; } < pre> <p> <strong>2. Signal for the process synchronization:</strong> The signal operation increments the value of its argument S.</p> <pre> signal(S) { S++; } </pre> <p>A semaphore either allows or reject access to the resource, depending on how it is set up.</p> <h3>Use of Semaphore</h3> <p>In the case of a single buffer, we can separate the 4 KB buffer into four buffers of 1 KB. Semaphore can be associated with these four buffers, allowing users and producers to work on different buffers simultaneously.</p> <h3>Types of Semaphore</h3> <p>Semaphore is distinguished by the operating system in two categories <strong>Counting semaphore</strong> and <strong>Binary semaphore</strong> .</p> <p> <strong>1. Counting Semaphore:</strong> The semaphore S value is initialized to the <strong>number of resources</strong> present in the system. Whenever a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and <strong>decrements</strong> the semaphore value by one. When it releases the resource, it performs <strong>the signal()</strong> operation on the semaphore and <strong>increments</strong> the semaphore value by one.</p> <p>When the semaphore count goes to 0, it means the processes occupy all resources. A process needs to use a resource when the semaphore count is 0. It executes the <strong>wait()</strong> operation and gets <strong>blocked</strong> until the semaphore value becomes greater than 0.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-3.webp" alt="Mutex vs Semaphore"> <p> <strong>2. Binary semaphore:</strong> The value of a semaphore ranges between <strong>0</strong> and <strong>1</strong> . It is similar to mutex lock, but mutex is a locking mechanism, whereas the semaphore is a signaling mechanism. In binary semaphore, if a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and decrements the value of the semaphore from 1 to 0. When it releases the resource, it performs a <strong>signal</strong> <strong>()</strong> operation on the semaphore and increments its value to 1. Suppose the value of the semaphore is 0 and a process wants to access the resource. In that case, it performs <strong>wait()</strong> operation and block itself till the current process utilizing the resources releases the resource.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-4.webp" alt="Mutex vs Semaphore"> <h3>Advantages of Semaphore</h3> <p>Here are the following advantages of semaphore, such as:</p> <ul> <li>It allows more than one thread to access the critical section.</li> <li>Semaphores are machine-independent.</li> <li>Semaphores are implemented in the machine-independent code of the microkernel.</li> <li>They do not allow multiple processes to enter the critical section.</li> <li>As there is busy and waiting in semaphore, there is never wastage of process time and resources.</li> <li>They are machine-independent, which should be run in the machine-independent code of the microkernel.</li> <li>They allow flexible management of resources.</li> </ul> <h3>Disadvantage of Semaphores</h3> <p>Semaphores also have some disadvantages, such as:</p> <ul> <li>One of the biggest limitations of a semaphore is priority inversion.</li> <li>The operating system has to keep track of all calls to wait and signal semaphore.</li> <li>Their use is never enforced, but it is by convention only.</li> <li>The Wait and Signal operations require to be executed in the correct order to avoid deadlocks in semaphore.</li> <li>Semaphore programming is a complex method, so there are chances of not achieving mutual exclusion.</li> <li>It is also not a practical method for large scale use as their use leads to loss of modularity.</li> <li>Semaphore is more prone to programmer error</li> <li>, and it may cause deadlock or violation of mutual exclusion due to programmer error.</li> </ul> <h3>Difference between Mutex and Semaphore</h3> <p>The basic difference between semaphore and mutex is that semaphore is a signalling mechanism, i.e. processes perform wait() and signal() operation to indicate whether they are acquiring or releasing the resource. In contrast, a mutex is a locking mechanism, and the process has to acquire the lock on a mutex object if it wants to acquire the resource. Here are some more differences between semaphore and mutex, such as:</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-5.webp" alt="Mutex vs Semaphore"> <br> <table class="table"> <tr> <th>Terms</th> <th>Mutex</th> <th>Semaphore</th> </tr> <tr> <td>Definition</td> <td>The mutex is a locking mechanism, as to acquire a resource, a process needs to lock the mutex object, and while releasing a resource process has to unlock the mutex object.</td> <td>Semaphore is a signalling mechanism as wait() and signal() operations performed on the semaphore variable indicate whether a process is acquiring or releasing the resource.</td> </tr> <tr> <td>Existence</td> <td>A mutex is an object.</td> <td>Semaphore is an integer variable.</td> </tr> <tr> <td>Function</td> <td>Mutex allows multiple program threads to access a single resource but not simultaneously.</td> <td>Semaphore allows multiple program threads to access a finite instance of resources.</td> </tr> <tr> <td>Ownership</td> <td>Mutex object lock is released only by the process that has acquired the lock on the mutex object.</td> <td>Semaphore value can be changed by any process acquiring or releasing the resource by performing wait() and signal() operation.</td> </tr> <tr> <td>Categorize</td> <td>Mutex is not categorized further.</td> <td>The semaphore can be categorized into counting semaphore and binary semaphore.</td> </tr> <tr> <td>Operation</td> <td>The mutex object is locked or unlocked by the process of requesting or releasing the resource.</td> <td>Semaphore value is modified using wait() and signal() operation apart from initialization.</td> </tr> <tr> <td>Resources Occupied</td> <td>If a mutex object is already locked, then the process desiring to acquire resource waits and get queued by the system till the resource is released and the mutex object gets unlocked.</td> <td>Suppose the process acquires all the resources, and no resource is free. In that case, the process desiring to acquire resource performs wait() operation on semaphore variable and blocks itself till the count of semaphore become greater than 0.</td> </tr> </table> <hr></=0);>

Un semáforo permite o rechaza el acceso al recurso, dependiendo de cómo esté configurado.

Uso del semáforo

En el caso de un único buffer, podemos separar el buffer de 4 KB en cuatro buffers de 1 KB. Semaphore se puede asociar con estos cuatro buffers, lo que permite a los usuarios y productores trabajar en diferentes buffers simultáneamente.

Tipos de semáforo

Semaphore distingue el sistema operativo en dos categorías Contando semáforo y Semáforo binario .

1. Contando semáforo: El valor S del semáforo se inicializa al número de recursos presente en el sistema. Siempre que un proceso quiere acceder al recurso, realiza la espera() operación en el semáforo y decrementos el valor del semáforo en uno. Cuando libera el recurso, realiza la señal() operación en el semáforo y incrementos el valor del semáforo en uno.

Cuando el recuento del semáforo llega a 0, significa que los procesos ocupan todos los recursos. Un proceso necesita utilizar un recurso cuando el recuento de semáforos es 0. Ejecuta el esperar() operación y obtiene obstruido hasta que el valor del semáforo sea mayor que 0.

Mutex vs semáforo

2. Semáforo binario: El valor de un semáforo oscila entre 0 y 1 . Es similar al bloqueo mutex, pero el mutex es un mecanismo de bloqueo, mientras que el semáforo es un mecanismo de señalización. En el semáforo binario, si un proceso quiere acceder al recurso, realiza la espera() operación en el semáforo y disminuye el valor del semáforo de 1 a 0. Cuando libera el recurso, realiza una señal () operación en el semáforo e incrementa su valor a 1. Supongamos que el valor del semáforo es 0 y un proceso quiere acceder al recurso. En ese caso, realiza esperar() operación y se bloquea hasta que el proceso actual que utiliza los recursos libera el recurso.

Mutex vs semáforo

Ventajas del semáforo

Estas son las siguientes ventajas del semáforo, tales como:

  • Permite que más de un hilo acceda a la sección crítica.
  • Los semáforos son independientes de la máquina.
  • Los semáforos se implementan en el código independiente de la máquina del microkernel.
  • No permiten que múltiples procesos ingresen a la sección crítica.
  • Como hay ocupado y esperando en el semáforo, nunca se desperdician tiempo ni recursos en el proceso.
  • Son independientes de la máquina, por lo que deben ejecutarse en el código independiente de la máquina del microkernel.
  • Permiten una gestión flexible de los recursos.

Desventaja de los semáforos

Los semáforos también tienen algunas desventajas, como por ejemplo:

  • Una de las mayores limitaciones de un semáforo es la inversión de prioridad.
  • El sistema operativo debe realizar un seguimiento de todas las llamadas para esperar y señalar el semáforo.
  • Su uso nunca se impone, sino que es únicamente por convención.
  • Las operaciones de espera y señal deben ejecutarse en el orden correcto para evitar interbloqueos en el semáforo.
  • La programación de semáforos es un método complejo, por lo que existen posibilidades de no lograr la exclusión mutua.
  • Tampoco es un método práctico para uso a gran escala ya que su uso conduce a una pérdida de modularidad.
  • El semáforo es más propenso a errores del programador
  • y puede causar un punto muerto o una violación de la exclusión mutua debido a un error del programador.

Diferencia entre mutex y semáforo

La diferencia básica entre semáforo y mutex es que el semáforo es un mecanismo de señalización, es decir, los procesos realizan operaciones de espera () y señal () para indicar si están adquiriendo o liberando el recurso. Por el contrario, un mutex es un mecanismo de bloqueo y el proceso tiene que adquirir el bloqueo en un objeto mutex si quiere adquirir el recurso. Aquí hay algunas diferencias más entre semáforo y mutex, como por ejemplo:

Mutex vs semáforo
Términos exclusión mutua Semáforo
Definición El mutex es un mecanismo de bloqueo, ya que para adquirir un recurso, un proceso necesita bloquear el objeto mutex y, al liberar un proceso de recursos, debe desbloquear el objeto mutex. El semáforo es un mecanismo de señalización, ya que las operaciones de espera () y señal () realizadas en la variable del semáforo indican si un proceso está adquiriendo o liberando el recurso.
Existencia Un mutex es un objeto. El semáforo es una variable entera.
Función Mutex permite que múltiples subprocesos de programa accedan a un único recurso, pero no simultáneamente. Semaphore permite que múltiples subprocesos de programa accedan a una instancia finita de recursos.
Propiedad El bloqueo del objeto mutex lo libera únicamente el proceso que ha adquirido el bloqueo en el objeto mutex. El valor del semáforo puede cambiarse mediante cualquier proceso que adquiera o libere el recurso realizando la operación de espera () y señal ().
Clasificar por categorías Mutex no se clasifica más. El semáforo se puede clasificar en semáforo de conteo y semáforo binario.
Operación El objeto mutex se bloquea o desbloquea mediante el proceso de solicitar o liberar el recurso. El valor del semáforo se modifica mediante las operaciones de espera () y señal () además de la inicialización.
Recursos ocupados Si un objeto mutex ya está bloqueado, entonces el proceso que desea adquirir recursos espera y el sistema lo pone en cola hasta que se libera el recurso y se desbloquea el objeto mutex. Supongamos que el proceso adquiere todos los recursos y ningún recurso es gratuito. En ese caso, el proceso que desea adquirir recursos realiza la operación de espera () en la variable del semáforo y se bloquea hasta que el recuento del semáforo sea mayor que 0.