Semáforo vs. Monitores: ¿cuál es la diferencia?

233

¿Cuáles son las principales diferencias entre un monitor y un semáforo ?

usuario919860
fuente
8
Puedes pensar en monitor como un semáforo binario.
Maxim Egorushkin
similar: stackoverflow.com/q/3547030/158779
Brian Gideon
1
Visite albahari.com/threading/part2.aspx . Leí este artículo, el mejor que he leído en Threading
Shantanu Gupta
55
No creo que tengas razón, Maxim. Un semáforo es una estructura de "nivel inferior", si no me equivoco, mientras que un monitor es un objeto completo. Recuerdo que revisamos los monitores brevemente en mi clase de Sistemas Operativos en la universidad, pero no recuerdo cómo un Monitor difería de un Mutex, aparte de estar orientado a objetos. Recuerdo que un problema podría resolverse usando monitores, pero no pudimos usar este mismo método en clase, debido a las restricciones del lenguaje C.
user919860
1
Semaphore y Monitor son muy diferentes, pero equivalentes en potencia, en el sentido de que puede implementar uno de otro. Puede leer el documento original de Hoare que demuestra su equivalencia desde aquí
Thanh DK,

Respuestas:

529

Un monitor es un objeto diseñado para acceder desde múltiples subprocesos. Las funciones o métodos miembros de un objeto de supervisión impondrán una exclusión mutua, por lo que solo un subproceso puede realizar cualquier acción sobre el objeto en un momento dado. Si un hilo está ejecutando actualmente una función miembro del objeto, cualquier otro hilo que intente llamar a una función miembro de ese objeto tendrá que esperar hasta que el primero haya terminado.

Un semáforo es un objeto de nivel inferior. Bien podría usar un semáforo para implementar un monitor. Un semáforo esencialmente es solo un contador. Cuando el contador es positivo, si un subproceso intenta adquirir el semáforo, entonces está permitido y el contador disminuye. Cuando se realiza un hilo, libera el semáforo e incrementa el contador.

Si el contador ya es cero cuando un hilo intenta adquirir el semáforo, entonces tiene que esperar hasta que otro hilo libere el semáforo. Si varios hilos están esperando cuando un hilo libera un semáforo, uno de ellos lo obtiene. El hilo que libera un semáforo no necesita ser el mismo hilo que lo adquirió.

Un monitor es como un baño público. Solo una persona puede ingresar a la vez. Cierran la puerta para evitar que entren otras personas, hacen sus cosas y luego la abren cuando se van.

Un semáforo es como un lugar de alquiler de bicicletas. Tienen un cierto número de bicicletas. Si intenta alquilar una bicicleta y tienen una gratis, puede tomarla, de lo contrario debe esperar. Cuando alguien devuelve su bicicleta, entonces otra persona puede tomarla. Si tiene una bicicleta, puede dársela a otra persona para que la devuelva, al lugar de alquiler de bicicletas no le importa quién la devuelva, siempre que recuperen su bicicleta.

Anthony Williams
fuente
162
+1 Gran analogía con los baños públicos y el lugar de alquiler de bicicletas. Nunca olvidaré la diferencia entre los dos ahora.
Drupad Panchal
44
Su respuesta parece contradecir stackoverflow.com/a/7336799/632951 .. Entonces , ¿quién tiene razón?
Pacerier
66
@Pacerier: Soy :-) La única contradicción es lo de alto nivel / bajo nivel. Usted puede construir un monitor de semáforos, simplemente no es muy ordenado, precisamente porque un monitor es una estructura de nivel superior al de un semáforo. Un semáforo es solo un contador con espera. Sugiero leer "El pequeño libro de semáforos" greenteapress.com/semaphores
Anthony Williams
3
@AnthonyWilliams: Tal vez dudo de la idea de que solo se pueden construir monitores a partir de semáforos. La otra forma también es posible y por eso no podemos decir profusamente que monitor es una entidad de nivel más alto que los semáforos.
Kavish Dwivedi
55
Sí, puedes construir un semáforo desde un monitor. Siempre puedes construir objetos de bajo nivel a partir de objetos de alto nivel. El contenido de nivel alto / bajo trata sobre las capacidades y el alcance de la operación, no sobre cuáles se pueden usar para construir el otro.
Anthony Williams
11

La siguiente explicación en realidad explica cómo la espera () y la señal () del monitor difieren de P y V del semáforo.

Las operaciones wait () y signal () en las variables de condición en un monitor son similares a las operaciones P y V en el recuento de semáforos .

Una declaración de espera puede bloquear la ejecución de un proceso, mientras que una declaración de señal puede hacer que otro proceso se desbloquee. Sin embargo, hay algunas diferencias.entre ellos. Cuando un proceso ejecuta una operación P, no necesariamente bloquea ese proceso porque el semáforo de conteo puede ser mayor que cero. Por el contrario, cuando se ejecuta una declaración de espera, siempre bloquea el proceso. Cuando una tarea ejecuta una operación V en un semáforo, desbloquea una tarea que espera en ese semáforo o incrementa el contador de semáforo si no hay ninguna tarea para desbloquear. Por otro lado, si un proceso ejecuta una declaración de señal cuando no hay otro proceso para desbloquear, no hay efecto en la variable de condición. Otra diferencia entre semáforos y monitores es que los usuarios despertados por una operación V pueden reanudar la ejecución sin demora. Por el contrario, los usuarios despertados por una operación de señal se reinician solo cuando el monitor está desbloqueado. Adicionalmente,

