• Nenhum resultado encontrado

4.4 Estudo comparativo: protocolo de difusão confiável sender-initiated

5.1.2 Desenvolvimento de protocolo de comunicação em grupo self-aware

5.1.2.1 Mecanismo de blocos causais

O mecanismo de blocos causais permite implementar a difusão atômica confiável com orde- nação total em um protocolo de comunicação em grupo. Cada processo pimantém um relógio

lógico, denominado block counter de pi, ou BCi. BCi é uma variável inteira cujo valor incre-

menta monotonicamente. Quando um grupo g é criado, o respectivo BCi de cada pi é iniciado

com um inteiro não-negativo – sem perda de generalidade, todos podem ser iniciados com o valor zero. Mensagens transmitidas são rotuladas com o block counter do emissor, e, de forma similar ao relógio lógico de Lamport [62], este rótulo obedece a causalidade potencial – ou seja, a relação happen-before indicada por →. Ou seja, se m → m0, então o rótulo temporal associ- ado com m’ será maior que o associado com m. Contudo, o inverso nem sempre se mantém: se duas mensagens possuem diferentes rótulos temporais, estas podem ser concorrentes. De forma similar à evolução do relógio lógico de Lamport em face a eventos de envio/recepção, o block counteravança em face de eventos de envio/entrega, uma vez que uma mensagem transmitida pode ter dependência causal apenas de mensagens que foram entregues previamente.

Imediatamente antes de um processo pienviar uma mensagem m ao grupo g, este incrementa

em um o valor de BCi. Este valor incrementado torna-se o rótulo temporal de m, como número

do bloco no campo m.b. pi pode atualizar o valor de BCi ainda se houver a entrega de uma

mensagem m (denoted deliveryi(m)) cujo valor m.b associado é maior que o valor atual de BCi.

Desta forma, estas duas regras definem o incremento de BCi:

• CA1 (Incremento do block counter em face de sendi(m)): Antes de pi difundir m, este

incrementa em um o valor de BCi, e associa este valor atualizado ao rótulo temporal m.b;

e,

• CA2 (Incremento do block counter em face de deliveryi(m)): Antes de pientregar m, este

atualiza o valor de BCipara max{BCi, m.b}.

A partir das regras CA1 e CA2, podemos definir as seguintes propriedades que associam precedência de eventos, onde sendiindica um evento de send executado pelo processo pi:

• pr1: sendi(m) → sendi(m0) ⇒ m.b < m0.b

5.1 COMUNICAÇÃO EM GRUPO 53 • pr3: ∀ m’, m” : m’.b = m”.b ⇒ m’ and m” are concurrent.

As propriedades pr1 e pr2 seguem diretamente de CA1 e CA2, respectivamente. Em con- junto, implicam que para quaisquer duas mensagens m, m’: send(m) → send(m’) ⇒ m.b < m’.b. A propriedade pr3 define que duas mensagens difundidas com mesmo número de bloco são necessariamente concorrentes e foram envadas por processos distintos, uma vez que CA1 veda o envio de dois eventos de send executado pelo mesmo processo com o mesmo valor de BC.

Matriz de Blocos Causais

Cada processo pi representa mensagens concorrentes (propriedade pr3) enviadas/recebidas

com mesmo número de bloco por meio de um bloco causal. A construção destes blocos causais resulta na noção de uma matriz de blocos que é uma forma de representação matricial das mensagens enviadas/recebidas com diferentes números de bloco. Um bloco causal é um vetor de tamanho igual ao número n de processos de Π. Sempre que uma mensagem com novo número de bloco, dito B, difundida por um processo pié enviada ou recebida por um processo,

este cria um novo vetor de tamanho n; para qualquer mensagem difundida (enviada/recebida) com o número de bloco B, define-se a i-ésima entrada do vetor em ’+’; e, para quaisquer novas mensagens difundidas com mesmo número de bloco B enviadas/recebidas de outro processo pj, j 6= i, define-se a j-ésima entrada do vetor em ’+’. Desta forma, os blocos causais atendem

a seguinte propriedade:

• PR1 : em um mesmo bloco causal, apenas mensagens concorrrentes são representadas. Em uma aplicação de comunicação em grupo, se a difusão de mensagens pelos processos ocorre de forma contínua, o número de blocos causais construídos incrementará ao longo do tempo. Cada processo ordena seus blocos causais de forma crescente do número de bloco que representam, formando uma matriz de blocos denominada BM. De forma que BM[B] representa o bloco causal de número de bloco B. Para o BM associado a quaisquer dos processos, podemos definir a seguinte propriedade:

• PR2: considere as mensagens m e m’, representados em BM[B] e BM[B’], respectiva- mente, se há precedência causal entre elas de forma que m → m0, então B < B0.

Por exemplo, a Figura 5.2 representa a matriz de blocos de um processo dos 6 que compõem um dado grupo. Esta representa todas mensagens enviadas ou recebidas por este dado processo que possui a matriz. Por exemplo, a matriz da Figura 5.2 indica que o número de blocos das últimas mensagens recebidas dos processos p1e p2são, respectivamente, 4 e 5.

Completude de Blocos

De acordo com a propriedade PR1, todas mensagens que pertencem a um dado bloco causal, por exemplo, BM[B], são concorrentes. E pela propriedade PR2, pode-se implementar um mecanismo de entrega de mensagens que mantenha a ordem causal baseado nos números de

Figura 5.2. Exemplo de matriz de blocos para um grupo de 6 processos.

bloco. Assim, se uma mensagem recebida representada em BM[B], B > 1, é entregue somente depois que todas mensagens difundidas que possam ser representadas em BM[B’], para todo B0< B, forem previamente entregues.

