Aula 30/04¶
Voltando ao algoritmo de Bakery¶
Vamos ver uma maneira de tirar o for de dentro da sessão critica.
int turn[1:n] = ([n]0)
process CS[i = 1 to n]
while (true)
turn[i] = 1
turn[i] = max(turn[1:n])+1
for [j = 1 to n such that j != i]
while (turn[j] != 0 and (turn[i], i) > (turn[j], j))
sleep
sessao_critica()
turn[i] = 0
Sessao_nao_critica()
Porém estre codigo é limitado pelo tamanho do da varival turn, pois quando ela estoura, o codigo quebra.
Algoritmo de Lamport¶
A ideia do algoritmo é usar duas portas para a entrada na sessão critica.
- Coloco que quero entrar na primeira porta
- Se a segunda estiver vazia, coloco eu nela
- Checo se meu numero continua na primeira
Um algoritmo generalizado é:
int gate1 = gate2 = 0
process CS[i:n]
while (true)
Sessao_nao_critica()
p1: gate1 = 1
want[i] = true
if (gate2 != 0)
want[i] = false
goto p1:
gate2 = p
if (gate1 != 1)
want[i] = false
for all other process j
await want[j] = false
if (gate2 != 1)
goto p1:
else
want[i] = true
sessao_critica()
gate2 = 0
want[i] = false