in

Mutex vs semáforo – GeeksforGeeks

gfg 200x200 min

¿Cuál es la diferencia entre un mutex y un semáforo? ¿Cuándo debería utilizar un mutex y cuándo debería utilizar 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, las exclusiones mutuas y los semáforos son recursos del kernel que brindan servicios de sincronización (también llamados primitivas de sincronización). ¿Por qué necesitamos tales primitivas de sincronización? ¿No será suficiente con uno solo? Para responder a estas preguntas, debemos 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.

los productor-consumidor problema:

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 de productor-consumidor. Supongamos que tenemos un búfer de 4096 bytes de longitud. Un hilo de productor recopila los datos y los escribe en el búfer. Un hilo consumidor procesa los datos recopilados del búfer. El objetivo es que ambos hilos no se ejecuten al mismo tiempo.

Usando Mutex:

Un mutex proporciona exclusión mutua, ya sea el productor o el consumidor pueden tener la clave (mutex) y continuar con su trabajo. Siempre que el productor llene el búfer, el consumidor debe esperar y viceversa.

En cualquier momento, solo un hilo puede funcionar con el completo buffer. 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úferes 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 búferes al mismo tiempo.

Idea equivocada:

Existe una ambigüedad entre semáforo binario y mutex. Podríamos habernos encontrado con que un mutex es un semáforo binario. Pero no lo es! El propósito de mutex y semáforo es diferente. Quizás, debido a la similitud en su implementación, un mutex se denominaría semáforo binario.

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

El semáforo es mecanismo de señalización (Tipo de señal “Ya terminé, puedes continuar”). Por ejemplo, si está escuchando canciones (asuma 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 interrupciones (ISR) indica la tarea de procesamiento de llamadas a despierta.

Preguntas generales:

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

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

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

Un mutex es un bloqueo. Solo un estado (bloqueado / desbloqueado) está asociado con él. Sin embargo, un mutex recursivo se puede bloquear más de una vez (sistemas compatibles con POSIX), en el 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 hilo que ya había bloqueado un mutex, intenta bloquear el mutex nuevamente, entrará en la lista de espera de ese mutex, lo que da como resultado un interbloqueo. Es porque ningún otro hilo puede desbloquear el mutex. Un implementador del sistema operativo puede tener cuidado al identificar al propietario del mutex y regresar si ya está bloqueado por un mismo hilo para evitar interbloqueos.

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

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

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

5. ¿Qué es un mutex y una sección 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, que pueden ser mucho más rápidas pero arruinan 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. Todos son primitivas de sincronización. Según el costo de su uso, son diferentes. Debemos 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 asincrónica en el contexto del subproceso en ejecución actual. Está no recomendado para consultar (llamada de bloqueo) la disponibilidad de primitivas de sincronización en un ISR. Los ISR deben ser cortos, la llamada a mutex / semáforo puede bloquear el hilo 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 es seguro ‘qué se debe hacer cuando el recurso no está disponible‘, el hilo puede realizar 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, 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 la Arte de la concurrencia libro. También explore los bloqueos del lector y los bloqueos del escritor 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 de palabras o el lector de Adobe en Windows, solo podemos ver una instancia en el administrador de tareas. ¿Cómo implementarlo?

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

¡Atención lector! No dejes de aprender ahora. Obtenga todos los conceptos importantes de la Teoría de la CS para las entrevistas SDE con el Curso de Teoría de CS a un precio asequible para los estudiantes y prepárese para la industria.

Deja una respuesta

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

apple touch icon@2

Un equivalente de Windows del comando tail de Unix

edit

Rutabaga vs Nabo – Diferencia y Comparación