Você está na página 1de 10

Capítulo 10: Visão geral Estados globais

• Motivação
– Suponha uma computação distribuída onde queremos
• Noções iniciais: tempo em SD, drift, skew, UTC responder questões tais como:
• Sincronização de relógios físicos • O sistema está em deadlock?
• Tempo lógico e relógios lógicos • Quantos processos estão acessando um arquivo?
• Qual o saldo atual de uma agência bancária?
– Definição de tempo lógico
– Relógios lógicos de Lamport
– Para respondê-las, podemos enviar requests para todos os
– Relógios lógicos vetoriais = vector clocks processos
• Estados globais – O problema é que enquanto os processos respondem, eles
• Debug distribuído continuam trocando mensagens
– Exemplos…

Sist. Distrib. II - Prof. Cesar A. Tacla 1 Sist. Distrib. II - Prof. Cesar A. Tacla 2

Estados globais Estados globais

Cliente faz transferência R$200


de R$ 200 e simultaneamente
gerente consulta saldo da agência
Deadlock distribuído
R2
wait R2 É utilizado
Aparentemente o sistema
está em deadlock Conta Conta
Corrente A Corrente B
Porém é preciso examinar libera R$ 500 R$ 100
as msgs em tráfego P1 P2
Pode existir uma msg de Saldo A = 500 – 200 = R$ 300 Saldo B = R$ 100
P2 liberando o recurso R2,
neste caso o deadlock não É utilizado wait R1
R1
existe. Gerente consulta saldo
Considere a mesma consulta da agência = R$ 400
realizada pelo gerente
imediatamente antes ou é preciso observar o
imediatamente após a estado dos canais de
transferência = saldo era R$600 comunicação
Sist. Distrib. II - Prof. Cesar A. Tacla 3 Sist. Distrib. II - Prof. Cesar A. Tacla 4

Estados globais Estados globais

• Estado de uma computação distribuída • Como não temos simultaneidade em sistemas


– Imagine parar uma computação distribuída congelando todos os assíncronos precisamos de uma relação de causa-efeito
processos simultaneamente
para determinar o estado global de um SD
– O estado global seria dado
• pelo estado de cada um dos processos
• pelos conteúdos das mensagens em trânsito entre os processos • Causa-efeito = happened-before = causalidade
– Com este estado global podemos determinar o saldo da agência ou se
um sistema está em deadlock • Relembrando causalidade
– Só conseguimos observar a comunicação entre os processos
(as mensagens trocadas pelos processos)
• Problema – Não podemos afirmar que um evento causa outro evento,
– É impossível capturar simultaneamente todos os estados locais pois podemos dizer que um evento pode ter causado outro
não há um tempo global para todos os processos e nem sincronização (causalidade potencial)
perfeita dos relógios

Sist. Distrib. II - Prof. Cesar A. Tacla 5 Sist. Distrib. II - Prof. Cesar A. Tacla 6

1
Estados globais Estados globais

• Formalização: • Visualização de uma computação


– Uma computação distribuída é uma execução de um programa
distribuído por uma coleção de processos
– Cada processo gera uma sequência de eventos (histórico local).
Eventos podem ser internos ou de comunicação

Histórico local do processo i: hi = ei1 ei2 ei3…

Histórico local parcial: hin = ei1 ei2 …ein

N
Histórico global: H=
i =1
h i

Sist. Distrib. II - Prof. Cesar A. Tacla 7 Sist. Distrib. II - Prof. Cesar A. Tacla 8

Estados globais Estados globais

Estado local de um processo pi após evento eik σik • Exemplos de cortes

Estado inicial do processo pi σi0

N
Estado global: coleção de estados locais
N = número total de processos Σ=
i =1
σ i

N
Corte: coleção de históricos locais parciais. Ci

Ci denota até onde vai o histórico parcial para cada proc. i


C=
i =1
h
i

Fronteira de um corte: são os últimos eventos eiCi para i=1 a N


de um corte

Sist. Distrib. II - Prof. Cesar A. Tacla 9 Sist. Distrib. II - Prof. Cesar A. Tacla 10

Estados globais Estados globais


