Semáforos



Imagine uma casa de banho onde apenas pode estar uma pessoa de cada vez. Na porta, existe um pequeno círculo indicador de presença ou não de alguém no seu interior. Quando uma pessoa chega, certifica-se se pode entrar. Em caso afirmativo, entra e passa o círculo a vermelho. Se não puder entrar, espera pela sua vez na fila que pode, ou não, existir.


  
      pessoa chega
enquanto não entrar se marcador=verde e não há ninguém à frente entra marcador=vermelho ... sai marcador=verde senão espera
O que se passa neste caso é que podemos ter mais do que uma pessoa a tentar aceder, no mesmo instante, ao mesmo espaço.

Tente agora imaginar o caso de uma ponte muito estreita por onde tentam passar veículos em ambos os sentidos. É necessário que, antes de entrar na ponte, os condutores se certifiquem de que não há ninguém a atravessá-la nesse momento. Só nessa altura a poderão atravessar em segurança.

  
	veículo chega à ponte
	enquanto não atravessar a ponte
	  se não há nenhum veículo a atravessar a ponte em sentido contrário 
	    atravessa
	  senão
	    espera
  

Muitos estudos já foram feitos nesta área e, como não podia deixar de ser, foram criados cenários típicos para o estudo destes problemas. Um desses exemplos é o caso dos Leitores/Escritores.


Tente agora aperfeiçoar o cenário anterior...
Não há qualquer problema se mais do que um veículo circular na ponte desde que todos o façam no mesmo sentido. Assim, desde que o primeiro se certifique que não vem ninguém em sentido contrário, todos os outros que seguem atrás de si, podem avançar, bastando para isso, assegurarem-se de que há pelo menos um veículo na ponte a circular no seu sentido.

  
	veículo chega à ponte
	enquanto não atravessar a ponte
	  se há algum veículo na ponte seguindo o seu sentido ou
	  se não há nenhum veículo a atravessar a ponte em sentido contrário 
	    atravessa
	  senão
	    espera
  

Leitores/Escritores

Complicando um pouco mais... Imagine que a ponte se encontra à saída de uma cidade, e que quem sai tem prioridade. Neste caso, já não chega verificar os pontos mencionados acima, mas há que também verificar se há alguém com mais prioridade que nós, que, não estando na ponte, o queira fazer.
  
	veículo com prioridade chega à ponte
	enquanto não atravessar a ponte
	  se há algum veículo na ponte seguindo o seu sentido ou
	  se não há nenhum veículo a atravessar a ponte em sentido contrário 
	    atravessa
	  senão
	    espera

	veículo sem prioridade chega à ponte
	enquanto não atravessar a ponte
	  se não há nenhum veículo a atravessar a ponte em sentido contrário ou
	  se não há nenhum veículo do outro lado para atravessar ou
	  se há algum veículo na ponte seguindo o seu sentido
	    atravessa
	  senão
	    espera
  

Leitores/Escritores

Para que isto se possa fazer em termos programação concorrente, os sistemas operativos oferecem a possibilidade de, recorrendo a Semáforos, bloquear a execução dos processos até que seja verificada a condição necessária para que estes possam prosseguir.

Um semáforo não passa de uma variável partilhada e que pode assumir valores inteiros. O valor que o semáforo assume indica o número de processos que, nesse momento, se encontram dentro da secção crítica.

Assim, o valor máximo que um semáforo pode alcançar é o número máximo de processos que se podem admitir a essa zona restrita do programa. Para um semáforo de exclusão mútua, por exemplo, o máximo valor admitido é 1, sendo que 0 indica a ausência de processos no interior da zona de acesso exclusiva, e um valor negativo denuncia o número de processos que aguardam vez para entrar.

Atenção! O uso de Semáforos, se não for feito com bastante cuidado pode conduzir a deadlock .



Signals Enviar mail aos autores


HomePage Menu Mecanismos de Sincronização Signals Semáforos Comunicação entre Processos Pipes Memória Partilhada Problemas de Programação Concorrente Glossário Links