c - pthreads mutex vs semáforo
linux synchronization (8)
El ejemplo del inodoro
Mutex:
Es la llave de un baño. Una persona puede tener la llave, ocupar el baño, en ese momento. Cuando termina, la persona da (libera) la llave a la siguiente persona en la cola.
"Los mensajes mutex se utilizan generalmente para serializar el acceso a una sección de código de reentrada que no se puede ejecutar simultáneamente por más de un hilo. Un objeto mutex solo permite un hilo en una sección controlada, forzando a otros hilos que intentan obtener acceso a esa sección esperar hasta que el primer hilo haya salido de esa sección ".
(Un mutex es realmente un semáforo con valor 1.)
Semáforo:
Es la cantidad de llaves de inodoro idénticas gratuitas. Por ejemplo, digamos que tenemos cuatro baños con cerraduras y llaves idénticas. El recuento de semáforos (el recuento de claves) se establece en 4 al principio (los cuatro retretes son gratuitos), luego el valor del recuento disminuye a medida que las personas ingresan. Si todos los retretes están llenos, es decir, no quedan claves libres, el recuento de semáforos es 0. Ahora, cuando eq. una persona deja el baño, el semáforo aumenta a 1 (una tecla libre) y se le da a la siguiente persona en la fila.
"Un semáforo restringe el número de usuarios simultáneos de un recurso compartido hasta un número máximo. Los subprocesos pueden solicitar acceso al recurso (decrementando el semáforo) y pueden indicar que han terminado de usar el recurso (incrementando el semáforo)".
¿Cuál es la diferencia entre semáforos y mutex proporcionada por la biblioteca pthread?
Estos dos artículos explican grandes detalles sobre mutex vs semaphores También this respuesta de desbordamiento de pila dice una respuesta similar.
La diferencia entre el semaphore
y el mutex
es la diferencia entre el mecanismo y el patrón . La diferencia está en su propósito ( intención ) y cómo funcionan ( comportamiento ).
El mutex
, barrier
, pipeline
son patrones de programación paralelos . Mutex
se usa ( previsto ) para proteger una critical section
y garantizar mutual exclusion
. Barrier
hace que los agentes (hilo / proceso) sigan esperándose el uno al otro.
Una de las características ( comportamiento ) del patrón mutex
es que solo los agentes permitidos (proceso o hilo) pueden ingresar a una sección crítica y solo ese (los) agente (s) pueden voluntariamente salir de eso.
Hay casos en que mutex
permite agente único a la vez. Hay casos en que permite múltiples agentes (lectores múltiples) y no permite otros agentes (escritores).
El semaphore
es un mecanismo que puede usarse ( pretender ) para implementar diferentes patrones. Es ( comportamiento ) generalmente una bandera (posiblemente protegida por exclusión mutua). (Un hecho interesante es que incluso el patrón mutex
se puede usar para implementar semáforos).
En la cultura popular, los semaphores
son mecanismos proporcionados por los núcleos, y los mutexes
son provistos por la biblioteca de espacio de usuario.
Tenga en cuenta que hay conceptos erróneos sobre semaphores
y mutexes
. Dice que los semaphores
se utilizan para la synchronization
. Y mutexes
tiene ownership
. Esto se debe a los populares libros del sistema operativo. Pero la verdad es que todos los mutexes, semáforos y barreras se utilizan para la sincronización . La intención de mutex no es la ownership
sino mutual exclusion
. Este concepto erróneo dio lugar a la pregunta de la entrevista popular preguntando la diferencia de los mutexes
y binary-semaphores
.
Resumen,
intención- mutex, exclusión mutua
- semáforo, implementar patrones de diseño paralelos
- mutex, solo el (los) agente (s) permitido (s) ingresan en la sección crítica y solo ellos (ellos) pueden salir
- semáforo, ingrese si la bandera dice ir, de lo contrario espere hasta que alguien cambie la bandera
Desde el punto de vista del diseño, mutex
se parece más a state-pattern
donde el algoritmo seleccionado por el estado puede cambiar el estado. El binary-semaphore
es más como strategy-pattern
donde el algoritmo externo puede cambiar el estado y eventualmente el algoritmo / estrategia seleccionado para ejecutarse.
Los mutexes se pueden aplicar solo a los hilos en un solo proceso y no funcionan entre procesos como lo hacen los semáforos.
Semaphore es más utilizado como bandera, por lo que realmente no necesita traer RTOS / OS. El semáforo puede ser cambiado accidental o deliberadamente por otros hilos (por ejemplo, debido a una mala codificación). Cuando subas usa mutex, posee los recursos. Ningún otro hilo puede acceder a él, antes de que el recurso se libere.
Voy a hablar sobre Mutex vs Binary-Semaphore. Obviamente, utiliza mutex para evitar que otros hilos accedan a los datos de un hilo al mismo tiempo.
(Supongamos que acaba de llamar a lock () y en el proceso de acceder a los datos. Esto significa que no espera que otro subproceso (u otra instancia del mismo código de subproceso) 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 activa el bloqueo, entonces el bloqueo () debería bloquear el flujo de control).
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).
¿Alguna vez permite que otro hilo desbloquee el mismo mutex y, a su vez, permita que el hilo que ya está esperando (bloqueo) en el bloqueo de exclusión mutua se desbloquee y acceda a los datos? (Espero que tengas lo que estoy diciendo aquí).
Según la definición universal acordada,
- con "mutex" esto no puede suceder. Ningún otro hilo puede desbloquear el bloqueo en su hilo
- con "semáforo binario" esto puede suceder. Cualquier otro hilo puede desbloquear el bloqueo en tu hilo
Por lo tanto, si usted es muy particular sobre el uso de semáforos binarios en lugar de mutex, debe tener mucho cuidado al "abrir" las cerraduras y desbloquear, es decir, que cada flujo de control que golpea cada cerradura debe golpear una llamada de desbloqueo y también no debe haber ningún "primer desbloqueo", sino que debe ser siempre "primer bloqueo".
los semáforos tienen un contador sincronizado y los de mutex son solo binarios (verdadero / falso).
Un semáforo se utiliza a menudo como un mecanismo definitivo para responder cuántos elementos de un recurso están en uso, por ejemplo, un objeto que representa n subprocesos de trabajo puede usar un semáforo para contar cuántos subprocesos de trabajo están disponibles.
La verdad es que puedes representar un semáforo mediante una INT sincronizada por un mutex.
mutex se usa para evitar la condición de carrera entre múltiples hilos.
mientras que el semáforo se utiliza como elemento de sincronización utilizado en múltiples procesos.
mutex no se puede reemplazar con semáforo binario ya que, un proceso espera semáforo mientras que otro proceso libera semáforo. En caso de exclusión mutua tanto la adquisición como la liberación se manejan de la misma manera.