trabalho sobre sistemas operacionais
Ivan Saraiva Silva
Ciência da Computação
2005.1
Aula 8
Quinta tentativa
• Dentro do loop testa se o outro processo também quer entrar na sua região crítica
• 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 solução correta para o problema da exclusão mútua de dois processos
(proposta na década de 60).
• O algoritmo combina variável de bloqueio e array de intenção.
• Usa uma variável adicional (turn) para realizar o desempate, no caso dos dois processos entrarem no loop de mútua cortesia. Algoritmo de Dekker
• Antes de entrar na região crítica P0 coloca seu flag em true e checa o flag de P1.
• Se o flag de P1 for false, então P0 pode entrar na região crítica
– Caso contrário P0 consulta a variável 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 região crítica 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;
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;
forever end; Algoritmo de Peterson
• Solução simples de 1981
• O processo ao tentar entrar na região crítica: – Seta a variável flag para true
– Indica para o caso de desempate que o outro processo será o vencedor
var flag: array [0...1] of boolean; turn: 0...1; turn := 1;
flag[0] :=