Pregunta Diferencia entre semáforo binario y mutex


¿Hay alguna diferencia entre un semáforo binario y mutex o son esencialmente los mismos?


641
2017-09-15 13:23


origen


Respuestas:


Son NO la misma cosa. Se usan para diferentes propósitos!
Si bien ambos tipos de semáforos tienen un estado completo / vacío y usan la misma API, su uso es muy diferente.

Semáforos de exclusión mutua
Los semáforos de exclusión mutua se utilizan para proteger los recursos compartidos (estructura de datos, archivos, etc.).

Un semáforo Mutex es "propiedad" de la tarea que lo lleva. Si la Tarea B intenta semivar un mutex actualmente retenido por la Tarea A, la llamada de la Tarea B devolverá un error y fallará.

Los mutexes siempre usan la siguiente secuencia:

  - SemTake
  - Sección crítica
  - SemGive

Aquí hay un ejemplo simple:

  Hilo A Hilo B
   Tome Mutex
     datos de acceso
     ... Tome Mutex <== Will bloqueará
     ...
   Dar datos de acceso de Mutex <== Desbloquea
                                  ...
                                Dar Mutex

Semáforo binario
El semáforo binario aborda una pregunta totalmente diferente:

  • La tarea B está pendiente esperando que ocurra algo (un sensor que se dispara, por ejemplo).
  • Se ejecuta Exámenes de sensor y una rutina de servicio de interrupción. Necesita notificar una tarea del viaje.
  • La tarea B debe ejecutarse y tomar las medidas apropiadas para el viaje del sensor. Luego vuelve a esperar.

   Task A                      Task B
   ...                         Take BinSemaphore   <== wait for something
   Do Something Noteworthy
   Give BinSemaphore           do something    <== unblocks

Tenga en cuenta que con un semáforo binario, está bien que B tome el semáforo y A para darlo.
De nuevo, un semáforo binario NO protege un recurso del acceso. El acto de dar y tomar un semáforo está fundamentalmente desacoplado.
Por lo general, tiene poco sentido para la misma tarea dar y tomar el mismo semáforo binario.


550
2017-09-17 18:13



Mutex solo puede lanzarse por subproceso que lo haya adquirido, mientras que usted puede señalar semáforos desde cualquier otro subproceso (o proceso), por lo que los semáforos son más adecuados para algunos problemas de sincronización, como productor-consumidor.

En Windows, los semáforos binarios son más como objetos de evento que mutexes.


392
2017-09-15 13:29



El ejemplo de Toilet es una analogía agradable:

Mutex:

Es la llave de un baño. Una persona puede   tener la llave - ocupar el baño - en   el tiempo. Cuando termine, la persona   da (libera) la llave a la siguiente   persona en la fila.

Oficialmente: "Los mutexes son típicamente   utilizado para serializar el acceso a una sección   del código de reentrada que no puede ser   ejecutado simultáneamente por más de uno   hilo. Un objeto mutex solo permite uno   enhebrar en una sección controlada,   forzando a otros hilos que intentan   obtener acceso a esa sección para esperar   hasta que el primer hilo haya salido de   esa sección. "Ref: Desarrollador Symbian   Biblioteca

(Un mutex es realmente un semáforo con   valor 1.)

Semáforo:

Es la cantidad de inodoro libre idéntico   llaves. Ejemplo, digamos que tenemos cuatro   aseos con cerraduras y llaves idénticas.   El conteo de semáforos: el recuento de   teclas - se establece en 4 al comienzo (todas   cuatro baños son gratuitos), luego el conteo   el valor se reduce como las personas son   entrando. Si todos los baños están llenos,   es decir. no quedan llaves libres, el   el conteo del semáforo es 0. Ahora, cuando eq.   una persona deja el baño,   semáforo se incrementa a 1 (uno libre   clave), y entregado a la siguiente persona en   la cola.

Oficialmente: "Un semáforo restringe el   número de usuarios simultáneos de un   recurso compartido hasta un máximo   número. Los hilos pueden solicitar acceso a   el recurso (decrementando el   semáforo), y puede indicar que   han terminado de usar el recurso   (incrementando el semáforo). "Ref:   Biblioteca del desarrollador de Symbian


384
2017-12-06 19:53



Buenos artículos sobre el tema:

De la parte 2:

