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.

  1. Coloco que quero entrar na primeira porta
  2. Se a segunda estiver vazia, coloco eu nela
  3. 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