Semáforo vs. Monitores - qual a diferença?

233

Quais são as principais diferenças entre um monitor e um semáforo ?

user919860
fonte
8
Você pode pensar em monitor como um semáforo binário.
Maxim Egorushkin
semelhante: stackoverflow.com/q/3547030/158779
Brian Gideon
1
Por favor, acesse este albahari.com/threading/part2.aspx . Eu li este artigo, o melhor que eu já li sobre Threading
Shantanu Gupta
5
Eu não acho que você esteja certo, Maxim. Um semáforo é uma estrutura de "nível inferior", se não me engano, enquanto um Monitor é um objeto completo. Lembro que examinamos os monitores brevemente na minha classe de Sistemas Operacionais na faculdade, mas não me lembro como um Monitor diferia de um Mutex, além de ser orientado a objetos. Lembro-me de que um problema poderia ser feito usando monitores, mas não pudemos usar esse mesmo método na aula, devido às restrições da linguagem C.
user919860
1
Semáforo e Monitor são muito diferentes, mas equivalentes em potência, no sentido de que você pode implementar um do outro. Você pode ler o papel original de Hoare que comprova a sua equivalência de aqui
Thanh DK

Respostas:

529

Um monitor é um objeto projetado para ser acessado de vários threads. As funções-membro ou métodos de um objeto de monitor aplicarão exclusão mútua, portanto, apenas um encadeamento pode executar qualquer ação no objeto em um determinado momento. Se um thread atualmente estiver executando uma função de membro do objeto, qualquer outro thread que tentar chamar uma função de membro desse objeto terá que esperar até que o primeiro termine.

Um semáforo é um objeto de nível inferior. Você pode usar um semáforo para implementar um monitor. Um semáforo é essencialmente apenas um contador. Quando o contador for positivo, se um segmento tentar adquirir o semáforo, ele será permitido e o contador será diminuído. Quando um thread é concluído, ele libera o semáforo e incrementa o contador.

Se o contador já estiver zero quando um encadeamento tentar adquirir o semáforo, ele deverá aguardar até que outro encadeamento libere o semáforo. Se vários segmentos estiverem aguardando quando um segmento libera um semáforo, um deles o obtém. O encadeamento que libera um semáforo não precisa ser o mesmo que o adquiriu.

Um monitor é como um banheiro público. Somente uma pessoa pode entrar de cada vez. Eles trancam a porta para impedir que mais alguém entre, fazem suas coisas e a destrancam quando saem.

Um semáforo é como um local de aluguel de bicicletas. Eles têm um certo número de bicicletas. Se você tentar alugar uma bicicleta e eles tiverem uma gratuita, poderá levá-la, caso contrário, você deve esperar. Quando alguém devolve sua bicicleta, outra pessoa pode levá-la. Se você tem uma bicicleta, pode entregá-la a outra pessoa para retornar - o local de aluguel de bicicletas não se importa com quem a devolve, desde que a bicicleta seja devolvida.

Anthony Williams
fonte
162
+1 Ótima analogia com os banheiros públicos e o local de aluguel de bicicletas. Nunca vou esquecer a diferença entre os dois agora.
Drupad Panchal
4
Sua resposta parece contradizer stackoverflow.com/a/7336799/632951 .. então quem está certo?
Pacerier 8/12
6
@ Pacerier: Eu sou :-) A única contradição é a coisa de alto nível / baixo nível. Você pode criar um monitor a partir de semáforos, mas não é muito arrumado, precisamente porque um monitor é uma estrutura de nível superior a um semáforo. Um semáforo é apenas um contador de espera. Eu sugiro a leitura "The Little Book of Semáforos" greenteapress.com/semaphores
Anthony Williams
3
@ AnthonyWilliams: Talvez eu duvide da noção de que você só pode construir monitores a partir de semáforos. A outra maneira também é possível e, por isso, não podemos dizer profusamente que o monitor é uma entidade de nível superior aos semáforos.
Kavish Dwivedi 23/03
5
Sim, você pode criar um semáforo a partir de um monitor. Você sempre pode criar objetos de baixo nível a partir de objetos de alto nível. O nível alto / baixo é sobre recursos e escopo de operação, e não sobre o que pode ser usado para criar o outro.
Anthony Williams
11

A explicação a seguir explica realmente como a espera () e o sinal () do monitor diferem de P e V do semáforo.

As operações wait () e signal () nas variáveis ​​de condição em um monitor são semelhantes às operações P e V na contagem de semáforos .

Uma instrução de espera pode bloquear a execução de um processo, enquanto uma instrução de sinal pode fazer com que outro processo seja desbloqueado. No entanto, existem algumas diferençasentre eles. Quando um processo executa uma operação P, ele não necessariamente bloqueia esse processo porque o semáforo de contagem pode ser maior que zero. Por outro lado, quando uma instrução de espera é executada, ela sempre bloqueia o processo. Quando uma tarefa executa uma operação V em um semáforo, ela desbloqueia uma tarefa aguardando nesse semáforo ou incrementa o contador do semáforo, se não houver nenhuma tarefa a ser desbloqueada. Por outro lado, se um processo executar uma declaração de sinal quando não houver outro processo para desbloquear, não haverá efeito na variável de condição. Outra diferença entre semáforos e monitores é que os usuários despertados por uma operação V podem retomar a execução sem demora. Por outro lado, os usuários despertados por uma operação de sinal são reiniciados apenas quando o monitor é desbloqueado. Além do que, além do mais,