• Uma observação é uma ordenação
total dos eventos construída do interior
Uma rodada (run) de do sistema
uma computação
• Um run (R) pode ter várias
distribuída é uma observações (O)
ordenação total dos
ordenaç
eventos que corresponde • Observações também são chamadas
de linearizações
a uma execução real.
R = e21 e11 e31 e12 e32 e33 e13 e34 e22 e14 e23 e35 e15 e16 e36

R = e21 e11 e31 e12 e32 e33 e13 e34 e22 e14 e23 e35 e15 e16 e36

Sist. Distrib. II - Prof. Cesar A. Tacla 11 Sist. Distrib. II - Prof. Cesar A. Tacla 12

2
Estados Globais: exercício Estados globais

X=10 • Monitoração
P1 | | | | – Determinar o estado do sistema do seu interior
– Pode necessitar de um processo extra
Y=4 Y=5
• P0 = processo monitor
P2 | | | | |
– P0 envia mensagens para os outros solicitando seus estados
Z=3 Z=6 – A partir das respostas, P0 constrói o estado global
P3 | | | |

• Nomear os eventos na forma eik


• Dar um exemplo de corte – Um estado global construído pelo monitor representa um estado que
• Dar a fronteira do corte ocorreu na execução real?

• Duas observações possíveis

Sist. Distrib. II - Prof. Cesar A. Tacla 13 Sist. Distrib. II - Prof. Cesar A. Tacla 14

Estados globais Estados globais

Não funciona pois o


estado coletado não
• Algoritmo inocente (naïve) para um monitor existe na realidade
– P0 envia uma msg para cada processo perguntando pelos
estados respectivos
– Quando pi recebe a solicitação retorna seu estado σi Estado construído pelo
– Quando todos os processos respondem, P0 constrói o estado monitor contém a recepção
global = (σ1, σ2, …, σn) de uma mensagem enviada
de P1 a P3 (e32) mas não
contém o envio da mesma
• Por que não funciona?
funciona? (e11)

Monitor construiu
uma observação não
consistente!

Sist. Distrib. II - Prof. Cesar A. Tacla 15 Sist. Distrib. II - Prof. Cesar A. Tacla 16

Estados globais Estados globais: cortes consistentes

• Estado global consistente


– Do interior do sistema em geral não podemos dizer se um estado
construído aconteceu na realidade
– Podemos simplesmente definir estados que podem ter acontecido

– Estes estados são chamados de estados globais consistentes


– Um estado global consistente equivale a um corte consistente

–Um corte é dito consistente se

Sist. Distrib. II - Prof. Cesar A. Tacla 17 Sist. Distrib. II - Prof. Cesar A. Tacla 18

3
Estados globais Estados Globais: grafo

• Estado global consistente • Grafo de estados globais consistentes


– Um SD pode ser visto como uma série de transições entre – Podemos montar um grafo com todas as possibilidades de
estados globais consistentes = Σ0, Σ1, Σ2, … estados de um SD a partir de observações consistentes
– Σi é derivado de Σi-1 pela execução de um só evento – Objetivo: debugar o sistema
• Determinar se predicados são válidos

e1 e2 ei-1 ei
Σ0 → Σ1 → … → Σi -1 → Σi → …

Eventos: send, receive ou local (ex: atribuição)

Sist. Distrib. II - Prof. Cesar A. Tacla 19 Sist. Distrib. II - Prof. Cesar A. Tacla 20

Estados Globais Estados Globais

• Grafo de estados globais consistentes • A partir das observações consistentes construimos o


grafo de estados globais
– Σ0,0 x=4 Σ1,0 send Σ2,0 y=3 Σ2,1 recv Σ2,2 y=2 Σ2,3
1. RUN – Σ0,0 x=4 Σ1,0 y=3 Σ1,1 send Σ2,1 recv Σ2,2 y=2 Σ2,3
– Σ0,0 y=3 Σ0,1 x=4 Σ1,1 send Σ2,1 recv Σ2,2 y=2 Σ2,3

• Σi,j = estado global do sistema após a ocorrência de i


2. Observações consistentes eventos no processo i e j eventos no processo j
ordenação total dos eventos respeitando a relação de causalidade
– O1: x=4, send, y=3, recv, y=2
– O2: x=4, y=3, send, recv, y=2 • O estado global do sistema neste exemplo é dado pelas
– O3: y=3, x=4, send, recv, y=2 variáveis x e y

Sist. Distrib. II - Prof. Cesar A. Tacla 21 Sist. Distrib. II - Prof. Cesar A. Tacla 22

