Mutex vs Semáforo

¿Cuál es la diferencia entre un mutex y un semáforo? ¿Cuándo debe usar un mutex y cuándo debe usar un semáforo? 

Se requiere una comprensión concreta de los conceptos del sistema operativo para diseñar/desarrollar aplicaciones inteligentes. Nuestro objetivo es educar al lector sobre estos conceptos y aprender de otros geeks expertos. 

Según la terminología del sistema operativo, los mutex y los semáforos son recursos del núcleo que proporcionan servicios de sincronización (también llamados primitivos de sincronización ). ¿Por qué necesitamos tales primitivas de sincronización? ¿No será suficiente uno solo? Para responder a estas preguntas, necesitamos comprender algunas palabras clave. Lea las publicaciones sobre atomicidad y sección crítica . Ilustraremos con ejemplos para comprender bien estos conceptos, en lugar de seguir la descripción textual habitual del sistema operativo. 

El problema productor-consumidor : 

Tenga en cuenta que el contenido es una explicación generalizada. Los detalles prácticos varían con la implementación. 

Considere el problema estándar del productor-consumidor. Supongamos que tenemos un búfer de 4096 bytes de longitud. Un subproceso productor recopila los datos y los escribe en el búfer. Un subproceso de consumidor procesa los datos recopilados del búfer. El objetivo es que ambos subprocesos no deben ejecutarse al mismo tiempo. 

Uso de exclusión mutua: 

Un mutex proporciona exclusión mutua, tanto el productor como el consumidor pueden tener la clave (mutex) y continuar con su trabajo. Mientras el productor llene el búfer, el consumidor debe esperar, y viceversa. 

En cualquier momento, solo un subproceso puede trabajar con todo el búfer. El concepto se puede generalizar usando semáforo. 

Usando semáforo: 

Un semáforo es un mutex generalizado. En lugar de un solo búfer, podemos dividir el búfer de 4 KB en cuatro búfer de 1 KB (recursos idénticos). Se puede asociar un semáforo con estos cuatro búferes. El consumidor y el productor pueden trabajar en diferentes buffers al mismo tiempo. 

Idea equivocada: 

Existe una ambigüedad entre el semáforo binario y mutex . Es posible que nos hayamos encontrado con que un mutex es un semáforo binario. ¡ Pero no lo es ! El propósito de mutex y semáforo es diferente. Tal vez, debido a la similitud en su implementación, un mutex se denominaría semáforo binario. 

Estrictamente hablando, un mutex se usa para sincronizar el acceso a un recurso. Solo una tarea (puede ser un subproceso o un proceso basado en la abstracción del sistema operativo) puede adquirir la exclusión mutua. Significa que hay propiedad asociada con un mutex, y solo el propietario puede liberar el bloqueo (mutex). 

El semáforo es el tipo de señal («Terminé, puedes continuar»). Por ejemplo, si está escuchando canciones (suponga que es una tarea) en su teléfono móvil y, al mismo tiempo, su amigo lo llama, se activa una interrupción en la que una rutina de servicio de interrupción (ISR) señala la tarea de procesamiento de llamadas para despierta. 

Preguntas generales: 

1. ¿Puede un hilo adquirir más de un bloqueo (Mutex)? 

Sí, es posible que un subproceso necesite más de un recurso, de ahí los bloqueos. Si algún bloqueo no está disponible, el hilo esperará (bloqueará) en el bloqueo. 

2. ¿Se puede bloquear un mutex más de una vez? 

Un mutex es un candado. Solo se le asocia un estado (bloqueado/desbloqueado). Sin embargo, un mutex recursivo se puede bloquear más de una vez (sistemas compatibles con POSIX), en los que se asocia un recuento, pero conserva solo un estado (bloqueado/desbloqueado). El programador debe desbloquear el mutex tantas veces como se bloqueó. 

3. ¿Qué sucede si un mutex no recursivo se bloquea más de una vez? 

