Semáforos
- Conceito proposto por Edsger Wybe Dijkstra;
- É um mecanismo de sincronização utilizado para implementar, de forma simples, a exclusão mútua ou a sincronização condicional entre processos.
- É o principal mecanismo utilizado em projetos de sistemas operacionais ou em aplicações concorrentes.
- Atualmente a maioria das linguagens disponibiliza rotinas para uso de semáforos.
- Um semáforo é uma variável inteira, não negativa (não pode assumir valores menores do que zero), manipulados por instruções Down e Up, originalmente criadas pro Dijkstra como P e V.
- As instruções Down e Up são indivisíveis (não podem ser interrompidas).
- Onde a instrução Up incrementa uma unidade ao valor do semáforo e a Instrução Down decrementa.
- Quando uma instrução down executa em um semáforo com valor 0, o processo entra no estado de espera.
- Existem 2 tipos de semáforos: Binários (aquele que só assume valor 0 ou 1) ou contadores (pode assumir qualquer valor >= a 0).
Exclusão Mútua
- Pode ser implementada através de um semáforo binário associado ao recurso compartilhado.
- A principal vantagem em relação aos modelos apresentados anteriormente é que não ocorre a espera ocupada.
- Instruções de Down e Up funcionam como protocolos de entrada e saída, para que um processo possa entrar ou sair de sua região crítica.
- Semáforo = 1indica que nenhum processo esta utilizando o recurso, enquanto o valor 0 indica que o recurso esta em uso.
- Quando a instrução down é executada em um semáforo de valor 0, o processo fica impedido do acesso, permanecendo em estado de espera.
- Quando um processo sai da região critica é executado uma instrução UP, incrementando um valor no semáforo liberando o acesso ao recurso, após isso é verificado se existem processos esperando o recurso (na fila de espera), e são liberados.
- DESENHO
Sincronização condicional
- Semaforos podem ser utilizados quando a sincronização condicional é exigida. Um exemplo desse tipo de sincronização