Estados globais Estados globais


Grafo dos estados globais Σ0,0 {x=0, y=0} 0
• Exercício
– A figura abaixo mostra eventos de dois processos, p1 e p2. As
{x=4, y=0} Σ1,0 Σ0,1 {x=0, y=3} 1 flechas representam o envio de mensagens. Cada processo
possui uma variável xi,inicializadas respectivamente com x1=30
e x2 = 10. P1 decrementa x1 em 1 unidade para cada evento; p2
{x=4, y=0} Σ2,0 Σ1,1 {x=4, y=3} 2 incrementa x2 em 1 para cada evento.
– Desenhe o grafo de estados globais com os valores de x1 e x2
Σ2,1 em cada um dos estados
{x=4, y=3} 3

Alcançabilidade
Σ2,2 {x=4, y=3} 4
a b c d
p1 | | | |
Σ2,0 é alcançável a partir de Σ1,0
Σ2,0 não é alcançável a partir de Σ0,1
Σ2,3 {x=4, y=2} 5
p2 | | |
e f g

Sist. Distrib. II - Prof. Cesar A. Tacla 23 Sist. Distrib. II - Prof. Cesar A. Tacla 24

4
Estados globais Estados globais

• Debug distribuído • Exemplo de debug distribuído


– Queremos verificar se um predicado foi verdadeiro num estado – Dado um conjunto de processos pi cada um com uma variável
ocorrido durante um « run »
– Queremos saber se uma condição de segurança foi respeitada
– Predicado transitório é um predicado que pode mudar – Condição: xi – xj ≤ δ
contrariamente a predicados estáveis
– Objetivo: verficar se um predicado Φ foi definitivamente
– Predicado estável: uma vez que o sistema entra num estado verdadeiro ou possivelmente verdadeiro em algum momento
no qual o predicado é verdadeiro, o predicado permanecerá da execução
verdadeiro em todos os estados alcançáveis a partir daquele
estado (ex. deadlocks, finalização)

Sist. Distrib. II - Prof. Cesar A. Tacla 25 Sist. Distrib. II - Prof. Cesar A. Tacla 26

Estados globais Estados globais

Σ0,0 {x=0, y=0}


• Possivelmente verdadeiro
– Em pelo menos uma das observações consistentes de um
SD existe um estado global Σ onde o predicado Φ é verdadeiro {x=4, y=0} Σ1,0 Σ0,1 {x=0, y=3}
– Ou seja, um predicado possivelmente foi verdadeiro

{x=4, y=0} Σ2,0 Σ1,1 {x=4, y=3}


• Definitivamente verdadeiro
– O predicado Φ é verdadeiro em todos os estados Σ de
• Possivelmente (x+y = 4)? Σ2,1
pelosmenos um dos níveis do grafo de estado global {x=4, y=3}
• Possivelmente(x+y=3)?
– Ou seja, um determinado predicado foi verdadeiro com • Possivelmente(x=10)?
certeza • Definitivamente(x = 4)?
Σ2,2 {x=4, y=3}
• Definitivamente(x-y = 4)?
• Definitivamente(x≠10)? Σ2,3 {x=4, y=2}

Sist. Distrib. II - Prof. Cesar A. Tacla 27 Sist. Distrib. II - Prof. Cesar A. Tacla 28

Estados globais Estados globais


~Possivelmente(Φ Φ ) Definitivamente (~ΦΦ)
Ex: É falso que possivelmente(x=3) então definitivamente(x≠3)
Algoritmos para monitorar sistemas distribuídos = para
Σ0,0 {x=0} construir estados globais consistentes

1. Algoritmo snapshot distribuído de Chandy e Lamport


{x=10} Σ1,0 Σ0,1 {x=15}
(1985)
2. Algoritmo centralizado de Marzullo e Neiger (1991)
{x=5} Σ2.0
Σ0.2 {x=10}

Σ2,1 {x=4}
A relação inversa não é verdadeira
Definitivamente (~Φ) ~Possivelmente(Φ)
Ex: Definitivamente(x≤10) é verdadeiro então possivelmente(x>10) é
falso
Sist. Distrib. II - Prof. Cesar A. Tacla 29 Sist. Distrib. II - Prof. Cesar A. Tacla 30

5
Estados globais Estados globais

• Algoritmo snapshot distribuído


– Se olharmos a estratégia utilizada no processo monitor • Algoritmo snapshot distribuído
(algoritmo inocente) veremos um processo p0 que tira
instantâneos (snapshots) dos estados dos outros processos
Algoritmo de Chandy e Lamport (1985):
– Vimos que a construção de um estado global tem suas • grava somente estados globais consistentes
armadilhas = pode produzir estados globais INCONSISTENTES
• permite construir um estado global consistente sem precisar
congelar a execução do sistema
– Predicados podem ser avaliados incorretamente quando temos • Permite avaliar predicados estáveis
estados globais INCONSISTENTES

Sist. Distrib. II - Prof. Cesar A. Tacla 31 Sist. Distrib. II - Prof. Cesar A. Tacla 32

Estados globais Estados globais

• Exemplo inicial – Alg. Chandy-Lamport


– Exemplo extraído de http://lambda.cs.yale.edu/cs425/info.html

b) Processo Q recebe um marker pela primeira vez e grava seu estado local e põe um
marker em cada um dos canais de saída
c) Q grava todas as mensagens de entrada (provenientes de processos diferentes
daquele que enviou o primeiro marker)
a) Processo Q com um canal de entrada e dois de saída
d) Q recebe um segundo marker e pára de gravar o estado para o canal de entrada
(somente para o canal por onde veio o marker)
Sist. Distrib. II - Prof. Cesar A. Tacla 33 Sist. Distrib. II - Prof. Cesar A. Tacla 34

Estados globais Estados globais


• Algoritmo com mais detalhes p1 • Objetivo: fazer cortes consistentes para avaliar
Início predicados estáveis
p1
1°marker p2
p3 Início
rec 2,1
rec 3,1 stop 2,1 stop 3,1 rec 2,1
p2
| | | rec 3,1 stop 2,1 stop 3,1 p3
p1 |
| |
Salvar p1
estado local
stop 3,2 Estado global
p2
| markers stop 3,2
p2 |
1°marker
1,2 ={ } Canais de com.
rec 3,2 2,1=uma msg
p3 vermelha
|
|
stop 2,3 p3 |
3,1=uma marrom
1°marker 1,2=∅
Término: qdo todos processos stop 2,3
1,3={ }
receberem o segundo marker 3,2=uma azul
rec 2,3
para cada canal de entrada que 1,3= ∅
está sendo gravado 2,3=uma verde
Sist. Distrib. II - Prof. Cesar A. Tacla 35 Sist. Distrib. II - Prof. Cesar A. Tacla 36

6
Estados globais Estados globais
Algoritmo snapshot Chandy-Lamport
• Hipóteses para este protocolo
– Não há falha dos canais de comunicação nem dos processos 1. O processo iniciador age como se tivesse recebido um marker de um canal inexistente
– Comunicação confiável: toda msg enviada é recebida uma só e aplica a regra do recebimento
vez intacta
2. Regra do recebimento: processo pi recebe um marker pelo canal c
– Canais são unidirecionais com entrega FIFO • Se pi ainda não gravou seu estado
• Comunicação entre pi e pj satisfaz entrega FIFO se • pi grava seu estado
send(a, pj) → send(b, pj) deliverj(a) → deliverj(b) • salva definitivamente o estado de canal c como vazio
• Inicia gravação das msgs que chegam pelos outros canais de entrada (diferentes de c)
– O grafo de processos e canais é fortemente conectado (sempre • Senão (segundo marker)
existe um caminho entre dois processos) • Pi salva o estado de c como sendo o cjto das msgs vindas pelo canal c desde que pi salvou seu estado

– Qualquer processo pode iniciar o protocolo 3. Regra do envio


– Os processos continuam a executar normalmente enquanto • Depois de ter gravado seu estado, pi envia um marker para cada canal de saída (antes de enviar
qualquer outra mensagem)
ocorre o snapshot
– Não representamos como o processo iniciador coleta os estados 4. Término
individuais para construir o estado global do sistema • quando o processo recebe um marker de cada um dos seus canais de entrada. O processo
envia o estado local para quem iniciou o snapshot, o iniciador monta o estado global do sistema

Sist. Distrib. II - Prof. Cesar A. Tacla 37 Sist. Distrib. II - Prof. Cesar A. Tacla 38

Estados globais Estados globais


