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 paralelos. Semáforos são usados para evitar bloqueios e condições de corrida. Monitor é uma construção de linguagem de programação que também é usada para evitar que múltiplos processos acessem um recurso comum ao mesmo tempo, portanto, garante exclusão mútua. Os monitores usam variáveis condicionais para realizar esta tarefa.
O que é um semáforo?
O semáforo é uma estrutura de dados usada para fornecer exclusão mútua a seções críticas. Os semáforos suportam principalmente duas operações chamadas espera (historicamente conhecida como P) e sinal (historicamente conhecida como V). A operação de espera bloqueia um processo até que o semáforo seja aberto e a operação de sinal permite que outro processo (thread) entre. Cada semáforo está associado a uma fila de processos em espera. Quando a operação de espera é chamada por um encadeamento, se o semáforo estiver aberto, o encadeamento pode continuar. Se o semáforo for fechado quando a operação de espera for chamada por um encadeamento, o encadeamento será bloqueado e terá que aguardar na fila. A operação do sinal abre um semáforo e, se já houver um encadeamento aguardando na fila, esse processo poderá continuar e se não houver encadeamentos aguardando na fila, o sinal será lembrado para os próximos encadeamentos. Existem dois tipos de semáforos chamados semáforos mutex e semáforos contadores. Os semáforos Mutex permitem um único acesso a um recurso e os semáforos contadores 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 simultâneas de procedimentos. Um monitor garante que seus dados não sejam confrontados com acessos não estruturados e garante que os passos (que acessam os dados do monitor por meio de seus procedimentos) interagem de maneira legítima. Um monitor garante exclusão mútua, permitindo que apenas um thread execute qualquer procedimento de monitor em um determinado momento. Se outro encadeamento tentar chamar um método no monitor, enquanto um encadeamento já estiver executando um procedimento no monitor, o segundo procedimento será bloqueado e terá que aguardar na fila. Existem dois tipos de monitores denominados monitores Hoare e monitores Mesa. Eles diferem principalmente na semântica de agendamento.
Qual é a diferença entre Semáforo e Monitor?
Embora os semáforos e os monitores sejam usados para obter exclusão mútua em ambientes de programação paralelos, eles diferem nas técnicas usadas para realizar essa tarefa. Nos monitores, o código usado para obter 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, enquanto há 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.