Canais Assíncronos I

680 visualizações

Publicada em

Aula sobre canais assíncronos

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
680
No SlideShare
0
A partir de incorporações
0
Número de incorporações
41
Ações
Compartilhamentos
0
Downloads
14
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Canais Assíncronos I

  1. 1. II. Memória Distibuída Passagem de Mensagens Assíncrona Fco. Heron de Carvalho Jr., Dr. heron @ lia.ufc.br
  2. 2. Introdução <ul><li>Os construtores de sincronização estudados até agora assumem a existência de uma memória compartilhada ; </li></ul><ul><ul><li>Variáveis globais visíveis aos processos; </li></ul></ul><ul><li>Desde a última década, arquiteturas de memória distribuída tem se tornado comuns; </li></ul><ul><ul><li>Memória local a cada processador; </li></ul></ul><ul><ul><li>Assume-se cada processo em num processador; </li></ul></ul><ul><ul><ul><li>Sistemas concorrentes distribuídos; </li></ul></ul></ul><ul><ul><li>Processos compartilham uma rede de comunicação; </li></ul></ul>
  3. 3. Introdução <ul><li>Tipos de processo em programas distribuídos: </li></ul><ul><ul><li>Filtros : transformadores de dados </li></ul></ul><ul><ul><li>Clientes : ativadores de requisições; </li></ul></ul><ul><ul><li>Servidores : reagem a estímulos (reativos); </li></ul></ul><ul><ul><li>Peer : um dentre uma coleção de processos idênticos que interagem para solucionar um problema; </li></ul></ul>
  4. 4. Introdução <ul><li>Comunicação em sistemas distribuídos </li></ul><ul><ul><li>Operações primitivas de rede; </li></ul></ul><ul><ul><ul><li>Exigem sincronização por espera ocupada; </li></ul></ul></ul><ul><ul><li>Definição de operações especiais de rede que incluem sincronização: </li></ul></ul><ul><ul><ul><li>Semelhante a o que semáforos são para variáveis compartilhadas ; </li></ul></ul></ul><ul><ul><ul><li>Primitivas de passagem de mensagens ; </li></ul></ul></ul>
  5. 5. Introdução <ul><li>Passagem de Mensagens </li></ul><ul><ul><li>Canais </li></ul></ul><ul><ul><ul><li>Abstração de um meio físico de transmissão na rede; </li></ul></ul></ul><ul><ul><ul><li>Caminho de comunicação entre dois processos; </li></ul></ul></ul><ul><ul><ul><li>Fila de mensagens; </li></ul></ul></ul><ul><ul><ul><li>Únicos objetos compartilhados por processos </li></ul></ul></ul><ul><ul><li>Primitivas send and receive : </li></ul></ul><ul><ul><ul><li>Processo executa send para enviar um dado através de um canal; </li></ul></ul></ul><ul><ul><ul><li>Processo executa receive em um canal para receber um dado que foi enviado por outro processo através deste canal; </li></ul></ul></ul><ul><ul><ul><li>Sincronização é realizada uma vez que uma mensagem não pode ser recebida até depois de ser enviada; </li></ul></ul></ul>
  6. 6. Passagem de Mensagens Assíncrona <ul><li>Canais são filas de mensagens , de tamanho potencialmente infinito ; </li></ul><ul><ul><li>send acrescenta um dado na cauda da fila; </li></ul></ul><ul><ul><li>receive retira um dado da frente da fila; </li></ul></ul><ul><li>Analogia com semáforos; </li></ul><ul><ul><li>send e receive podem ser vistas como operações V e P , respectivamente, mas carregando dados; </li></ul></ul><ul><ul><li>Número de elementos na fila de mensagens não recebidas no canal é o contador do semáforo. </li></ul></ul>
  7. 7. Passagem de Mensagens Assíncrona <ul><li>Notação: </li></ul><ul><ul><li>chan ch (id 1 :type 1 ,..., id n :type n ) </li></ul></ul><ul><ul><li>Exemplos: </li></ul></ul><ul><ul><ul><li>chan input ( char ) </li></ul></ul></ul><ul><ul><ul><li>chan disk_access ( cylinder , block , count : int , buffer : ptr [*] char ) </li></ul></ul></ul><ul><ul><ul><li>chan result [1: n ]( int ) </li></ul></ul></ul>
  8. 8. Passagem de Mensagens Assíncrona ( Notação ) <ul><li>send ch ( expr 1 ,..., expr n ) </li></ul><ul><ul><li>Os tipos de expr i devem corresponder aos tipos dos componentes do canal; </li></ul></ul><ul><ul><li>Exemplos: </li></ul></ul><ul><ul><ul><li>send input (2) </li></ul></ul></ul><ul><ul><ul><li>send disk_access (454,23, 10, data) </li></ul></ul></ul><ul><ul><ul><li>send result [2] (4) </li></ul></ul></ul><ul><ul><li>Não-blocante; </li></ul></ul><ul><ul><ul><li>Dado é enfileirado no canal; </li></ul></ul></ul>
  9. 9. Passagem de Mensagens Assíncrona ( Notação ) <ul><li>receive ch ( out var 1 ,..., out var n ) </li></ul><ul><ul><li>Os tipos de var i devem corresponder aos tipos dos componentes do canal; </li></ul></ul><ul><ul><li>Exemplos: </li></ul></ul><ul><ul><ul><li>receive input (in) </li></ul></ul></ul><ul><ul><ul><li>receive disk_access (cyl, bl, c, data) </li></ul></ul></ul><ul><ul><ul><li>result result [2] (r) </li></ul></ul></ul><ul><ul><li>blocante </li></ul></ul><ul><ul><ul><li>Processo é bloqueado quando a fila está vazia; </li></ul></ul></ul>
  10. 10. Passagem de Mensagens Assíncrona <ul><li>Assume-se: </li></ul><ul><ul><li>canais seguros; </li></ul></ul><ul><ul><ul><li>Sem corrupção de mensagens; </li></ul></ul></ul><ul><ul><ul><li>Sem replicação de mensagens; </li></ul></ul></ul><ul><ul><ul><li>Sem perda de mensagens; </li></ul></ul></ul><ul><ul><li>mensagens ordenadas; </li></ul></ul><ul><ul><ul><li>Recebimento na ordem de envio; </li></ul></ul></ul>
  11. 11. Passagem de Mensagens Assíncrona <ul><li>chan input (char), output ([1:MAXLINE] char) Char_to_Line :: var line [1:MAXLINE]: char, i :int := 1 do true  receive input ( line [i]) do line[ i ]  CR and i < MAXLINE  {*} i := i + 1; receive input ( line [i]) od send output ( line ); i :=1 od </li></ul><ul><li>* = line[1:i] contains last i input characters </li></ul>
  12. 12. Passagem de Mensagens Assíncrona ( Notação ) <ul><li>empty ch </li></ul><ul><ul><li>Verifica se o canal está vazio </li></ul></ul><ul><ul><li>Útil em diversas situações; </li></ul></ul><ul><ul><li>Não é um comando seguro; </li></ul></ul>
  13. 13. Passagem de Mensagens Assíncrona ( Notação ) <ul><li>Uso de canais: </li></ul><ul><ul><li>mailboxes : qualquer processo pode enviar ou receber de qualquer canal; </li></ul></ul><ul><ul><li>input port : um canal possui exatamente um processo que envia, embora vários possam receber; </li></ul></ul><ul><ul><li>link : exatamente um processo pode escrever e exatamente um processo pode ler no canal; </li></ul></ul>
  14. 14. II. Memória Distibuída Cap. 7 Passagem de Mensagens Assíncrona ( Aplica ções ) Fco. Heron de Carvalho Jr., Dr. fhcj @ poli .upe.br
  15. 15. Passagem de Mensagens Assíncrona (Aplicações) <ul><li>Redes de Filtros </li></ul><ul><li>( ordenação ) </li></ul>
  16. 16. Redes de Filtros Ordenação <ul><li>Solução usando um processo Sort </li></ul><ul><ul><li>SORT:  i: 1  i  n: sent[i]  sent[i+1]  valores enviados por output são uma permutação de valores recebidos de input; </li></ul></ul><ul><li>Esboço de solução: </li></ul><ul><ul><li>receba os números pelo canal input ordene os números envie os números ordenados ao canal output </li></ul></ul><ul><li>Uso de valores sentinelas : </li></ul><ul><ul><li>Detectando o final de uma lista; </li></ul></ul>
  17. 17. Redes de Filtros Ordenação <ul><li>Entretanto podemos utilizar uma rede de processos para efetuar a ordenação; </li></ul><ul><li>Processo MERGE </li></ul><ul><ul><li>Recebe os valores ordenados de duas streams ordenadas in1 e in2 ; </li></ul></ul><ul><ul><li>Produz uma nova stream out com os elementos recebidos ordenados; </li></ul></ul><ul><li>Na terminação do processo Merge ... </li></ul><ul><ul><li>MERGE :  in1 e in2 são vazias  sent[n+1] = EOS  (  i: 1  i  n: sent[i]  sent[i+1])  valores enviados por output são uma permutação de valores recebidos de in1 e in2 ; </li></ul></ul>
  18. 18. Redes de Filtros Ordenação <ul><li>Esboço de solução: chan in1 (int), in2 (int), out (int) Merge :: var v1, v2: int receive in1 (v1); receive in2 (v2); do more input to process -> send out(smaller from in1 or in2 ) receive from in1 or in2 od send out(EOS) {MERGE} </li></ul>
  19. 19. Redes de Filtros Ordenação <ul><li>Esboço de solução: chan in1 (int), in2 (int), out (int); Merge :: var v1, v2: int receive in1 (v1); receive in2 (v2); do v1  EOS  v2  EOS -> if v1  v2 -> send out(v1); receive in1(v1); [] v2 > v1 -> send out(v2); receive in2(v2); fi [] v1  EOS  v2 = EOS -> send out(v1); receive in1(v1); [] v1 = EOS  v2  EOS -> send out(v2); receive in2(v2); od send out(EOS) {MERGE} </li></ul>
  20. 20. Redes de Filtros Ordenação <ul><li>Processos Merge podem ser organizados em uma rede em árvore (ver quadro ); </li></ul><ul><li>Canais de entrada e saída devem ser compartilhados; </li></ul><ul><ul><li>Nomeação estática ; </li></ul></ul><ul><ul><li>Nomeração dinâmica ; </li></ul></ul><ul><li>Filtros podem ser organizados de outras formas; </li></ul>
  21. 21. Passagem de Mensagens Assíncrona (Aplicações) <ul><li>Clientes e Servidores </li></ul>
  22. 22. Clientes e Servidores <ul><li>Servidor é um processo que repetidamente atende requisições de processos clientes ; </li></ul><ul><li>Como programar servidores com passagem de mensagens ? </li></ul><ul><ul><li>Solução derivada de monitores; </li></ul></ul><ul><ul><li>Dualidade entre monitores e passagem de mensagem ; </li></ul></ul>
  23. 23. Clientes e Servidores <ul><li>Monitores Ativos </li></ul><ul><ul><li>Monitores são gerenciadores de recursos ; </li></ul></ul><ul><ul><li>Simulando monitores com processos servidores e passagem de mensagens ; </li></ul></ul><ul><ul><li>Inicialmente, assuminos uma única operação e o não emprego de variáveis condicionais; </li></ul></ul><ul><ul><li>monitor Mname #Invariant MI var permanent variables initialization code procedure op( formals ) body of op end end </li></ul></ul>
  24. 24. Clientes e Servidores <ul><li>chan request (int, types of value formals ) chan reply [1:n]( types of result formals ) Sname :: var permanent variables var index :int, value formals , result formals initialization code do true  {loop invariant MI} receive request ( index , value formals ) body of op # return reply to process that sent request send reply [ index ]( result formals ) od Client [ i :1..n]:: send request ( i , value arguments ) # “call” op receive reply [ i ]( result arguments ) # wait for reply … </li></ul>
  25. 25. Clientes e Servidores <ul><li>Cuidados especiais com clientes </li></ul><ul><ul><li>Uso dos canais reply (canais de resposta); </li></ul></ul><ul><li>Uso de nomeação dinâmica de canais; </li></ul><ul><ul><li>clientes não acessam canal de resposta de outro cliente; </li></ul></ul><ul><ul><li>Permite numero variável de clientes; </li></ul></ul><ul><li>Monitores com múltiplos procedimentos: </li></ul><ul><ul><li>Procedimento chamado como argumento de request ; </li></ul></ul><ul><ul><li>Argumentos e retorno de cada procedimento varia !! </li></ul></ul><ul><ul><ul><li>Tipos variantes ou enumerações; </li></ul></ul></ul><ul><ul><ul><li>Empacotamento/Desempacotamento pelo cliente; </li></ul></ul></ul>
  26. 26. Clientes e Servidores <ul><li>type op_kind = enum( op 1 ,…, op n ) type arg_type = union( arg 1 : atype 1 ,… arg n : atype n ) type result_type = union( res 1 : rtype 1 ,…, res n : rtype n ) chan request (int, op_kind , arg_type ) chan reply [1: n ]( res_type ) … </li></ul>
  27. 27. Clientes e Servidores <ul><li>… </li></ul><ul><li>Sname ::var permanent variables var index :int, kind : op_kind , args : arg_type , results : res_type initialization code do true  {loop invariant MI} receive request ( index , kind , args ) if kind = op 1  body of op 1 [] … [] kind = op n  body of op n </li></ul><ul><li>fi send reply [ index ](result formals) od … </li></ul>
  28. 28. Clientes e Servidores <ul><li>Client [ i :1..n]:: </li></ul><ul><li>var myargs : arg_type , myresults : result_type place value arguments in myargs send request ( i , op i , myargs ) # “call” op receive reply [ i ]( myresults ) # wait for reply … </li></ul>
  29. 29. Clientes e Servidores <ul><li>Até o momento não consideramos variáveis condicionais; </li></ul><ul><li>Usaremos um exemplo para mostrar como contruir soluções cliente/servidor a partir de monitores que empregam variáveis condicionais; </li></ul><ul><li>Resource_Allocator </li></ul><ul><ul><li>acquire (res id: int) </li></ul></ul><ul><ul><li>release (id: int) </li></ul></ul><ul><ul><li>Clientes requisitam e liberam recursos um de cada vez </li></ul></ul>
  30. 30. Clientes e Servidores <ul><li>monitor Resource_Allocator var avail :int := MAXUNITS, units :set of int := initial values var free :cond procedure acquire (res id: int) if avail = 0 -> wait( free ) [] avail > 0 -> avail := avail – 1 if id := remove( units ) end procedure release ( id :unit) insert ( id , units ) if empty( free ) -> avail := avail + 1 [] not empty( free ) -> signal( free ) fi end </li></ul><ul><li>end </li></ul>
  31. 31. Clientes e Servidores <ul><li>type op_kind = enum(ACQUIRE,RELEASE) </li></ul><ul><li>chan request(index, op_kind, unitid:int) </li></ul><ul><li>chan reply[1:n](int) </li></ul>
  32. 32. Clientes e Servidores <ul><li>Allocator::var avail :int := MAXUNITS, units: set of int </li></ul><ul><li>var pending : queue of int </li></ul><ul><li>var index :int, kind :op_kind, unitid :int </li></ul><ul><li>code to initialize units to appropriate valoes </li></ul><ul><li>do true -> </li></ul><ul><li>receive request ( index , kind , unitid ) </li></ul><ul><li>if kind = ACQUIRE -> </li></ul><ul><li>código de acquire </li></ul><ul><li>[] kind = RELEASE </li></ul><ul><li>código de release </li></ul><ul><li>fi </li></ul><ul><li>od </li></ul>
  33. 33. Clientes e Servidores <ul><li>Código de acquire : </li></ul><ul><li>… </li></ul><ul><li>i f avail > 0  # honor request now avail := avail - 1; unitid := remove( units ) send reply [ index ]( unitid ) [] avail = 0  # remenber request insert( pending , index ) fi … </li></ul>
  34. 34. Clientes e Servidores <ul><li>Código de release : </li></ul><ul><li>… </li></ul><ul><li>if empty(pending)  # return unitid avail := avail + 1; insert(units, unitid) [] not empty(pending)  # allocate unitid index := remove(pending) send reply[index](unitid) fi … </li></ul>
  35. 35. Clientes e Servidores <ul><li>Monitores </li></ul><ul><ul><li>Variáveis permanentes; </li></ul></ul><ul><ul><li>Indentificadores de procedimento; </li></ul></ul><ul><ul><li>Chamada de procedimento; </li></ul></ul><ul><ul><li>Comando wait ; </li></ul></ul><ul><ul><li>Comandos signal ; </li></ul></ul><ul><ul><li>Corpos de procedimentos; </li></ul></ul><ul><li>Passagem de Mensagem </li></ul><ul><ul><li>Variáveis locais do servidor; </li></ul></ul><ul><ul><li>Canal resposta e tipos de operação; </li></ul></ul><ul><ul><li>send request; receive reply; </li></ul></ul><ul><ul><li>Salvar requisições pendentes; </li></ul></ul><ul><ul><li>Recuperar e processar requisições pendentes; </li></ul></ul><ul><ul><li>Comandos case no tipo da operação; </li></ul></ul>
  36. 36. Clientes e Servidores <ul><li>Em um sistema hierárquico , servidores em um nível são frequentemente clientes de servidores em um nível mais baixo; </li></ul><ul><li>Servidores possuem toda a informação necessária para processar as requisições do cliente; </li></ul>
  37. 37. Clientes e Servidores <ul><li>Veremos agora outro tipo de interação de servidores; </li></ul><ul><ul><li>Servidores em um mesmo nível são pares que cooperam para prover um serviço; </li></ul></ul><ul><ul><li>Computações distribuídas onde nenhum dos servidores possuem informações suficientes para atender um cliente; </li></ul></ul><ul><li>Veremos a partir de agora diferentes tipos de problemas derivados desta mesma idéia e suas soluções; </li></ul>
  38. 38. Passagem de Mensagens Assíncrona (Aplicações) <ul><li>Algoritmos Sistólicos </li></ul><ul><li>Computação distribuída da topologia de uma rede de processos </li></ul>
  39. 39. Algoritmos Sistólicos ( Heartbeat ) <ul><li>Examinaremos agora um problema dentro da classe de soluções através de algoritmos sistólicos: </li></ul><ul><ul><li>Computação distribuída da topologia arbitrária de uma rede de processos; </li></ul></ul><ul><ul><li>Processos executam repetidamente as seguintes operações, até uma condição de terminação : </li></ul></ul><ul><ul><ul><li>Um processo informa as informações que contém sobre a topologia para os vizinhos; </li></ul></ul></ul><ul><ul><ul><li>Recebe as informações que os vizinhos tem sobre a topologia </li></ul></ul></ul><ul><ul><ul><li>Combina as informações; </li></ul></ul></ul><ul><ul><li>Analogia com batimentos cardíacos ( sístole e diástole ) </li></ul></ul>
  40. 40. Algoritmos Sistólicos ( Heartbeat ) <ul><li>Solução usando variáveis compartilhadas: TOPOLOGY: (  p,q: 1  p  n, 1  q  n: top [p,q]  links p [q]) var top[1:n,1:n]:bool := ([n+n] False); Node[p:1..n]:: var links[1:n]:bool # inicialmente links[q] é verdade se # q é vizinho de p fa q:=1 to n st links[q] -> top[p,q] := True af { top[p,1:n] = links[1:n] } … </li></ul>
  41. 41. Algoritmos Sistólicos ( Heartbeat ) <ul><li>Solução distribuída óbvia: </li></ul><ul><ul><li>Cada processo envia seu vetor links para um processo coordenador T; </li></ul></ul><ul><ul><li>Mas para isso T teria que estar conectado a cada um dos processos, o que não é uma suposição razoável; </li></ul></ul><ul><ul><li>Solução : processos vizinhos de T passariam adiante as mensagens dos demais processos; </li></ul></ul><ul><ul><ul><li>Solução assimétrica ; </li></ul></ul></ul><ul><ul><ul><li>Difícil de desenvolver, entender e sujeita a falhas, sendo mais difícil a correção destas; </li></ul></ul></ul><ul><ul><li>Devemos buscar uma solução simétrica ; </li></ul></ul>
  42. 42. Algoritmos Sistólicos ( Heartbeat ) <ul><li>Solução simétrica: </li></ul><ul><ul><li>Cada processo computa a topologia d e toda a rede ; </li></ul></ul><ul><ul><li>Inicialmente cada processo sabe a informação de suas conexão com seus vizinhos; </li></ul></ul><ul><ul><li>Realiza repetidamente as seguintes operações: </li></ul></ul><ul><ul><ul><li>Enviar aos vizinhos seu conhecimento local sobre a topologia; </li></ul></ul></ul><ul><ul><ul><li>Perguntar o que cada vizinho sabe sobre a topologia; </li></ul></ul></ul><ul><ul><ul><li>Combinar com o que o processo sabe; </li></ul></ul></ul><ul><ul><li>A cada r passos, o processo conhece as informações sobre a sub-rede composta pelos processos que estão a distância r dele: </li></ul></ul><ul><ul><ul><li>ROUND: (  q: 1  q  n: (dist(p,q)  r  top[p,*] filled in) </li></ul></ul></ul>
  43. 43. Algoritmos Sistólicos ( Heartbeat ) <ul><li>Solução simétrica (cont.): </li></ul><ul><ul><li>Terminação: </li></ul></ul><ul><ul><ul><li>Em D passos, onde D é o diâmetro da rede, assegura-se que cada processo sabe a topologia total da rede; </li></ul></ul></ul><ul><ul><ul><li>É necessário portanto conhecer o diâmetro da rede; </li></ul></ul></ul><ul><ul><li>Veja a solução a seguir: </li></ul></ul>
  44. 44. Algoritmos Sistólicos ( Heartbeat ) <ul><li>chan topology[1:n](1:n, 1:n) bool) Node[p:1..n]: : var links[1:n]:bool var top[1:n, 1:n]: bool := ([n*n] false) top[p,1..n] := links var r:int := 0 var newtop[1:n, 1:n]: bool {top[p,1:n] = links[1:n]  r = 0} {ROUND} do r < D -> fa q:=1 to n st links[q] -> send topology[q](top) af fa q:=1 tp n st links[q] -> receive topology[p](newtop) top := top or newtop af r := r + 1 od {ROUND  r = D} {TOPOLOGY} </li></ul>
  45. 45. Algoritmos Sistólicos ( Heartbeat ) <ul><li>Neste algoritmo é necessário conhecer o diâmetro da rede: </li></ul><ul><ul><li>Suposição nem sempre realista; </li></ul></ul><ul><li>Nova solução (D desconhecido): </li></ul><ul><ul><li>Processo satisfaz-se quando em cada linha de top existe pelo menos uma entrada True ; </li></ul></ul><ul><ul><ul><li>Supondo-se Rede conectada (existe um caminho entre cada par de processos); </li></ul></ul></ul><ul><ul><li>Mensagem adicional para informar vizinhos sempre que detectar finalização; </li></ul></ul>
  46. 46. Algoritmos Sistólicos ( Heartbeat ) <ul><li>Seja D o diâmetro da rede e m o máximo número de vizinhos de um processo: </li></ul><ul><ul><li>Número de mensagens trocadas é limitada por 2 * n * m * (D + 1); </li></ul></ul><ul><ul><li>Cada um dos n processos executa no máximo D + 1 estágios, trocando 2 mensagens com cada um de seus possíveis (no máximo) m vizinhos; </li></ul></ul>
  47. 47. Algoritmos Sistólicos ( Heartbeat ) <ul><li>Qualquer algoritmos sistólico possui a mesma estrutura do algoritmo discutido; </li></ul><ul><li>O que varia é o conteúdo das mensagens e estas como são processadas ; </li></ul><ul><li>Outra diferença importante é a condição de terminação : </li></ul><ul><ul><li>Nem sempre pode ser decidida localmente; </li></ul></ul>
  48. 48. Próxima Aula <ul><li>Algoritmos probe/echo ; </li></ul><ul><ul><li>Sondagem e eco; </li></ul></ul><ul><li>Algoritmos broadcast ; </li></ul><ul><ul><li>Disseminação; </li></ul></ul><ul><li>Algoritmos token-passing ; </li></ul><ul><li>Replicação de servidores; </li></ul>

×