Se assumimos a hipótese de canais de comunicação par-a-par FIFO, a qual é facilmente implementável por meio de mecanismos de controle de conexão fim-a-fim, como o uso do protocolo TCP, pode-se determinar de forma fácil se um dado bloco causal é completo, ou seja, se o mesmo indica a recepção/envio de todas as mensagens com o mesmo número de bloco associado. Por exemplo, considere a Figura 5.2, bloco 2 está completo em face dos processos p2, p5, e p6haverem enviado mensagens com número de bloco 2, e os processos p1, p3, e p4,

enviado mensagens com número de bloco 3. As condições de completude de um bloco são definidas de forma precisa por meio do Lema 5.1.1 [63, 64]:

Lema 5.1.1 Um bloco causal BM[B], B ≥ 1, mantido por um processo pi, é dito completo, se e somente se ∀ j, 1 ≤ j ≤ n, a seguinte condição se mantém:

• LC1: a j-ésima entrada de BM[B] ou (i) está marcada com ’+’ or (ii) está vazia e existe B’, B0> B, tal qual j-ésima entrada de BM[B’] está marcada com ’+’.

Prova do Lema 5.1.1 Considere que LC1 é satisfeito pelo bloco causal BM[B], ∀ j, 1 ≤ j ≤ n. De acordo com (i), pj contribui enviando previamente uma mensagem indicada em BM[B].

De acordo com as regras CA1 e CA2, um processo sempre difunde mensagens com números de bloco monotonicamente crescentes, e, considerando a hipótese de canais de comunicação FIFO, mensagens transmitidas são recebidas na ordem sequencial de seus números de blocos, logo, de acordo com (ii), se pj difundiu mensagem com número de bloco B0 (registrado em BM[B’],

B0> B), é garantido que pjnão difundido previamente (e não difundirá) quaisquer mensagens

para BM[B]. Desta forma, o bloco causal BM[B] está completo.  Obviamente, dado PR2, a existência de BM[B], B > 1, implica na existência de um bloco causal imediatamente anterior BM[B’], e que B0< B (e B0= B − 1 considerando que o conta- dor de blocos é incrementado pela unidade). Desde que a hipótese de canais de comunicação FIFO se mantém, blocos causais de BM mantidos por um processo se completarão na ordem sequencial de seus números de bloco.

5.1 COMUNICAÇÃO EM GRUPO 55 É possível utilizar a informação de completude dos blocos para a entrega de mensagens, atendendo a ordenação total: na ordem do número de bloco, mensagens de blocos completos podem ser entregues; em cada bloco completo as mensagens são entregues sempre em uma ordem pré-definida, como, por exemplo, em ordem crescente ao identificador do processo re- metente. hipóteses temporais, o que não permite determinar, por exemplo

O mecanismo de blocos causais ora apresentado não apresenta considerações quanto a hi- póteses temporais, o que não permite determinar, por exemplo, limites temporais de terminação para a completude de blocos, e, por consequente, para a entrega de mensagens.

Por exemplo, se apenas um processo permanece inativo, sem enviar mensagens, este não contribui com a completude dos blocos causais que se formam, e consequentemente as mensa- gens associadas não serão entregues. De modo a garantir terminação na completude de blocos causais, utilizamos um simples mecanismo, denominado time-silence: este mecanismo garante que todo processo, mesmo em face de longos períodos de inatividade, deve contribuir para a completude de blocos causais existentes. Este mecanismo é descrito a seguir.

Mecanismo de Time-silence

Cada processo pimantém variáveis inteiras SENTi e RECDi, indicando o maior número de

bloco de mensagens que pi enviou ou recebeu, respectivamente. Ao receber uma mensagem

com um novo número de bloco B, pi verifica se SENTi≥ B. Se SENTi< B, um timeout local

é configurado, denominado time-silence ts(B), com um período de tempo pré-determinado ts. Este timeout indica a janela temporal na qual pi deve enviar uma mensagem com número de

bloco igual ou maior a B. Em face a expiração deste timeout, então pi difunde uma mensagem

de conteúdo nulo com número de bloco m.b. = RECDi. Esta ação contribui com a completude

de todos os blocos criados BM[B0], B0≤ RECDi. E define uma nova regra CA3 de incremento

de BCi:

• CA3 (Avanço do contador devido ao timesilencei): Antes de pidifundir uma menssagem

de conteúdo nulo, este define m.b = RECDie BCi= m.b.

Observe que ao longo da execução se RECDi torna-se muito maior que SENTi, devido a

inatividade do processo, o mecanismo de time-silence torna, a termo, SENTi= RECDi.

Pode-se construir protocolos de comunicação em grupo baseado no mecanismo de blocos causais, os quais possuem garantias de terminação na completude dos blocos em face do uso do time-silence.

Contudo, não determinamos limites temporais para esta completude. Se assumimos hipó- teses de sincronia no sistema distribuído – taxa de desvio máxima entre os relógios, presença de limites temporais na execução e latência de canais de comunicação, o mecanismo de blocos causais pode utilizar tais hipóteses para determinar estes limites temporais de completude, o que é obtido na extensão apresentada em [5]: blocos causais temporizados, ou timed causal blocks (TimedCB). Os timed causal blocks permitem inferir limites temporais associados à completude de blocos, dado que há limites temporais conhecidos associados ao sistema distribuído.

Em síntese, na presença de um ambiente (processos e canais) síncrono, temos limites tem- porais conhecidos para a completude dos blocos, denominados timed causal blocks, medidos pelo relógio local de pi, a partir do instante tide criação do bloco, são determinados pelo Lema