Punto muerto. Si un subproceso que ya había bloqueado una exclusión mutua intenta volver a bloquear la exclusión mutua, entrará en la lista de espera de esa exclusión mutua, lo que resultará en un interbloqueo. Es porque ningún otro subproceso puede desbloquear el mutex. Un implementador del sistema operativo puede tener cuidado al identificar al propietario de la exclusión mutua y regresar si ya está bloqueado por un mismo subproceso para evitar interbloqueos. 

4. ¿Son iguales el semáforo binario y el mutex? 

No. Sugerimos tratarlos por separado, como se explica en Señalización frente a mecanismos de bloqueo. Pero un semáforo binario puede experimentar los mismos problemas críticos (por ejemplo, inversión de prioridad) asociados con un mutex. Cubriremos esto en un artículo posterior. 

Un programador puede preferir mutex en lugar de crear un semáforo con cuenta 1. 

5. ¿Qué es una sección mutex y crítica? 

Algunos sistemas operativos usan la misma palabra sección crítica en la API. Por lo general, un mutex es una operación costosa debido a los protocolos de protección asociados. Por fin, el objetivo de mutex es el acceso atómico. Hay otras formas de lograr el acceso atómico, como deshabilitar las interrupciones, lo que puede ser mucho más rápido pero arruina la capacidad de respuesta. La API alternativa hace uso de la desactivación de interrupciones. 

6. ¿Qué son los eventos? 

La semántica de mutex, semáforo, evento, sección crítica, etc… es la misma. Todas son primitivas de sincronización. Basado en su costo en el uso de ellos son diferentes. Deberíamos consultar la documentación del sistema operativo para obtener detalles exactos. 

7. ¿Podemos adquirir mutex/semáforo en una rutina de servicio de interrupción? 

Un ISR se ejecutará de forma asíncrona en el contexto del subproceso en ejecución actual. No se recomienda consultar (bloquear llamada) la disponibilidad de primitivas de sincronización en una ISR. El ISR debe ser corto, la llamada a mutex/semáforo puede bloquear el subproceso en ejecución actual. Sin embargo, un ISR puede señalar un semáforo o desbloquear un mutex. 

8. ¿Qué queremos decir con «bloqueo de subprocesos en mutex/semáforo» cuando no están disponibles? 

Cada primitiva de sincronización tiene asociada una lista de espera. Cuando el recurso no está disponible, el subproceso solicitante se moverá de la lista de procesadores en ejecución a la lista de espera de la primitiva de sincronización. Cuando el recurso está disponible, el subproceso de mayor prioridad en la lista de espera obtiene el recurso (más precisamente, depende de las políticas de programación). 

9. ¿Es necesario que un hilo se bloquee siempre cuando el recurso no está disponible? 

No es necesario. Si el diseño está seguro de ‘ lo que se debe hacer cuando el recurso no está disponible ‘, el subproceso puede asumir ese trabajo (una rama de código diferente). Para admitir los requisitos de la aplicación, el sistema operativo proporciona una API sin bloqueo. 

Por ejemplo, la API POSIX pthread_mutex_trylock(). Cuando el mutex no está disponible, la función regresa inmediatamente, mientras que la API pthread_mutex_lock() bloquea el hilo hasta que el recurso está disponible. 

Referencias: 

http://www.netrino.com/node/202 

http://doc.trolltech.com/4.7/qsemaphore.html 

También compare mutex/semáforos con el algoritmo de Peterson y el algoritmo de Dekker. Una buena referencia es el  libro El arte de la concurrencia . Explore también los bloqueos de lectores y escritores en la documentación de Qt. 

Ejercicio: 

Implemente un programa que imprima un mensaje «Se está ejecutando una instancia» cuando se ejecuta más de una vez en la misma sesión. Por ejemplo, si observamos la aplicación Word o Adobe Reader en Windows, podemos ver solo una instancia en el administrador de tareas. ¿Cómo implementarlo? 

Artículo recopilado por  Venki . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *