Semáforos e o Problema dos Filósofos Comensais
Semáforos
Semáforos são ferramentas de sincronização utilizadas para resolver problemas de seções críticas e sincronização. Trata-se de uma variável inteira que só pode ser acessada através de duas operações atômicas: Wait (P) e Signal (V).
- Wait (P): Diminui o valor do semáforo. Se o valor se tornar negativo, o processo é bloqueado.
- Signal (V): Aumenta o valor do semáforo. Se o valor for positivo, um processo bloqueado pelo Wait é desbloqueado.
Sistemas operacionais utilizam semáforos para controlar o acesso a seções críticas ou compartilhamento de recursos. O semáforo é inicializado com um valor correspondente ao número de recursos disponíveis. Quando o contador é 0, todos os recursos estão em uso e os processos que tentam acessá-los são bloqueados até que o contador seja maior que 0.
Aplicação e Espera Ocupada
Para evitar a espera ocupada (onde o processo consome ciclos de CPU enquanto aguarda um recurso), utiliza-se o método de bloqueio. Quando um recurso não está disponível, o processo é colocado em uma fila associada ao semáforo e passa ao estado de espera, liberando a CPU para outros processos. Ao receber um sinal (Signal), o processo é despertado e movido para a fila de prontos.
O Problema dos Filósofos Comensais
Este é um problema clássico de sincronização que ilustra a necessidade de alocação de recursos entre múltiplos processos. Considere cinco filósofos em uma mesa redonda com cinco pratos e cinco pauzinhos:
- Um filósofo pensa e, quando sente fome, tenta pegar os dois pauzinhos mais próximos.
- Só é possível pegar um pauzinho por vez.
- Não é permitido pegar um pauzinho que já esteja nas mãos de outro filósofo.
- Ao terminar de comer, o filósofo libera os pauzinhos e volta a pensar.
Solução: Cada pauzinho pode ser representado por um semáforo. O filósofo tenta pegar o pauzinho executando a operação Wait e libera os recursos com a operação Signal.