Algoritmo snapshot Chandy-Lamport: outra forma • Formalismos - protocolo Chandy-Lamport
P1 INICIA SNAPSHOT
Receive marker
px: for ({cada vizinho pi} {px}) send(pi, « marker »); /* iniciador */ Grava estado local e inicia
gravação msgs para todos os Receive segundo marker
pi: when (receive(« marker ») pela primeira vez de pj canais de entrada X2,1 = {m}
grave estado local Si;
for (cada vizinho pk) { e1 e2 e3 e4 e5 e6
1 1 1 1 1 1 Linhas tracejadas msgs
send(pk, « marker »); p1
do protocolo
if (pk pj) /* não é o canal por onde chegou o marker */
Linhas cheias
grave mensagens Hk,i recebidas de pk até receive(pk, « marker »); m msgs da aplicação
else Hj,i = ∅ marker
X1,2 canal de 1 para 2
}
send(px, Si, H*,i); /* pi envia o estado para px que iniciou o snapshot, px monta o estado global do sistema */ P2 não espera segundo
marker pois só tem um
} canal de entrada que
p2
e1 e2 e3 e4 e5 vem do inicador
2 2 2 2 2

Receive primeiro marker: grava estado local e inicia


gravação msgs entrada (para todos os canais exceto
aquele por onde chegou o marker)
Sist. Distrib. II - Prof. Cesar A. Tacla 39 Sist. Distrib. II - Prof. Cesar A. Tacla 40

Estados globais Estados globais


• O estado global construído é Σ 23 com
Se um predicado ESTÁVEL é verdadeiro (ou falso) no estado
X1,2 = { } e X2,1 = {m}
construído pelo snapshot ele será verdadeiro (ou falso) no estado
final do snapshot
• Mas examinando o « run » temos:

Não vale para predicados instáveis

• ou em termos de estados globais:

actual execution e0 ,e 1,...

• Note que recording


Sinit recording Sfinal
– O snapshot inicia em Σ 21 e termina em Σ55 begins ends
– a run r não passa por Σ23 !!!
– Porém Σ55 é alcançável a partir de Σ23 Ssnap
pre-snap: e '0 ,e'1 ,...e'R-1 post-snap: e' R,e 'R+1 ,...

Sist. Distrib. II - Prof. Cesar A. Tacla 41 Sist. Distrib. II - Prof. Cesar A. Tacla 42

7
Estados globais Estados globais
Exercício
Dois processos p e q trocam mensagens
como indicado no diagrama. Qual o
• Logo, snapshot distribuído pode ser utilizado para: estado global determinado pelo algoritmo
snapshot?
– Verificar se o sistema entrou em deadlock (ou outro predicado Mensagem MARKER
estável, ex. término de algoritmo)
Mensagem aplicação

snapshot
– No melhor dos casos para predicados instáveis, podemos

Inicio
verificar se alguma condição de segurança foi possivelmente
xp=101 xp=103 xp=104
violada.

– Ex.: diferença entre duas variáveis foi sempre igual a zero? M1


M3
M2

xq=101 xq=102 Xq=105


Sist. Distrib. II - Prof. Cesar A. Tacla 43 Sist. Distrib. II - Prof. Cesar A. Tacla 44

Estados globais Estados globais

Exercício • Algoritmo centralizado de Marzullo e Neiger


Qual o estado global do sistema ao término do snapshot – Algoritmo de Chandy e Lamport coleta os estados dos
processos de maneira distribuída
a=2
p1 |
m1
m2 – No algoritmo centralizado de Marzullo e Neiger, os processos
observados enviam seus estados para um processo monitor

b = -1
p2 | |b = 13 – O processo monitor constrói um estado global consistente a
partir dos estados locais recebidos

– O monitor é externo ao sistema


m3 m4
p3 | |
c=1 c=4

Sist. Distrib. II - Prof. Cesar A. Tacla 45 Sist. Distrib. II - Prof. Cesar A. Tacla 46

Estados globais Estados globais


• Exemplo
• Os processos observados enviam seus estados iniciais ao monitor (1,0) (2,0) (3,0) (4,3)
em msgs de estado x1= 1 x1 = 100 x1 = 105 x1= 90
p1
• Após envio do estado inicial, os processos enviam msgs de estado
somente qdo uma mudança local pode modificar a avaliação de um m1 m2
predicado
p2 Physical
• Para reduzir o tráfego de msgs, os processos só enviam as time
x2 = 100 x2 = 95 x2 = 90
variáveis relevantes para os predicados em análise (2,1) (2,2) (2,3) Cut C2
• O monitor grava as msgs de estado em filas separadas: uma para Cut C1
cada processo

