Aula 8
Quinta tentativa
Dentro do loop testa se o outro processo tambm quer entrar na sua regio crtica Em caso afirmativo o processo da a vez ao outro processo E se os processo ficarem cedendo a vez um ao outro?
Algoritmo de Dekker
Primeira soluo correta para o problema da excluso mtua de dois processos (proposta na dcada de 60). O algoritmo combina varivel de bloqueio e array de inteno. Usa uma varivel adicional (turn) para realizar o desempate, no caso dos dois processos entrarem no loop de mtua cortesia.
Algoritmo de Dekker
Antes de entrar na regio crtica P0 coloca seu flag em true e checa o flag de P1. Se o flag de P1 for false, ento P0 pode entrar na regio crtica
Caso contrrio P0 consulta a varivel turn. Se turn = 0 a vez de P0 insistir, P0 fica em busy wait testando o estado de P1.
P1 notar que a sua vez de declinar. Isso permite ao processo P0 prosseguir. Ao sair da regio crtica P0 coloca o seu flag em false e faz turn = 1, para transferir o direito para P1.
var flag: array [0...1] of boolean; turn: 0...1; turn := 1; procedure P0: begin repeat flag[0] := true; while flag[1] do if turn=1 then begin flag[0] := false; while turn =1 do {nothing} flag[0] := true; end; < critical section>; turn := 1; flag[0] := false; <remainder> forever end;
flag[0] := false; flag[1] := false; procedure P1: begin repeat flag[1] := true; while flag[0] do if turn=0 then begin flag[1] := false; while turn =0 do {nothing} flag[1] := true; end; < critical section>; turn := 0; flag[1] := false; <remainder> forever end;
Algoritmo de Peterson
Soluo simples de 1981 O processo ao tentar entrar na regio crtica:
Seta a varivel flag para true Indica para o caso de desempate que o outro processo ser o vencedor
procedure P0; begin repeat flag[0] := true; turn := 1; while flag[1] and turn = 1 do {nothing}; <critical section>; flag[0] := false; <remainder> forever End;
procedure P1; begin repeat flag[1] := true; turn := 0; while flag[0] and turn = 0 do {nothing}; <critical section>; flag[1] := false; <remainder> forever end;
Algoritmo de Peterson
Excluso mtua atingida.
Uma vez que P0 tenha feito flag[0] = true, P1 no entrar na regio crtica na primeira tentativa. A varivel turn sempre resolve o desenpate
Instruo TSL
Soluo de hardware em ambiente de mltiplos processadores Soluo atmica
O processador executando TSL bloqueia o barramento
A instruo TSL
L e compara o contedo de uma varivel e escreve um valor diferente de zero caso esteja zerada
Instruo TSL
boolean testset (int lock) { if (loock == 0) { loock =1; return true; } else { return false; } }
Quando o buffer est vazio o consumidor executa sleep e vai dormir esperando que o produtor o acorde
Um wakeup executado pelo produtor ao produzir um dado acorda o consumidro
Produtor
Produtor produz um item, insere-o no buffer e incrementa count. Como count = 1, produtor chama wakeup para acordar consumidor.
Consumidor
executa sleep e vai dormir
Produtor
Produz at encher o buffer, executa sleep() e vai dormir
Ambos dormiro eternamente O sinal de wakeup do produtor foi perdido (no teve efeito), pois o consumidor ainda no estava logicamente adormecido.
Semforos
Down(semforo): testa se o valor do semforo maior que zero
Se for, o semforo decrementado e o processo continua Caso contrrio o processo posto para dormir
A operao de incrementar o semforo e acordar um processo tambm atmica Semforos que assumem somente os valores 0 (livre) e 1 (ocupado) so denominados semforos binrios ou mutex
Mutex
Mutex (mutual exclusion) um semforo que s pode assumir dois valores
Impedido (zero) Desimpedido (um)
Manipulao com:
Mutex_lock():
Testa o mutex e o coloca em impedido se estiver desimpedido, bloqueia o processo caso contrrio
Mutex_unlock():
Coloca o mutex em desinpedido
Monitores
No cdigo ao lado suponha os downs invertidos Se o buffer est cheio o produtor bloqueado com mutex em zero O consumidor fazendo down no mutex tambm seria bloqueado
Resultando em deadlock
void producer(void) { int item; while(TRUE)) { item = produce_item(); down(&empty); down(&mutex); insert_item(item); up(&mutex); up(&full) } }
Monitores
Monitores uma unidade bsica de sincronizao de alto nvel Dados e estruturas do monitor s podem ser acessados por seus procedimentos Somente um processo pode estar ativo em um monitor em um dado instante Proposta
As sees crticas devem ser codificadas como procedimentos do monitor e no dentro de cada processo Quando um processo referencia dados compartilhados, ele chama um procedimento do monitor. Monitor uma construo da linguagem, cabe ao compilador garantir a excluso mtua
Monitores
Excluso mtua fcil, mas e o bloqueio dos processos? Variveis de Condio ou Condicionais
So variveis associadas a condies que provocam a suspenso e a reativao de processos dentro do monitor S podem ser declaradas dentro do monitor So usadas por dois procedimentos especiais
wait(condio): signal(condio):
Variveis de Condio
Wait (condio)
O monitor bloqueia o processo que fez a chamada As informaes sobre o processo bloqueado so armazenadas em uma estrutura de dados associada varivel
Signal (condio)
O monitor desbloqueia um dos processos da fila associada varivel de condio.
Variveis de Condio
IMPLEMENTAO de signal(condio) Soluo #1
O processo sinalizador imediatamente bloqueado O processo recentemente desbloqueado passa a executar
Soluo #2
O processo sinalizador conclui a operao em curso O processo recentemente desbloqueado aguarda que o sinalizador saia do monitor