Semaphore vs Monitor
O semáforo é uma estrutura de dados usada para garantir que vários processos não acessem um recurso comum ou uma seção crítica ao mesmo tempo, em ambientes de programação paralela. Semáforos são usados para evitar bloqueios mortos e condições de corrida. Monitor é uma construção de linguagem de programação que também é usada para evitar que vários processos acessem um recurso comum ao mesmo tempo, portanto, garante a exclusão mútua. Os monitores usam variáveis condicionais para realizar essa tarefa.
O que é um semáforo?
O semáforo é uma estrutura de dados usada para fornecer exclusão mútua para seções críticas. Os semáforos suportam principalmente duas operações chamadas de espera (historicamente conhecidas como P) e sinal (historicamente conhecidas como V). A operação de espera bloqueia um processo até que o semáforo seja aberto e a operação de sinal permita a entrada de outro processo (thread). Cada semáforo está associado a uma fila de processos de espera. Quando a operação de espera é chamada por um segmento, se o semáforo estiver aberto, o segmento pode continuar. Se o semáforo for fechado quando a operação de espera for chamada por um thread, o thread será bloqueado e terá que esperar na fila. A operação do sinal abre um semáforo e se já houver um thread esperando na fila, esse processo pode prosseguir e se não houver nenhum thread esperando na fila, o sinal é lembrado para os próximos threads. Existem dois tipos de semáforos chamados semáforos mutex e semáforos de contagem. Os semáforos mutex permitem um único acesso a um recurso e os semáforos de contagem permitem que vários threads acessem um recurso (que possui várias unidades disponíveis).
O que é um monitor?
Um monitor é uma construção de linguagem de programação usada para controlar o acesso a dados compartilhados. Os monitores encapsulam estruturas de dados compartilhados, procedimentos (que operam em estruturas de dados compartilhados) e sincronização entre invocações de procedimentos simultâneos. Um monitor garante que seus dados não sejam confrontados com acessos não estruturados e garante que os treads (que acessam os dados do monitor por meio de seus procedimentos) interajam de maneira legítima. Um monitor garante exclusão mútua, permitindo que apenas um encadeamento execute qualquer procedimento de monitor em um determinado momento. Se outro encadeamento tentar invocar um método no monitor, enquanto um encadeamento já estiver executando um procedimento no monitor, o segundo procedimento será bloqueado e terá que esperar na fila. Existem dois tipos de monitores chamados monitores Hoare e monitores Mesa. Eles diferem principalmente em sua semântica de agendamento.
Qual é a diferença entre Semaphore e Monitor?
Embora os semáforos e os monitores sejam usados para obter exclusão mútua em ambientes de programação paralela, eles diferem nas técnicas usadas para realizar essa tarefa. Em monitores, o código usado para obter a exclusão mútua está em um único local e é mais estruturado, enquanto o código para semáforos é distribuído como chamadas de função de espera e sinal. Além disso, é muito fácil cometer erros ao implementar semáforos, embora haja muito pouca chance de cometer erros ao implementar monitores. Além disso, os monitores usam variáveis de condição, enquanto os semáforos não.