O que é a Semaphore? Contando, tipos binários com exemplo
⚡ Resumo Inteligente
Semaphore Em um sistema operacional, uma variável inteira não negativa é compartilhada entre threads e coordena o acesso a recursos compartilhados por meio de duas operações atômicas, wait e signal, evitando condições de corrida durante a sincronização de processos.

O que é a Semaphore?
Semaphore é simplesmente uma variável que não é negativa e compartilhada entre threads. Um semáforo é um mecanismo de sinalização, e uma thread que está esperando por um semáforo pode ser sinalizada por outra thread. Ele usa duas operações atômicas, 1) Wait, e 2) Signal para a sincronização do processo.
Um semáforo permite ou proíbe o acesso ao recurso, o que depende de como ele está configurado.
Características dos Semaphore
Eis as características de um semáforo:
- É um mecanismo que pode ser usado para fornecer sincronização de tarefas.
- É um mecanismo de sincronização de baixo nível.
- Semaphore sempre conterá um valor inteiro não negativo.
- Semaphore pode ser implementado usando operações de teste e interrupções, que devem ser executadas usando descritores de arquivo.
Tipos de Semaphores
Os dois tipos mais comuns de semáforos são:
- Contando semáforos
- Semáforos binários
Contando Semaphores
Este tipo de Semaphore Utiliza uma contagem que permite que uma tarefa seja adquirida ou liberada diversas vezes. Se a contagem inicial for igual a 0, o semáforo de contagem deve ser criado no estado indisponível.
Porém, se a contagem for> 0, o semáforo é criado no estado disponível e o número de tokens que possui é igual à sua contagem.
Binário Semaphores
Os semáforos binários são bastante semelhantes aos semáforos de contagem, mas seus valores são restritos a 0 e 1. Nesse tipo de semáforo, a operação de espera só funciona se o semáforo for igual a 1, e a operação de sinalização é bem-sucedida quando o semáforo for igual a 0. Sua implementação é mais simples do que a dos semáforos de contagem.
Exemplo de Semaphore
O programa apresentado abaixo é uma implementação passo a passo que envolve o uso e a declaração de um semáforo.
Shared var mutex: semaphore = 1;
Process i
begin
.
.
P(mutex);
execute CS;
V(mutex);
.
.
End;
Espere e Signal Operações em Semaphores
Ambas as operações são usadas para implementar sincronização de processo. O objetivo desta operação de semáforo é obter exclusão mútua.
Esperar por Operação
Este tipo de operação de semáforo ajuda a controlar a entrada de uma tarefa na seção crítica. No entanto, se o valor de espera for positivo, o valor do argumento de espera X será decrementado. No caso de valor negativo ou zero, nenhuma operação é executada. Também é chamada de operação P(S).
Após a diminuição do valor do semáforo, que se torna negativo, o comando é mantido até que as condições exigidas sejam satisfeitas.
P(S)
{
while (S<=0);
S--;
}
Signal operação
Este tipo de Semaphore operação é usada para controlar a saída de uma tarefa de uma seção crítica. Ela ajuda a aumentar o valor do argumento em 1, que é denotado como V(S).
P(S)
{
while (S>=0);
S++;
}
Contando Semaphore vs. Binário Semaphore
Aqui estão algumas diferenças importantes entre contagem e semáforo binário:
| Contando Semaphore | Binário Semaphore |
| Sem exclusão mútua | Exclusão mútua |
| Qualquer valor inteiro | Valor apenas 0 e 1 |
| Mais de um slot | Apenas um slot |
| Fornecer um conjunto de processos | Tem um mecanismo de exclusão mútua. |
Diferença entre Semaphore versus mutex
A tabela abaixo compara um semáforo com um mutex em diversos parâmetros:
| Parâmetros Técnicos | Semaphore | Mutex |
| Mecanismo | É um tipo de mecanismo de sinalização. | É um mecanismo de bloqueio. |
| Tipo de dados | Semaphore é uma variável inteira. | Mutex é apenas um objeto. |
| Modificação | As operações de espera e sinal podem modificar um semáforo. | É modificado apenas pelo processo que pode solicitar ou liberar um recurso. |
| Gestão de recursos | Se nenhum recurso estiver livre, então o processo requer um recurso que deve executar a operação de espera. Deve-se esperar até que a contagem do semáforo seja maior que 0. | Se estiver bloqueado, o processo terá que esperar. O processo deve ser mantido em fila. Isso precisa ser acessado somente quando o mutex estiver desbloqueado. |
| Fio | Você pode ter vários threads de programa. | Você pode ter vários threads de programa em mutex, mas não simultaneamente. |
| Propriedade | O valor pode ser alterado por qualquer processo que libere ou obtenha o recurso. | O bloqueio do objeto é liberado apenas pelo processo que o obteve. |
| Tipos | Tipos de Semaphore estão contando semáforo e semáforo binário. | Mutex não possui subtipos. |
| Divisão de | Semaphore o valor é modificado usando as operações wait() e signal(). | O objeto Mutex está bloqueado ou desbloqueado. |
| Ocupação de Recursos | Ele está ocupado se todos os recursos estiverem sendo utilizados e o processo solicitante do recurso realizar a operação wait () e se bloquear até que a contagem do semáforo se torne >1. | Caso o objeto já esteja bloqueado, o processo que solicita recursos aguarda e é enfileirado pelo sistema antes que o bloqueio seja liberado. |
Vantagens de Semaphores
Aqui estão os prós/benefícios de usar Semaphore:
- Isso permite que mais de uma thread acesse a seção crítica.
- Semaphores são independentes da máquina.
- Semaphores são implementados no código independente de máquina do microkernel.
- Eles não permitem que vários processos entrem na seção crítica.
- Como há uma espera ocupada no semáforo, nunca há desperdício de tempo e recursos de processo.
- Eles são independentes de máquina, e devem ser executados no código independente de máquina do microkernel.
- Eles permitem o gerenciamento flexível de recursos.
Desvantagens de Semaphores
Aqui estão as desvantagens do uso de semáforos:
- Uma das maiores limitações de um semáforo é a inversão de prioridade.
- O sistema operacional precisa manter track de todas as chamadas para aguardar e sinalizar o semáforo.
- Seu uso nunca é obrigatório, mas é apenas por convenção.
- Para evitar deadlocks no semáforo, o Wait e Signal as operações precisam ser executadas na ordem correta.
- Semaphore A programação é complicada, então há chances de não se conseguir a exclusão mútua.
- Também não é um método prático para utilização em larga escala, uma vez que a sua utilização conduz à perda de modularidade.
- Semaphore é mais sujeito a erros do programador.
- Pode causar impasse ou violação de exclusão mútua devido a erro do programador.