Enlace: aquí para leer más. Espero eso ayude.

Abu Shumon
fuente
6

Respuesta de una línea:

Monitor: controla que solo UN hilo a la vez puede ejecutarse en el monitor. (necesita adquirir el bloqueo para ejecutar el hilo único)

Semáforo: una cerradura que protege un recurso compartido. (necesita adquirir el bloqueo para acceder al recurso)

Billz
fuente
5

Semaphore permite que múltiples hilos (hasta un número establecido) accedan a un objeto compartido. Los monitores permiten el acceso mutuamente exclusivo a un objeto compartido.

Monitor

Semáforo

tafoo85
fuente
10
Pero, ¿cómo diferiría un monitor de un MutEx? Un bloqueo de exclusión mutua hace exactamente lo mismo que un semáforo, pero solo permite que un hilo acceda a la Región crítica a la vez.
user919860
2
Sí, ¿cuál es la diferencia entre un monitor y un mutex?
Pacerier
2
Vale la pena señalar que los semáforos no controlan el acceso a un objeto compartido, sino más bien un recurso compartido (que contendrá múltiples objetos).
xbonez
@xbonez: Si miramos java.util.ArrayList: ¿es un objeto o contenedor de múltiples objetos? Bueno, es ambos al mismo tiempo. Entonces, ¿es apropiado el semáforo para controlar el acceso a él? Yo diría que no.
dma_k
En la propia respuesta aceptada se menciona que Monitor está implementando la exclusión mutua. Consulte "Las funciones o métodos de miembro de un objeto monitor impondrán la exclusión mutua, por lo que solo un subproceso puede realizar cualquier acción sobre el objeto en un momento dado"
achoora
2

Cuando se utiliza un semáforo para proteger una región crítica, no existe una relación directa entre el semáforo y los datos que se protegen. Esta es parte de la razón por la cual los semáforos pueden estar dispersos alrededor del código, y por qué es fácil olvidar llamar en espera o notificar , en cuyo caso el resultado será, respectivamente, violar la exclusión mutua o bloquear el recurso permanentemente.

Por el contrario, puede ocurrir que estas cosas malas sucedan con un monitor. Un monitor está cansado directamente de los datos (los encapsula) y, dado que las operaciones del monitor son acciones atómicas, es imposible escribir código que pueda acceder a los datos sin llamar al protocolo de entrada. El protocolo de salida se llama automáticamente cuando se completa la operación del monitor.

Un monitor tiene un mecanismo incorporado para la sincronización de condiciones en forma de variable de condición antes de continuar. Si la condición no se cumple, el proceso tiene que esperar hasta que se le notifique un cambio en la condición. Cuando un proceso está esperando la sincronización de la condición, la implementación del monitor se ocupa del problema de exclusión mutua y permite que otro proceso obtenga acceso al monitor.

Tomado del material del curso "Proceso de interacción" de la Unidad 3 de la Universidad M362 de The Open University.

e.doroskevic
fuente
Excepto que, aunque los semáforos están disponibles en un lenguaje y se presentan en los libros de texto como un tipo de variable con operadores atómicos limitados, un semáforo es un caso especial de un monitor , porque es un tipo de variable con operadores atómicos limitados, porque eso es un monitor. Los argumentos anteriores de que los semáforos son de "nivel inferior" son engañosos.
philipxy
2

Semáforo

El uso de un contador o indicador para controlar el acceso a algunos recursos compartidos en un sistema concurrente implica el uso de Semaphore .

Ejemplo:

  1. Un mostrador para permitir que solo 50 pasajeros adquieran los 50 asientos (recurso compartido) de cualquier teatro / autobús / tren / diversión / aula. Y para permitir un nuevo Pasajero solo si alguien desocupa un asiento.
  2. Una bandera binaria que indica el estado libre / ocupado de cualquier baño.
  3. Los semáforos son un buen ejemplo de banderas. Controlan el flujo regulando el paso de vehículos en las carreteras (recurso compartido)

Las banderas solo revelan el estado actual del Recurso, sin conteo ni ninguna otra información sobre los objetos en espera o en ejecución en el recurso.

Monitor :

Un monitor sincroniza el acceso a un objeto comunicándose con hilos interesados ​​en el objeto, pidiéndoles que obtengan acceso o esperen a que se cumpla alguna condición.

Ejemplo:

  1. Un padre puede actuar como monitor de su hija, permitiéndole salir solo con un chico a la vez.
  2. Un maestro de escuela que usa bastón para permitir que solo un niño hable en la clase.
  3. Por último, uno técnico, las transacciones (a través de subprocesos) en un objeto de Cuenta sincronizado para mantener la integridad.
Barun
fuente
Creo que el semáforo en el cruce de la carretera también es una bandera binaria: los automóviles en una carretera o en una carretera ortogonal pueden conducir (mutuamente excluyentes), por lo tanto, el ejemplo (3) es el mismo que (2). También creo que esos ejemplos son casos de esquina para semáforos (caso trivial), que se pueden implementar usando monitor. Hay más ejemplos típicos en wikipedia .
dma_k