El mutex es similar a los principios   del semáforo binario con uno   diferencia significativa: el principio   de propiedad. La propiedad es lo simple   concepto de que cuando una tarea se bloquea   (adquiere) un mutex solo puede desbloquearse   (liberarlo. Si una tarea intenta   desbloquear un mutex que no ha bloqueado (por lo tanto   no posee) entonces una condición de error   se encuentra y, lo más importante,   el mutex no está desbloqueado Si el   objeto de exclusión mutua no tiene   propiedad entonces, irrelevante de lo que   se llama, no es un mutex.


121
2017-10-09 05:22



Como ninguna de las respuestas anteriores borra la confusión, aquí hay una que despejó mi confusión.

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

Semaphore es un mecanismo de señalización ("He terminado, puedes continuar" tipo de señal). Por ejemplo, si escuchas canciones (asúmelas como   una tarea) en su dispositivo móvil y, al mismo tiempo, su amigo lo llamó,   se activará una interrupción en la cual una rutina de servicio de interrupción   (ISR) señalará la tarea de procesamiento de llamadas para despertar.

Fuente: http://www.geeksforgeeks.org/mutex-vs-semaphore/


82
2017-11-21 05:33



Su semántica de sincronización es muy diferente:

  • Los mutexes permiten la serialización de acceso a un recurso dado, es decir, múltiples hilos esperan un bloqueo, uno a la vez y como se dijo anteriormente, el hilo posee la cerradura hasta que esté lista: solamente este hilo en particular puede desbloquearlo.
  • un semáforo binario es un contador con valor 0 y 1: una tarea que lo bloquea hasta alguna tarea hace un sem_post. El semáforo anuncia que hay un recurso disponible y proporciona el mecanismo para esperar hasta que se indique que está disponible.

Como tal, uno puede ver un mutex como un token pasado de tarea a tareas y un semáforo como semáforo en rojo ( señales alguien que puede proceder).


34
2017-09-24 18:23



En un nivel teórico, no son diferentes semánticamente. Puede implementar un mutex usando semáforos o viceversa (ver aquí para un ejemplo). En la práctica, la implementación es diferente y ofrecen servicios ligeramente diferentes.

La diferencia práctica (en términos de los servicios del sistema que los rodean) es que la implementación de un mutex está destinada a ser un mecanismo de sincronización más ligero. En el habla del oráculo, los mutexes se conocen como pestillos y los semáforos son conocidos como murga.

En el nivel más bajo, usan algún tipo de atómico prueba y set mecanismo. Esto lee el valor actual de una ubicación de memoria, calcula algún tipo de condicional y escribe un valor en esa ubicación en una sola instrucción que no puede ser interrumpido. Esto significa que puede adquirir un mutex y una prueba para ver si alguien más lo tenía antes que usted.

Una implementación típica de mutex tiene un proceso o subproceso que ejecuta la instrucción de prueba y configuración y evalúa si algo más ha establecido el mutex. Un punto clave aquí es que no hay interacción con el planificador, entonces no tenemos idea (y no me importa) quién ha establecido el bloqueo. A continuación, cedemos nuestra porción de tiempo e intentamos nuevamente cuando la tarea se vuelve a programar o ejecutamos un bloqueo de giro. Un bloqueo de giro es un algoritmo como:

Count down from 5000:
     i. Execute the test-and-set instruction
    ii. If the mutex is clear, we have acquired it in the previous instruction 
        so we can exit the loop
   iii. When we get to zero, give up our time slice.

Cuando hayamos terminado de ejecutar nuestro código protegido (conocido como sección crítica) simplemente establecemos el valor mutex en cero o lo que sea que signifique 'claro'. Si varias tareas intentan adquirir el mutex, la próxima tarea que se programe después de liberar el mutex tendrá acceso al recurso. Por lo general, debe usar mutexes para controlar un recurso sincronizado donde el acceso exclusivo solo es necesario por periodos de tiempo muy cortos, normalmente para realizar una actualización de una estructura de datos compartida.

Un semáforo es una estructura de datos sincronizados (generalmente con un mutex) que tiene un recuento y algunas envolturas de llamadas al sistema que interactúan con el planificador con un poco más de profundidad que las bibliotecas mutex. Los semáforos se incrementan y disminuyen y se utilizan para bloquear tareas hasta que algo más esté listo. Ver Productor / problema del consumidor para un simple ejemplo de esto. Los semáforos se inicializan con algún valor: un semáforo binario es solo un caso especial en el que el semáforo se inicializa en 1. La publicación en un semáforo tiene el efecto de activar un proceso de espera.

Un algoritmo de semáforo básico se ve así:

(somewhere in the program startup)
Initialise the semaphore to its start-up value.

Acquiring a semaphore
   i. (synchronised) Attempt to decrement the semaphore value
  ii. If the value would be less than zero, put the task on the tail of the list of tasks waiting on the semaphore and give up the time slice.

Posting a semaphore
   i. (synchronised) Increment the semaphore value
  ii. If the value is greater or equal to the amount requested in the post at the front of the queue, take that task off the queue and make it runnable.  
 iii. Repeat (ii) for all tasks until the posted value is exhausted or there are no more tasks waiting.

En el caso de un semáforo binario, la principal diferencia práctica entre los dos es la naturaleza de los servicios del sistema que rodean la estructura de datos real.

EDITAR: Como evan ha señalado correctamente, los spinlocks reducirán la velocidad de una sola máquina procesadora. Solo usaría un spinlock en una caja multiprocesador porque en un solo procesador el proceso que contiene el mutex nunca lo reiniciará mientras se está ejecutando otra tarea. Los spinlocks solo son útiles en arquitecturas multiprocesador.


19
2017-11-22 18:58



Aunque mutex y semáforos se utilizan como primitivas de sincronización, existe una gran diferencia entre ellos. En el caso de mutex, solo el hilo que bloqueó o adquirió el mutex puede desbloquearlo. En el caso de un semáforo, un hilo que espera en un semáforo puede ser señalado por un hilo diferente. Algunos sistemas operativos admiten el uso de mutex y semáforos entre procesos. Normalmente, el uso se crea en la memoria compartida.


16
2017-08-24 06:17



1. Un semáforo puede ser un Mutex, pero un Mutex nunca puede ser un semáforo. Esto simplemente significa que se puede usar un semáforo binario
como Mutex, pero un Mutex nunca puede exhibir la funcionalidad del semáforo.
2. Ambos semáforos y Mutex (al menos el último kernel) son de naturaleza no recursiva.
3. Nadie posee semáforos, mientras que Mutex es propiedad y el propietario es responsable de ellos. Este es un importante distinción desde una perspectiva de depuración.
4. En el caso de Mutex, el hilo que posee el Mutex es responsable de liberarlo. Sin embargo, en el caso de los semáforos, esto condición no es requerida. Cualquier otro hilo puede indicar la liberación del semáforo utilizando s m p s (function.e_ot)
5. Un Mutex, por definición, se usa para serializar el acceso a una sección de código reentrante que no se puede ejecutar simultáneamente por más de un hilo Un semáforo, por definición, restringe la cantidad de usuarios simultáneos de un recurso compartido hasta un número máximo
6. Otra diferencia que importaría a los desarrolladores es que los semáforos son a nivel de todo el sistema y permanecen en forma de archivos en el sistema de archivos, a menos que se limpie de otra manera. Los mutex se procesan en todo el proceso y se limpian automáticamente cuando finaliza un proceso.
7. La naturaleza de los semáforos hace posible utilizarlos en la sincronización de procesos relacionados y no relacionados, así como entre trapos. Mutex solo se puede usar para sincronizar hilos y, como máximo, entre procesos relacionados (pthread) la implementación del último núcleo viene con una característica que permite que Mutex se use entre procesos relacionados).
8. De acuerdo con la documentación del kernel, los Mutex son más ligeros en comparación con los semáforos. Lo que esto significa es que un programa con el uso de semáforos tiene una huella de memoria mayor en comparación con un programa que tiene Mutex.
9. Desde una perspectiva de uso, Mutex tiene una semántica más simple en comparación con los semáforos.


