Quais são as principais diferenças entre um monitor e um semáforo ?
multithreading
semaphore
monitor
user919860
fonte
fonte
Respostas:
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.
fonte
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.
fonte
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)
fonte
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
fonte
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.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".
fonte
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:
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:
fonte