MFP

Logo

Índice

Métodos Formais em Engenharia de Software
Cálculo de Sistemas de Informação
Programação Ciber-física
Verificação Formal
Calendário | Sumários
Anos anteriores
Alumni

Verificação Formal: Teste

Verificação de algoritmos concorrentes

Considere o seguinte algoritmo concorrente, onde se pretende implementar uma “barreira” entre N processos. O objetivo da barreira é que depois de um process iniciar a execução apenas termine quando todos os N processos já tiverem também iniciado.

   var n : 0..N = 0;
       lock : boolean = true;
       waiting : array 1..N of boolean = [N of false];

   procedure process(i : integer);
   begin
0:   repeat until lock;
     lock := false;
     n := n + 1;
1:   while (n < N) do
     begin
       waiting[i] := true;
       lock := true;
2:     repeat until (lock and not waiting[i]);
       lock := false;
     end;
     waiting = [N of false];
     lock := true;
3:   
   end;

   process(1) || ... || process(N)

Exercício (8 pontos): especifique este algoritmo em TLA+.

Exercício (4 pontos): mostre como pode especificar e verificar as seguintes propriedades (no caso das propriedades de liveness tente encontrar as condições de justiça mais fracas que permitem a sua verificação).

Exercício (2 pontos): mostre como poderia verificar que as propriedades acima são válidas mesmo que a qualquer momento aconteça um erro e um dos bits do array waiting seja colocado a false.

Verificação de algoritmos distribuídos

Considere o seguinte algoritmo distribuído onde dois processos trocam mensagens com o objetivo de conseguirem sortear um valor entre 1 e 2 que seja diferente para os dois processos (quando o algoritmo termina, o valor sorteado estará guardado na variável result).

  var inbox : array 0..1 of channel;

  procedure (i : integer);
    var result : 0..2 = 0;
        try : 1..2;
  begin
    send(inbox[1-i],try);    
0:  while true do
    begin
      if result = 0 and not empty(inbox[i]) then
        if receive(inbox[i]) = try
        then
        begin
            try := 1..2;
            send(inbox[1-i],try)
        end
        else result = try 
    end
  end;

  procedure(0) || procedure(1)

Exercício (3 pontos): especifique este algoritmo em TLA+, assumindo que as mensagens são entregues por ordem e não há perdas de mensagens.

Exercício (3 pontos): mostre como pode especificar e verificar as seguintes propriedades (no caso das propriedades de liveness tente encontrar as condições de justiça mais fracas que permitem a sua verificação).