Link: aqui para ler mais. Espero que ajude.

Abu Shumon
fonte
6

Resposta de uma linha:

Monitor: controla apenas um segmento de cada vez que pode ser executado no monitor. (precisa adquirir bloqueio para executar o thread único)

Semáforo: um bloqueio que protege um recurso compartilhado. (precisa adquirir o bloqueio para acessar o recurso)

Billz
fonte
5

O semáforo permite que vários threads (até um número definido) acessem um objeto compartilhado. Os monitores permitem acesso mutuamente exclusivo a um objeto compartilhado.

Monitor

Semáforo

tafoo85
fonte
10
Mas, então, como um Monitor seria diferente de um MutEx? Um bloqueio de exclusão mútua faz exatamente a mesma coisa que um semáforo, mas apenas permite que um thread acesse a Região Crítica de cada vez.
user919860
2
Sim, qual é a diferença entre um mnitor e um mutex?
Pacerier 8/12
2
Vale ressaltar que os semáforos não controlam o acesso a um objeto compartilhado, mas a um recurso compartilhado (que conterá vários objetos).
Xbonez
@xbonez: Se olharmos para java.util.ArrayList: é um objeto ou contêiner de vários objetos? Bem, são os dois ao mesmo tempo. Então o semáforo é apropriado para controlar o acesso a ele? Eu diria: não.
31416 dma_k
Na própria resposta aceita, é mencionado que o Monitor está implementando a Exclusão Mútua. Consulte "As funções de membro ou métodos de um objeto do monitor irá impor exclusão mútua, portanto, apenas um thread pode estar executando qualquer ação sobre o objeto em um determinado momento"
achoora
2

Quando um semáforo é usado para proteger uma região crítica, não há relação direta entre o semáforo e os dados que estão sendo protegidos. Isso é parte do motivo pelo qual os semáforos podem ser dispersos pelo código e é fácil esquecer de ligar em espera ou notificar ; nesse caso, o resultado será, respectivamente, violar a exclusão mútua ou bloquear o recurso permanentemente.

Por outro lado, nunca mais essas coisas ruins podem acontecer com um monitor. Um monitor está cansado diretamente dos dados (encapsula os dados) e, como as operações do monitor são ações atômicas, é impossível escrever código que possa acessar os dados sem chamar o protocolo de entrada. O protocolo de saída é chamado automaticamente quando a operação do monitor é concluída.

Um monitor possui um mecanismo interno para sincronização de condição na forma de variável de condição antes de continuar. Se a condição não for atendida, o processo deverá aguardar até ser notificado sobre uma alteração na condição. Quando um processo está aguardando a sincronização da condição, a implementação do monitor cuida do problema de exclusão mútua e permite que outro processo obtenha acesso ao monitor.

Extraído do material do curso The Open University M362 Unidade 3 "Processo de interação".

e.doroskevic
fonte
Exceto que, embora os semáforos sejam geralmente disponibilizados em um idioma e apresentados em livros didáticos como um tipo de variável com operadores atômicos limitados, um semáforo é um caso especial de monitor - porque é um tipo de variável com operadores atômicos limitados, porque é isso que é um monitor. Os argumentos acima de que os semáforos são de "nível inferior" são ilusórios.
philipxy
2

Semáforo:

O uso de um contador ou sinalizador para controlar o acesso a alguns recursos compartilhados em um sistema simultâneo implica o uso do Semáforo .

Exemplo:

  1. Um balcão para permitir que apenas 50 passageiros adquiram os 50 assentos (recurso compartilhado) de qualquer teatro / ônibus / trem / passeio divertido / sala de aula. E permitir um novo passageiro somente se alguém desocupar um assento.
  2. Um sinalizador binário indicando o status de livre / ocupado de qualquer Banheiro.
  3. Semáforos são um bom exemplo de bandeiras. Eles controlam o fluxo regulando a passagem de veículos nas estradas (Recurso compartilhado)

Os sinalizadores apenas revelam o estado atual do Recurso, nenhuma contagem ou qualquer outra informação sobre os objetos em espera ou em execução no recurso.

Monitor :

Um Monitor sincroniza o acesso a um Objeto, comunicando-se com os segmentos interessados ​​no objeto, solicitando que eles obtenham acesso ou esperem que alguma condição se torne verdadeira.

Exemplo:

  1. Um pai pode atuar como monitor da filha, permitindo que ela namore apenas um rapaz de cada vez.
  2. Um professor da escola que usa o bastão para permitir que apenas uma criança fale na classe.
  3. Por fim, técnica, transações (via threads) em um objeto de Conta sincronizadas para manter a integridade.
Barun
fonte
Penso que o semáforo no cruzamento da estrada também é uma bandeira binária: carros em uma estrada ou em uma estrada ortogonal podem dirigir (mutuamente exclusivos), portanto o exemplo (3) é o mesmo que (2). Também acho que esses exemplos são maiúsculas e minúsculas para semáforos (caso trivial), que podem ser implementados usando o monitor. Existem exemplos mais típicos na wikipedia .
31416 dma_k