• O monitor constrói estados globais consistentes a partir das msgs
de estado ! ! " ! # ! $ % ! !
!
! ! " ! % ! &
Sist. Distrib. II - Prof. Cesar A. Tacla 47 Sist. Distrib. II - Prof. Cesar A. Tacla 48

8
Estados globais Estados globais

• Se o monitor faz um corte inconsistente os predicados • Monitor


podem ser erroneamente avaliados
– C1: |1 – 100| = 99 > 50 viola a restrição
– C2: |105 –90| = 15 < 50 restrição é respeitada
Q1 Q2 Qn
Alg.
Alg. avaliar
avaliar
• Para que o monitor possa montar estados globais Alg.
Alg. possivelmente(Φ
possivelmente( Φ))
montar
montar ee
consistentes, as msgs de estado são enviadas junto grafo
grafo definitivamente(Φ
definitivamente( Φ))
com o relógio vetorial EGC
EGC

• As filas Qi mantidas pelo monitor são ordenadas pela X1=1 [1,0]


ordem de envio observando a i-ésima posição do vetor V ou F
Estado local +
relógio vetorial
Sist. Distrib. II - Prof. Cesar A. Tacla 49 Sist. Distrib. II - Prof. Cesar A. Tacla 50

Estados globais Estados globais

!
• O monitor observa a seguinte condição para montar um estado
global consistente:
monitor
σ1 [1,0] Para cada processo i
σ1 [2,0] Para cada processo j (i ≠ j)
a b
p1 | |
σi)[i] ≥ V(σ
V(σ σj)[i]

σ2 [2,1] σi)[i] =
V(σ "#

p2 |
c
• Esta condição é útil no algoritmo que monta o grafo de estados
globais para saber quais mensagens de estado podem ser
Do ponto de vista do monitor, p2 percebeu mais eventos de p1 do que
utilizadas
realmente ocorreram (2 contra 1), logo falta uma mensagem
Sist. Distrib. II - Prof. Cesar A. Tacla 51 Sist. Distrib. II - Prof. Cesar A. Tacla 52

Estados globais Estados globais


(1,0) (2,0) (3,0) (4,3) (1,0) (2,0) (3,0) (4,3)
x1= 1 x1 = 100 x1 = 105 x1= 90 x1= 1 x1 = 100 x1 = 105 x1= 90
p1 p1
m1 m2 m1 m2

p2 Physical p2 Physical
time time
x2 = 100 x2 = 95 x2 = 90 x2 = 100 x2 = 95 x2 = 90
(2,1) (2,2) (2,3) (2,1) (2,2) (2,3)

Exemplo:
Exemplo:
Exemplo: X1 = 90 V(σ1)= [4,3]
XX11 == 105
105 V(σ
V(σ11)=
)= [3,0]
[3,0] X2 = 95 V(σ2)= [2,2]
XX22 == 90
90 V(σ
V(σ22)=
)= [2,3]
[2,3]
Σ(σ1, σ2) é consistente?
Σ(σ1,
Σ(σ1, σ2)
σ2) éé consistente?
consistente? Sim, pois 33 ≥≥ 22 ee 33 ≥≥ 00
Sim, pois

'' !! (( %% "" !! !! %% "" )) !! ** Não, 44 ≥≥ 22 mas


Não, mas 22 << 33
"" ++
Sist. Distrib. II - Prof. Cesar A. Tacla 53 Sist. Distrib. II - Prof. Cesar A. Tacla 54

9
Estados globais

• Exercício
– Supondo as filas Q de um processo monitor ilustradas abaixo,
em quais dos casos o monitor poderia utilizar as mensagens de
estado para montar um estado global consistente

a) Q1=[2 2] Q2=[4 2]

b) Q1=[1 2 2] Q2=[0 2 1] Q3=[1 2 0]

c) Q1=[4 2 1] Q2=[3 2 0] Q3=[1 2 1]

Sist. Distrib. II - Prof. Cesar A. Tacla 55

10

Você também pode gostar