Exclusão Mútua Distribuída Raimundo Macêdo Laboratório de Sistemas Distribuídos - LaSiD Universidade Federal da Bahia
Propriedades de um programa distribuído (Lamport, 1977) Exemplo 2: sistema controlando semáforos safety: dois semáforos numa estarão verde ao mesmo tempo liveness: um carro esperando na luz vermelha, receberá luz verde no futuro
Comunicação Processos em Sistemas Centralizados Compartilhamento de Memória Primitivas: Semáforos, filas de mensagens, monitores, sinais etc Relógio Único RAM Pi Pn Pj Pk
Comunicação Processos em Sistemas Distribuídos Troca de Mensagens Primitivas: send(destino, mensagem) e receive(origem, mensagem) Pi Pj Pk Pn RAM RAM RAM RAM
Sincronização entre Processos Race condition: dois processos compartilham dados e o resultado depende de quem executa exatamente quando
Exemplo de Race Condition Extraído do livro Tanenbaum pg. 54 spooler de fila de impressão 1- A atualiza nexta = in + 1 2- A é interrompido pelo escalonador 3 - B atualiza netxb := in + 1 Processo A Processo B 4 5 6 7 abc prog.c prog.n 4 - B faz spooler [nextb] := file; in := nextb; /* in = 7 * / 5 - Escalonador coloca A na CPU 6 - A faz spooler [nexta] := file; in := nexta; /* in = 7 * / out = 4 in = 6 in e out são variáveis compartilhadas Arquivo de B nunca será impresso
Formulação Abstrata do Requisito de Sincronização região crítica: parte do programa que acessa o recurso compartilhado exclusão mútua: garantia de que, se um processo está acessando a sua região crítica, nenhum outro processo estará fazendo o mesmo
Requisitos de uma boa solução dois processos não podem estar simultaneamente em suas regiões críticas (safety) nenhuma consideração deve ser feita sobre velocidades relativas de execução de processos nenhum processo executando fora de sua região crítica pode bloquear outros processos (safety) processos devem em algum instante poder entrar em suas regiões críticas (liveness)
Métodos para Exclusão Mútua Desligar (desabilitar) interrupções Alternação estrita (strict alternation) Solução de Peterson Instrução TSL (test and set lock) Semáforos Monitores Troca de Mensagens
Exclusão Mútua em Sistemas Distribuídos
Exemplos Texto 1 REDE Data 1 Data 2 Data 3 Texto 2 Texto 3
Sistema Centralizado Memória comum ==> semáforo Relógio Comum ==> timestamps perfeitos Troca de Mensagens
Safety EM1 : no máximo um processo pode executar a região crítica por vez Liveness EM2 : um processo que deseje entrar na RC garantidamente terá acesso num tempo finito (desde que processos ocupando a RC a deixem num tempo finito) ==> não há deadlock ou stavation Causal Order acessos são consedidos respeitando-se a ordem causal
Enter ( )...RC... Exit( ) Fila de pedidos Pede token Recebe token Libera token
EM1 - EM2 - EM3? Enter ( )...RC... Exit( ) Fila de pedidos P1 P2 pede token P3 libera token P 4 recebe token
Enter ( )...RC... Exit( ) CUSTO : 3 mensagens (2 para ENTER e 1 para EXIT) Problemas: 1) bottleneck no Server 2) Server é um ponto de falha crítico ==> como escolher um novo server e como atualizar seu estado 3) falha de processos impede progresso (liveness)
resposta P2 P1 pedido P2 1) processos conhecem os endereços de seus pares (membership estático e conhecido); P3 2)mensagens transmitidas são garantidamente entregues; 3) Pi mantém um relógio lógico Ci;
LC1 : event send (m) LCi := LCi + 1 T := LCi send (m, m.t) LC2 : receive (m) LCi := max (LCi, m.t) + 1 Mensagens para pedido de token são da forma: <T, Pi> Identificador do processo timestamp
Ideia Básica (ricard and Agrawala, 1981) Para entrar na RC : send to all <T, Pi, nome da RC> Quando Pi recebe uma mensagem: <T, Pj, nome RC> 1) se Pi não está na RC send OK 2) se Pi está na RC enfila pedido (T,Pj, nome RC> 3) se Pi deseja entrar na RC compara seu próprio Ti com os demais Tj se Ti não é o menor send OK senão enfila <T, Pj, nome RC> Quando Pi recebe OK de todos Entra RC Send OK to all removes all from local queue,
Exemplo (Tanembaun DS, pg 136) 8 0 12 8 8 1 2 12 12 Entra RC 0 ok ok 1 2 ok 0 1 2 ok
On initialization: state:= RELEASED {RESEASED, WANTED, HELD) To obtain a token: state:= WANTED; Multicast request to all processes T:= resquest s timestamp On receipt of a request <Ti, pi> at pj (i dif. J) if (state = HELD or (state = WANTED and (T,pj) < (ti,pi))) then queue request from pi without replying; else reply immediately to pi; endif To release token state := RELEASED; reply to any queued requests; empty queue.
CUSTO : 2 (n-1) : point-to-point n : multicast Problemas 1)custo de transmissão 2)falha de componentes (impede progresso) 3) todos os processos recebem e processam todos os pedidos (bottleneck = server centralizado)
P1 P2 Token P3 P4 Custo : 1 a n-1 msgs. Problemas : falhas e comunição na ausência de pedidos