Canais Síncronos

1.083 visualizações

Publicada em

0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.083
No SlideShare
0
A partir de incorporações
0
Número de incorporações
45
Ações
Compartilhamentos
0
Downloads
12
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Canais Síncronos

  1. 1. II. Memória Distibuída Passagem de Mensagens Síncrona Fco. Heron de Carvalho Jr., Dr. [email_address]
  2. 2. Introdução <ul><li>Dificuldades com Passagem de Mensagens Assíncrona </li></ul><ul><ul><li>Transmissor precisa saber se receptor recebeu a mensagem: </li></ul></ul><ul><ul><ul><li>Uso de reconhecimento ; </li></ul></ul></ul><ul><ul><li>Entrega de mensagens não é garantida; </li></ul></ul><ul><ul><ul><li>Como saber o que ocorreu caso o reconhecimento não chegue ?? </li></ul></ul></ul><ul><ul><li>Buffers não podem ser infinitos </li></ul></ul><ul><ul><ul><li>Muitas mensagens  CRASH! ou bloqueio no send; </li></ul></ul></ul><ul><ul><ul><li>Violação da semântica do send ; </li></ul></ul></ul>
  3. 3. Introdução <ul><li>Passagem de Mensagens Síncrona </li></ul><ul><ul><li>Não há buffers ; </li></ul></ul><ul><ul><li>Processo transmissor espera até que o receptor receba a mensagem; </li></ul></ul><ul><ul><li>Comando de atribuição distribuída; </li></ul></ul><ul><ul><li>Vantagens: </li></ul></ul><ul><ul><ul><li>Simplifica a solução de alguns problemas; </li></ul></ul></ul><ul><ul><ul><li>Evita alocação dinâmica de buffers ; </li></ul></ul></ul><ul><ul><li>Desvantagens: </li></ul></ul><ul><ul><ul><li>Dificulta programação de alguns problemas; </li></ul></ul></ul><ul><ul><li>CSP e OCCAM (Hoare) </li></ul></ul>
  4. 4. Notação <ul><li>Processo A deseja comunicar um valor a um processo B : </li></ul><ul><ul><li>A:: … B! e … {comando de sa ída} </li></ul></ul><ul><ul><li>B:: … A? x … {comando de entrada} </li></ul></ul><ul><li>A fica bloqueado até que B receba o valor e e atribua a sua variável x ; </li></ul><ul><li>Os tipos de e e x devem coincidir; </li></ul>
  5. 5. Notação <ul><li>Forma geral: </li></ul><ul><ul><li>destino ! porta (e 1 ,…,e n ) </li></ul></ul><ul><ul><li>fonte ? porta (x 1 ,…,x n ) </li></ul></ul><ul><li>Portas são usadas para identificar os tipos de mensagens; </li></ul><ul><ul><li>Alternativa ao simples casamento de tipos que pode causar confusão; </li></ul></ul>
  6. 6. Notação <ul><li>Casando comandos de comunicação: </li></ul><ul><ul><li>Um comando de saída e um comando de entrada casam se todos as 4 condições seguintes são aceitas: </li></ul></ul><ul><ul><ul><li>O comando de saída aparece no processo nomeado pelo comando de entrada ; </li></ul></ul></ul><ul><ul><ul><li>O comando de entrada aparece no processo nomeado pelo comando de saída ; </li></ul></ul></ul><ul><ul><ul><li>Os identificadores das portas são os mesmos e, caso presentes, os valores subscritos também; </li></ul></ul></ul><ul><ul><ul><li>Todos os x i := e i são atribuições válidas; </li></ul></ul></ul>
  7. 7. Notação <ul><li>Exemplo 1: </li></ul><ul><li>Copy :: var c:char do true  West ? c ; East ! c od </li></ul><ul><li>Exemplo 2: </li></ul><ul><li>GCD :: var x,y: int do true  Client ? args ( x , y ) do x  y  x := x - y [] x  y  y := y - x od Client ! r esult ( x ) od </li></ul>
  8. 8. Notação <ul><li>Uso de GCD pelo cliente: </li></ul><ul><li>… GCD ! a rgs ( v1 , v2 ); ...; GCD ? result (r) … </li></ul>
  9. 9. Notação <ul><li>Comunica ção guardada ; </li></ul><ul><ul><li>Processos querem se comunicar com mais de um processo mas em uma ordem arbritária; </li></ul></ul><ul><ul><li>Exemplos: </li></ul></ul><ul><ul><ul><li>Copy com buffer : se há mais de 1 e menos de 10 caracteres no buffer, pode-se ler de West ou escrever em East ; </li></ul></ul></ul><ul><ul><ul><li>GCD pode ter múltiplos clientes; </li></ul></ul></ul>
  10. 10. Notação <ul><li>Comunica ção guardada ; </li></ul><ul><ul><li>Comando de comunicação guardado </li></ul></ul><ul><ul><ul><li>B ; C  S </li></ul></ul></ul><ul><ul><ul><ul><li>B é uma expressão booleana (opcional); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>C é um comando de comunicação (opcioinal); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>S é uma lista de comandos; </li></ul></ul></ul></ul><ul><ul><li>B e C compõem a guarda; </li></ul></ul><ul><ul><li>A guarda sucede-se se B é verdadeiro e C não causa bloqueio ; </li></ul></ul>
  11. 11. Notação <ul><li>Comunica ção guardada ; </li></ul><ul><ul><li>Uso com if </li></ul></ul><ul><ul><ul><li>Uma das guardas ativas é escolhida não-deterministicamente ; </li></ul></ul></ul><ul><ul><li>Uso com do </li></ul></ul><ul><ul><ul><li>Repetidamente, uma das guardas ativas é escolhida não-deterministicamente, at é quando nenhuma estiver ativa; </li></ul></ul></ul>
  12. 12. Notação <ul><li>Uso de comunicação guardada em Copy : </li></ul><ul><li>Copy :: var c:char do West ? C  East ! c od </li></ul><ul><li>Copy :: var buffer [1:10]:char var front :=1, rear :=1, count :=0 do count < 10; West ? buffer [ rear ]  count ++; rear := ( rear mod 10) + 1 [] count > 0; East ! buffer [ front ]  count --; front := ( front mod 10) + 1 od </li></ul>
  13. 13. Notação <ul><li>Uso de comunicação guardada em GCD : </li></ul><ul><li>GCD :: var x,y: int do (i:1..n) Client [i] ? a rgs [i] ( x , y )  do x  y  x := x - y [] x  y  y := y - x od Client [ i ] ! r esult [i] ( x ) od </li></ul>
  14. 14. Notação <ul><li>A::var x,y:int; if B!x  B?y [] B?y  B!x fi </li></ul><ul><li>B::var x,y:int; if A!x  A?y [] A?y  A!x fi </li></ul>
  15. 15. Semântica Formal <ul><li>Passos para construir a prova de um programa por passagem de mensagens sícrona: </li></ul><ul><ul><li>Prova individual de cada processo; </li></ul></ul><ul><ul><li>Mostrar não-interferência; </li></ul></ul><ul><ul><li>Mostrar que as suposições de comunicação são satisfeitas; </li></ul></ul><ul><ul><ul><li>Regra de satisfação; </li></ul></ul></ul>
  16. 16. Semântica Formal <ul><li>Considere os comandos de comunicação: </li></ul><ul><ul><li>out: Destino ! porta (e 1 ,...,e n ) </li></ul></ul><ul><ul><li>In : Fonte ? porta (x 1 ,...,x n ) </li></ul></ul><ul><li>Se dois comandos de comunica ção casam , o efeito é a atribuição das expressões para as variáveis; </li></ul><ul><li>Caso contrário, deadlock ! </li></ul><ul><ul><li>Qualquer coisa pode ser concluída como pós-condição desses comandos de atribuição; </li></ul></ul>
  17. 17. Semântica Formal <ul><li>Axioma da Saída: </li></ul><ul><ul><li>{P} out: Destino ! porta (e 1 ,...,e n ) {U} </li></ul></ul><ul><li>Axioma da Entrada </li></ul><ul><ul><li>{Q} in: Fonte ? porta (x 1 ,...,x n ) {V} </li></ul></ul><ul><li>Prova de satisfação </li></ul><ul><ul><li>(P  Q)  wp (x 1 ,...x n := e 1 ,...e m , U  V) </li></ul></ul>
  18. 18. Semântica Formal <ul><li>Regra da Satisfação comunicação síncrona </li></ul><ul><ul><li>Seja in um comando de entrada com pré-condição P e pós-condição U. </li></ul></ul><ul><ul><li>Seja out um comando de saída com pré-condição Q e pós-condição V. </li></ul></ul><ul><ul><li>Para todos os tais pares de comandos de comunicação casados, temos: </li></ul></ul>
  19. 19. Semântica Formal <ul><li>Novas regras de inferência para if e do </li></ul><ul><ul><li>Comandos de atribuição podem aparecer nas guardas; </li></ul></ul><ul><ul><li>Transformando comandos de comunicação guardados em comandos guardados simples correspondentes; </li></ul></ul><ul><ul><ul><li>B; C  S tem o mesmo efeito de B  C; S para efeito de prova; </li></ul></ul></ul><ul><ul><ul><li>O segundo é mais sujeito a deadlocks ; </li></ul></ul></ul>
  20. 20. Semântica Formal <ul><li>Regra da alternativa </li></ul><ul><ul><li>CIF : if B 1 ; C 1  S 1 [] ... [] B n ; C n  S n fi </li></ul></ul>
  21. 21. Semântica Formal <ul><li>Regra da iteração </li></ul><ul><ul><li>CDO : do B 1 ; C 1  S 1 [] ... [] B n ; C n  S n od </li></ul></ul>
  22. 22. <ul><li>Prova de não-interferência </li></ul><ul><ul><li>Uso de variáveis auxiliares exige prova de não-interferência ; </li></ul></ul><ul><ul><li>Variáveis auxiliares em em comunicação síncrona </li></ul></ul><ul><ul><ul><li>U em geral para construir a prova de um programa, não afetando seu comportamento; </li></ul></ul></ul>Semântica Formal
  23. 23. Semântica Formal <ul><li>Restrição da variável auxiliar </li></ul><ul><ul><li>Variáveis auxiliares somente aparecem: </li></ul></ul><ul><ul><ul><li>Como destinos em comandos de atribuição ou em expressões à direita em comandos de atribuição contanto que o destino correspondente da atribuição seja uma variável auxiliar; </li></ul></ul></ul><ul><ul><ul><li>Como variáveis em comandos de entrada ou em expressões em comandos de saída , contanto que a correspondente variável em qualquer comando de entrada casado seja uma variável auxiliar e o conjunto de comandos de atribuição casados não são afetados pela presença de variáveis auxiliares; </li></ul></ul></ul>
  24. 24. Semântica Formal <ul><li>Prova de não-interferência </li></ul><ul><ul><li>Mostrar que cada assertiva crítica C na prova de um processo é invariante com respeito a execução de qualquer ação em outro processo; </li></ul></ul><ul><ul><li>Comando S e assertiva C são paralelos quando pertencem a processos distintos ; </li></ul></ul>
  25. 25. Semântica Formal <ul><li>Prova de não-interferência </li></ul><ul><ul><li>Para provar que uma ação de atribuição a não invalida uma assertiva crítica C paralela a a , é suficiente mostrar que NI( a , C ) é um teorema: </li></ul></ul><ul><ul><ul><li>NI( a , C): {pre( a )  C} a {C} </li></ul></ul></ul><ul><ul><li>Sejam in e out comandosde comunicação, a prova de NI( in ,C) e NI( out ,C) é trivialmente verdade , pelos axiomas de entrada; </li></ul></ul>
  26. 26. Semântica Formal <ul><li>Prova de não-interferência </li></ul>
  27. 27. Semântica Formal <ul><li>Liberdade de interferência para comunicação síncrona. Teoremas {Pi} Si {Qi}, 1  i  n são livres de interferencia se ambos os seguintes são verdade: </li></ul><ul><ul><li>Para todas as atribuições e a na prova de S i , 1  i  n e para todas as assertivas críticas paralelas a a : NI ( a, C ). </li></ul></ul><ul><ul><li>Para todas as ações de entrada in na prova de S i , 1  i  n, para todas as ações de saída casadas out na prova de S j , 1  j  n, i  j, e para todas as assertivas críticas paralelas a in e out : NIasynch ( in , out, C ). </li></ul></ul>
  28. 28. Semântica Formal <ul><li>Exemplo ( seção crítica ): </li></ul><ul><li>C[1:n]:: do true  Sem !P() critical section Sem !V() non-critical section od Sem :: do ( i :1..n) C[ i ] ? P()  C[ i ] ? V() od </li></ul>
  29. 29. Semântica Formal <ul><li>Exemplo ( seção crítica ): </li></ul><ul><ul><li>Variáveis auxililares; </li></ul></ul><ul><ul><ul><li>Lembra se processo C[i] está na seção crítica; </li></ul></ul></ul><ul><ul><ul><li>in[1:n]: bool; </li></ul></ul></ul><ul><ul><li>Invariante: </li></ul></ul><ul><ul><ul><li>MUTEX: (  i: 1  i  n: 0  in[i]  1)  (in[1] + ... In[n])  1 </li></ul></ul></ul>
  30. 30. Semântica Formal <ul><li>var in[1..n]: int := ([n] 0) { MUTEX:(  i: 1  i  n: 0  in[i]  1)  (in[1] + ... In[n])  1} C[1:n]:: do true  {MUTEX  in[i]=0} Sem !P( 1 ) {MUTEX  in[i]=1} critical section Sem !V( 0 ) {MUTEX  in[i]=0} non-critical section od Sem :: {MUTEX  (in[1]+...+in[n]=1)=1} do ( i :1..n) C[ i ] ? P( in[i] )  {MUTEX  (in[1]+...+in[n]=1)=1} C[ i ] ? V( in[i] ) {MUTEX  (in[1]+...+in[n]=1)=0} od </li></ul>
  31. 31. Semântica Formal <ul><li>Exemplo ( seção crítica ): </li></ul><ul><ul><li>Isoladamente, as provas de cada processo são verdadeiras; </li></ul></ul><ul><ul><ul><li>As únicas ações de atribuições são os comandos de atribuição; </li></ul></ul></ul><ul><ul><li>Prova de satisfação: </li></ul></ul><ul><ul><ul><li>Existem dois pares de comandos de atribuição casados; </li></ul></ul></ul><ul><ul><ul><ul><li>Porta P; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Porta V; </li></ul></ul></ul></ul>
  32. 32. Semântica Formal <ul><li>Exemplo ( seção crítica ): </li></ul><ul><ul><li>Prova de Satisfação: </li></ul></ul><ul><ul><li>Para o par que se comunica pela porta P: </li></ul></ul><ul><ul><ul><li>(MUTEX  in [ i ]=0  ( in [1] + ... + in [ n ]) = 0)  (MUTEX  in[i] = 1  ( in [1] + ... + in [ n ]) = 1) 1 in[i] </li></ul></ul></ul><ul><ul><li>Para o par que se comunica pela porta V: </li></ul></ul><ul><ul><ul><li>(MUTEX  in [ i ]=1  ( in [1] + ... + in [ n ]) = 1)  (MUTEX  in[i] = 0  ( in [1] + ... + in [ n ]) = 0) 0 in[i] </li></ul></ul></ul>
  33. 33. Semântica Formal <ul><li>Exemplo ( seção crítica ): </li></ul><ul><ul><li>Prova de não-interferencia: </li></ul></ul><ul><ul><ul><li>Uma vez que as unicas ações de atribuições são os comandos de comunicação, a primeira parte da prova é verdadeira trivialmente ; </li></ul></ul></ul><ul><ul><ul><li>A única fonte eventual de não-interferência : ações de comunicação em dois processos em relação a uma assertiva em um terceiro ; </li></ul></ul></ul>
  34. 34. Semântica Formal <ul><li>Exemplo ( seção crítica ): </li></ul><ul><ul><li>Prova de não-interferencia: </li></ul></ul><ul><ul><ul><li>Exemplo : Considere o primeiro comando de saída ( out ) em C[i], o primeiro comando de entrada de Sem ( in ) e a primeira assertiva crítica de C[j] (C) </li></ul></ul></ul><ul><ul><ul><ul><li>pre(in) = {MUTEX  in[i]=0} </li></ul></ul></ul></ul><ul><ul><ul><ul><li>pre(out) = {MUTEX  (in[1]+...+in[n]=1)=0} </li></ul></ul></ul></ul><ul><ul><ul><ul><li>C = {MUTEX  in[j]=0} </li></ul></ul></ul></ul>
  35. 35. Semântica Formal <ul><li>Exemplo ( seção crítica ): </li></ul><ul><ul><li>Prova de não-interferencia: </li></ul></ul><ul><ul><ul><li>NIsynch(in,out,C) = { MUTEX  ( in [1]+...+ in [n]=1)=0  in [ i ]=0  in [ j ]=0}  MUTEX  in [ j ]=0) 1 in [ i ] </li></ul></ul></ul><ul><ul><li>Os demais casos são análogos; </li></ul></ul>
  36. 36. Semântica Formal Segurança e Liveness <ul><li>Métodos de exclusão de configurações pode ser usado para provar que dois processos não podem estar simultaneamente no mesmo estado: </li></ul><ul><ul><li>Ex: Na aplicação anterior, dois clientes não podem estar ao mesmo tempo em suas regiões críticas, uma vez que : ( MUTEX  in [ i ]=1  in [ j ]=1  i  j ) = false </li></ul></ul>
  37. 37. Semântica Formal Segurança e Liveness <ul><li>Provando deadlocks </li></ul><ul><ul><li>Prova mais difícil que em comunicação assíncrona; </li></ul></ul><ul><ul><li>Processo pode ser bloqueado nas operações de entrada e saída; </li></ul></ul><ul><ul><li>Um processo está bloqueado se está executando um comnado de comunicação que ainda não foi casado; </li></ul></ul><ul><ul><ul><li>Todo comando de comunicação é potencialmente uma fonte de deadlocks ; </li></ul></ul></ul><ul><ul><ul><li>A maioria das vezes o bloqueio é temporário; </li></ul></ul></ul>
  38. 38. Semântica Formal Segurança e Liveness <ul><li>Provando deadlocks (cont.) </li></ul><ul><ul><li>Configuração potencialmente blocante (CPB) : </li></ul></ul><ul><ul><ul><li>Todos os processos estão efetuando uma operação de comunicação; </li></ul></ul></ul><ul><ul><ul><li>As pré-condições das várias operações de comunicação são verdadeiras; </li></ul></ul></ul><ul><ul><li>Condições para liberdade de d eadlock ; </li></ul></ul><ul><ul><ul><li>CPB não existe, ou; </li></ul></ul></ul><ul><ul><ul><li>CPB existe, e sempre há um par de operações de comunicação que casam; </li></ul></ul></ul>
  39. 39. Semântica Formal Segurança e Liveness <ul><li>Propriedades de Liveness </li></ul><ul><ul><li>Dependem do escalonamento das operações de entrada e saída ; </li></ul></ul><ul><ul><li>Política de escalonamento incondicionalmente justa : </li></ul></ul><ul><ul><ul><li>Uma vez que o processo atinge os comandos de entrada e sáída, lá permanecem até que sejam executados; </li></ul></ul></ul>
  40. 40. Semântica Formal Segurança e Liveness <ul><li>Propriedades de Liveness </li></ul><ul><ul><li>Comunicação guardada: </li></ul></ul><ul><ul><ul><li>Escalonamento fortemente justo; </li></ul></ul></ul><ul><ul><ul><li>Condições booleanas referem-se somente a variáveis locais; </li></ul></ul></ul><ul><ul><ul><ul><li>Uma vez verdadeiras, sempre verdadeiras; </li></ul></ul></ul></ul>
  41. 41. II. Memória Distibuída Cap. 7 Passagem de Mensagens Síncrona ( Aplica ções ) Fco. Heron de Carvalho Jr., Msc. fhcj @ poli .upe.br
  42. 42. Aplica ções a Estudar <ul><li>Redes de Filtros ; </li></ul><ul><ul><li>Geração de números primos (a peneira de Eratosthenes); </li></ul></ul><ul><li>Algoritmos Sistólicos ( Interação de Processos ); </li></ul><ul><ul><li>Multiplicação de Matrizes; </li></ul></ul><ul><li>Clientes e Servidores; </li></ul><ul><ul><li>Alocação de recursos; </li></ul></ul>
  43. 43. Passagem de Mensagens Síncrona (Aplicações) <ul><li>Rede de Filtros </li></ul><ul><li>( a peneira de Eratosthenes ) </li></ul>
  44. 44. Rede de Filtros (A Peneira de Eratosthenes) <ul><li>Implementação Sequencial var num[2:n]:([n-1] 0) var p:=2, i:int {I: p é primo  (  j: 2  j  (p-1) 2 : num[j] = 0  j é primo )} do p*p  n  fa i:=2*p to n by p  num[i] := 1 af p := p + 1 do num[p] = 1  p := p + 1 od od </li></ul>
  45. 45. Rede de Filtros (A Peneira de Eratosthenes) <ul><li>Implementação Distribuída ( pipe-line ) Sieve [1]:: var p:=2, i:int # passar pares para Sieve[2] fa i := 3 to n by 2 -> Sieve [2]!i af Sieve [i:2..L]:: ... </li></ul>
  46. 46. Rede de Filtros (A peneira de Eratosthenes) <ul><li>Implementação Distribuída ( pipe-line ) Sieve [1] :: ... </li></ul><ul><li>Sieve [i:2..L]:: var p:int, next:int Sieve [i-1]?p # p é primo do true -> # receber próximo candidato Sieve [i-1]?next # passar adiante se não é múltiplo de p if next mode p  0 -> Sieve [i+1]!next fi od </li></ul>
  47. 47. Passagem de Mensagens Síncrona (Aplicações) <ul><li>Algoritmo Sistólico </li></ul><ul><li>( Multiplica ção de Matrizes) </li></ul>
  48. 48. Algoritmo Sist ólico (Multiplicação de Matrizes) <ul><li>Implementação Distribuída (malha circular, torus ) P[i:1..n,j:1..n]:: var aij, bij, cij: real var new:real, k:int if P[i,j-i]!aij -> P[i,j+i]?aij [] P[i,j+i]?new -> P[i,j-i]!aij fi if P[i-1,i]!aij -> P[i+i,j]?aij [] P[i+1,i]?new -> P[i-1,j]!aij fi cij := aij * bij (...) </li></ul>
  49. 49. Algoritmo Sist ólico (Multiplicação de Matrizes) <ul><li>Implementação Distribuída (malha circular, torus ) P[i:1..n,j:1..n]:: (...) fa k := 1 to n-1 -> if P[i,j- 1 ]!aij -> P[i,j+ 1 ]?aij [] P[i,j+ 1 ]?new -> P[i,j- 1 ]!aij fi if P[i-1, 1 ]!aij -> P[i+ 1 ,j]?aij [] P[i+1, 1 ]?new -> P[i- 1 ,j]!aij fi cij = cij + aij * bij af </li></ul>
  50. 50. Passagem de Mensagens Síncrona (Aplicações) <ul><li>Clientes e Servidores </li></ul><ul><li>( Servidor de Arquivos ) </li></ul>
  51. 51. Clientes e Servidores (Servidor de Arquivos) <ul><li>File[i:1..n]:: var fname:string, args:outros argumentos var more:bool var local buffer, cache, disk address, etc. do (c:1..m) Client[c]? open ( fname ) -> abre o arquivo Client[c]! open_reply () ; more := true do more -> if Client[c]? read (args) -> handle read; Client[c]! read_reply ( res ) [] Client[c]? write (args) -> handle write; Client[c]! write_reply ( res ) [] Client[c]? close () -> close file ; more := false fi od od </li></ul>
  52. 52. Clientes e Servidores (Servidor de Arquivos) <ul><li>Client[i:1..m]:: var serverid :int do (i:1..n) File[i]! open (“foo”) serverid := i; File[i]? open_reply () od … # Para ler File[ serverid ]! read ( access arguments ) File[ serverid ]! read_reply ( results ) … # Para escrever File[ serverid ]! write ( access arguments ) File[ serverid ]! write_reply ( results ) … # Para fechar o arquivo File[ serverid ]! close () </li></ul>

×