O que é o Semaphore? Contando, tipos binários com exemplo

O que é o 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ística de Semaphore

Aqui estão 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 comuns de semáforos são

  • Contando semáforos
  • Semáforos binários.

Contando Semaphores

Este tipo de Semaphore usa uma contagem que ajuda a tarefa a ser adquirida ou liberada inúmeras vezes. Se a contagem inicial = 0, o semáforo de contagem deve ser criado no estado indisponível.

Contando Semaphores
Contando Semaphores

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 seu valor é restrito a 0 e 1. Neste tipo de semáforo, a operação de espera funciona apenas se o semáforo = 1, e a operação de sinal é bem-sucedida quando o semáforo = 0. É fácil implementar do que contar semáforos.

Binário Semaphores

Binário Semaphores

Exemplo de Semaphore

O programa fornecido a seguir é uma implementação passo a passo, que envolve o uso e declaração de 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.

Copy CodeP(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).

Copy CodeP(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

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 e 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:

  • Permite que mais de um 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.

Desvantagem dos semáforos

Aqui estão os contras/desvantagens do semáforo

  • Uma das maiores limitações de um semáforo é a inversão de prioridade.
  • O sistema operacional deve acompanhar todas as chamadas de espera 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, por isso há possibilidades de não se alcançar 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.

Resumo

  • Semaphore é definido como uma variável não negativa e compartilhada entre threads.
  • É um mecanismo que pode ser usado para fornecer sincronização de tarefas.
  • O semáforo de contagem usa uma contagem que ajuda a tarefa a ser adquirida ou liberada inúmeras vezes.
  • Os semáforos binários são bastante semelhantes aos semáforos de contagem, mas seu valor é restrito a 0 e 1.
  • A operação de espera ajuda você a controlar a entrada de uma tarefa na seção crítica
  • Signal A operação de semáforo é usada para controlar a saída de uma tarefa de uma seção crítica
  • Contando Semaphore não tem exclusão mútua, enquanto binário Semaphore tem exclusão mútua
  • Semaphore significa um mecanismo de sinalização, enquanto Mutex é um mecanismo de bloqueio
  • Semaphore permite que mais de um thread acesse a seção crítica
  • Uma das maiores limitações de um semáforo é a inversão de prioridade.