Sistemas operacionais
Processos
Semáforos
Semáforos
Mecanismo de sincronização que não requer espera ocupada Dijkstra propôs usar uma variável inteira para contar o no de WAKEUPs para uso futuro Menos complicado Esta variável, denominada semáforo, pode ter valor 0 (nenhum WAKEUP pendente) ou um valor inteiro positivo Apenas duas operações são definidas sobre estas variáveis: as operações P (Down) e V (Up)
Eduardo Nicola F. Zagari
2
Comunicação e Sincronização
1
(cont.) Semáforos
P(s) (Down) - checa o valor do semáforo. Se o valor é maior que 0 (zero), decrementa e continua. Se for igual a 0, o processo é posto para dormir Ação atômica: é garantido que, uma vez iniciada a operação, nenhum outro processo tem acesso ao semáforo (essencial para resolver problemas de sincronização e evitar condições de corrida) P(s) equivale a: Se s > 0 então s := s - 1 senão bloqueia o processo até s > 0 (= wait(s)) V(s) (Up) - se um ou mais processos estão dormindo no semáforo, um deles é escolhido aleatoriamente pelo SO e continua sua operação Down (o valor zero continua). Se não há ninguém “dormindo” no semáforo, incrementa o valor dele Operação também é indivisível V(s) equivale a: Verifica se existe uma lista com processos bloqueados por causa de s, se existe escolhe um e o “acorda”, deixando-o pronto para seguir sua execução de P(s) (= signal(s)) senão s := s + 1
Eduardo Nicola F. Zagari 3 Comunicação e Sincronização
Semáforos como um mecanismo de Semá sincronização geral sincronizaç
Semáforo Contador – valor inteiro positivo pode variar sem limites Semáforo Binário – valor inteiro só pode variar entre 0 e 1;
Também conhecido como mutex locks
Para fornecer exclusão mútua:
Semaphore S; // initialized to 1 P(S); criticalSection(); V(S);
Eduardo Nicola F. Zagari
4
Comunicação e Sincronização
2
Deadlock e Starvation
Deadlock – dois ou mais processos ficam esperando indefinidamente por um evento que pode ser causado apenas por um dos