15
2018-06-20 18:05



Obviamente, utiliza mutex para bloquear los datos en un subproceso al que se accede por otro subproceso al mismo tiempo. Supongamos que acaba de llamar lock() y en el proceso de acceder a los datos. Esto significa que no espera que ningún otro hilo (u otra instancia del mismo código de hilo) acceda a los mismos datos bloqueados por el mismo mutex. Es decir, si se ejecuta el mismo código de subproceso en una instancia de subproceso diferente, se cierra la cerradura, entonces el lock() debería bloquear el flujo de control allí. Esto se aplica a un hilo que usa un código de hilo diferente, que también está accediendo a los mismos datos y que también está bloqueado por el mismo mutex. En este caso, aún está en el proceso de acceder a los datos y puede tomar, por ejemplo, otros 15 segundos para alcanzar el desbloqueo de mutex (para que el otro hilo que se bloquee en el bloqueo de exclusión mutua se desbloquee y permita el control acceder a los datos). ¿Permitirá, a cualquier precio, otro hilo para desbloquear el mismo mutex y, a su vez, permitir que el hilo que ya está esperando (bloqueo) en el bloqueo de exclusión mutua desbloquee y acceda a los datos? Espero que tengas lo que estoy diciendo aquí? Según, ¡de acuerdo con la definición universal!

  • con "mutex" esto no puede suceder. Ningún otro hilo puede desbloquear el bloqueo en tu hilo
  • con "semáforo binario" esto puede suceder. Cualquier otro hilo puede desbloquearse el candado en tu hilo

Por lo tanto, si usted es muy particular sobre el uso de semáforos binarios en lugar de mutex, entonces debe tener mucho cuidado al "trazar" los bloqueos y desbloqueos. Quiero decir que cada control de flujo que golpea cada bloqueo debe golpear una llamada de desbloqueo, también no debe haber ningún "primer desbloqueo", sino que debe ser siempre "primer bloqueo".


10
2017-12-11 16:18