semaforos - ¿Qué es mutex y semáforo en Java? ¿Cual es la diferencia principal?
semaforos sistemas operativos ejercicios resueltos (11)
Desafortunadamente, todos han pasado por alto la diferencia más importante entre el semáforo y el mutex; el concepto de " propiedad ".
Los semáforos no tienen noción de propiedad, esto significa que cualquier subproceso puede liberar un semáforo (esto puede provocar muchos problemas en sí mismo pero puede ayudar con la "detección de muerte"). Mientras que un mutex tiene el concepto de propiedad (es decir, solo puede liberar un mutex que haya adquirido).
La propiedad es increíblemente importante para la programación segura de sistemas concurrentes. Siempre recomendaría utilizar mutex con preferencia a un semáforo (pero hay implicaciones de rendimiento).
Los mensajes mutex también pueden admitir herencia de prioridad (que puede ayudar con el problema de inversión de prioridad) y recursión (eliminando un tipo de interbloqueo).
También se debe señalar que hay semáforos "binarios" y semáforos "contadores / generales". El semáforo de Java es un semáforo de conteo y, por lo tanto, permite que se inicialice con un valor mayor a uno (mientras que, como se señaló, un mutex solo puede contar un conteo conceptual de uno). La utilidad de esto se ha señalado en otros mensajes.
Entonces, para resumir, a menos que tenga múltiples recursos para administrar, siempre recomendaría el mutex sobre el semáforo.
¿Qué es mutex y semáforo en Java? Cual es la diferencia principal ?
El objeto de sincronización Semaphore implementa un semáforo clásico. Un semáforo controla el acceso a un recurso compartido por un contador. Si el contador es mayor que cero, se concede acceso; Si es cero, se deniega el acceso. El contador cuenta los permisos que permiten el acceso al recurso compartido. Luego, para acceder al recurso, un hilo debe recibir permiso del semáforo. En general, para usar un semáforo, el hilo que desea acceder al recurso compartido intenta adquirir un permiso. Si el recuento de semáforos es mayor que cero, el hilo adquiere un permiso y se reduce el recuento de semáforos. De lo contrario, el hilo queda bloqueado hasta que pueda obtener un permiso. Cuando el hilo ya no necesita acceder al recurso compartido, libera el permiso, por lo que aumenta el número de semáforos. Si hay otro hilo esperando un permiso, adquiere un permiso en ese momento. La clase semáforo de Java implementa este mecanismo.
Semaphore tiene dos constructores:
Semaphore(int num)
Semaphore(int num, boolean come)
num especifica el recuento inicial del permiso. Entonces num especifica el número de subprocesos que pueden acceder a un recurso compartido en un momento dado. Si num es uno, puede acceder al recurso un hilo a la vez. Al configurarlo como verdadero, puede garantizar que los hilos que está esperando reciben permiso en el orden que solicitaron.
Esta pregunta tiene respuestas relevantes y un enlace a la guía oficial de Java: ¿Hay un Mutex en Java?
Mutex es básicamente exclusión mutua. Solo un hilo puede adquirir el recurso a la vez. Cuando un hilo adquiere el recurso, no se permite que otro hilo adquiera el recurso hasta que se libere el hilo que posee el recurso. Todos los hilos que esperan la adquisición de recursos serán bloqueados.
Semaphore se usa para controlar el número de subprocesos que se ejecutan. Habrá un conjunto fijo de recursos. El conteo de recursos disminuirá cada vez que un hilo sea el mismo. Cuando el recuento de semáforos llega a 0, no se permiten otros subprocesos para adquirir el recurso. Los hilos se bloquean hasta que otros hilos posean lanzamientos de recursos.
En resumen, la principal diferencia es ¿cuántos hilos se les permite adquirir el recurso a la vez?
- Mutex --es UNO.
- Semáforo: su DEFINED_COUNT, (tantos como el recuento de semáforos)
Mutex es un semáforo binario. Debe inicializarse con 1, de modo que se cumpla el principio del Primero que Viene Primero. Esto nos lleva a la otra propiedad especial de cada mutex: el que cayó , debe ser el que lo hace . Ergo hemos obtenido exclusión mutua sobre algún recurso.
Ahora se puede ver que un mutex es un caso especial de semáforo general.
Se puede contar el semáforo, mientras que el mutex solo puede contar hasta 1.
Supongamos que tiene un hilo ejecutándose que acepta conexiones de clientes. Este hilo puede manejar 10 clientes simultáneamente. Luego, cada nuevo cliente establece el semáforo hasta que alcanza 10. Cuando el semáforo tiene 10 indicadores, entonces su cadena no aceptará nuevas conexiones.
Mutex se usan generalmente para proteger cosas. Supongamos que sus 10 clientes pueden acceder a varias partes del sistema. Luego puede proteger una parte del sistema con un mutex, de modo que cuando 1 cliente esté conectado a ese subsistema, nadie más debería tener acceso. También puedes usar un semáforo para este propósito. Un mutex es un "semáforo de exclusión mutua" .
Un mutex a menudo se conoce como un semáforo binario. Mientras que un semáforo se puede crear con cualquier recuento distinto de cero, un mutex es conceptualmente un semeóforo con un conteo superior de 1.
Un mutex se utiliza para acceder en serie a un recurso, mientras que un semáforo limita el acceso a un recurso hasta un número determinado. Puede pensar en un mutex como semáforo con un recuento de acceso de 1. Cualquiera que sea el valor de su cuenta de semáforo, es posible que los subprocesos puedan acceder al recurso antes de que se bloquee el recurso.
Un semáforo es un mecanismo de sincronización de conteo, un mutex no lo es.
Usted compara lo incomparable, técnicamente no hay diferencia entre un semáforo y mutex, no tiene sentido. mutex es solo un nombre significativo como cualquier nombre en su lógica de aplicación, significa que usted inicializa un semáforo en "1", se usa generalmente para proteger un recurso o una variable protegida para garantizar la exclusión mutua.
Un semáforo de conteo. Conceptualmente, un semáforo mantiene un conjunto de permisos. Cada
acquire()
bloquea si es necesario hasta que un permiso esté disponible, y luego lo toma. Cadarelease()
agrega un permiso, liberando potencialmente un adquirente de bloqueo. Sin embargo, no se usan objetos de permiso reales; el semáforo solo cuenta el número disponible y actúa en consecuencia.
Los semáforos a menudo se usan para restringir el número de subprocesos que pueden acceder a algún recurso (físico o lógico)
Java no tiene una API Mutex incorporada. Pero puede implementarse como semáforo binario.
Un semáforo inicializado a uno, y que se utiliza de manera que solo tenga como máximo un permiso disponible, puede servir como un bloqueo de exclusión mutua. Esto se conoce más comúnmente como un semáforo binario, porque solo tiene dos estados: un permiso disponible o cero permisos disponibles.
Cuando se utiliza de esta manera, el semáforo binario tiene la propiedad (a diferencia de muchas implementaciones de bloqueo) de que el "bloqueo" puede ser liberado por un hilo que no sea el propietario (ya que los semáforos no tienen noción de propiedad) . Esto puede ser útil en algunos contextos especializados, como la recuperación de interbloqueos.
Entonces, las diferencias clave entre Semaphore y Mutex:
El semáforo restringe el número de subprocesos para acceder a un recurso a través de permisos. Mutex permite que solo un hilo acceda al recurso.
No hilos posee Semáforo. Los hilos pueden actualizar el número de permisos llamando a los métodos
acquire()
yrelease()
. Los mutexes se deben desbloquear solo por el hilo que sostiene el candado.Cuando se utiliza un mutex con variables de condición, hay un horquillado implícito: está claro qué parte del programa está siendo protegida . Este no es necesariamente el caso de un semáforo, que podría denominarse como el de la programación concurrente: es poderoso pero demasiado fácil de usar de una manera desestructurada e indeterminada.