1 / 29

Mapeamento de CSP para JCSP

Mapeamento de CSP para JCSP. Patrícia Muniz (pmf) Rafael Duarte (rmd). Revisão JCSP. Um processo é um objeto de uma classe que implementa: O comportamento do processo é determinado pelo corpo do método run(). interface CSProcess { public void run(); }. Revisão JCSP.

anja
Télécharger la présentation

Mapeamento de CSP para JCSP

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Mapeamento de CSP para JCSP Patrícia Muniz (pmf) Rafael Duarte (rmd)

  2. Revisão JCSP • Um processo é um objeto de uma classe que implementa: • O comportamento do processo é determinado pelo corpo do método run() interface CSProcess { public void run(); }

  3. Revisão JCSP • Um canal é um objeto de uma classe que implementa: interface Channel { }

  4. Revisão JCSP • Já vimos interfaces e classes JCSP que implementam: • Processos • Canais • Paralelismo • Composição sequencial • Falta apresentar escolha (Alternative)

  5. algoritmo de seleção Alternative • Implementa (external) choice • Exemplo: AltingChannelInputch1, ch2 = ... Guard[] guards = new Guard[] {ch1, ch2}; boolean[] preconditions = new boolean[] {g1, g2}; Alternative alt = new Alternative(guards); int indexGuard = alt.select(preconditions);

  6. Canais em JCSP

  7. Torna-se ativo quando o timeout dispara Sempre ativo Torna-se ativo quando uma chamada de método pode ser executada Torna-se ativo quando chega um sinal Alternative • Uma guarda pode ser apenas um evento de entrada, ou um timeout, ou o processo Skip

  8. O evento a foi selecionado porque está ativo, embora tenha sido direcionado para outro processo Alternative • Canais One2Any e Any2Any não podem ser usados como guardas, porque podem gerar inconsistências One2AnyChannel a; alt = new Alternative(a.in()); switch (alt.select()) case 0: a.in().read(); One2AnyChannel a; a.out().write(...); One2AnyChannel a; a.in().read(); Não compila! SharedChannelInput não é do tipo Guard

  9. Mapeamento de canais • One2OneChannel a = P(a.out()) [|a|] Q(a.in()) • One2AnyChannel a = P(a.out()) [|a|] (Q1(a.in()) ||| Q2(a.in())) • Any2OneChannel a = (P1(a.out()) ||| P2(a.out())) [|a|] Q(a.in()) • Any2AnyChannel a = (P1(a.out()) ||| P2(a.out())) [|a|] (Q1(a.in()) ||| Q2(a.in())) Na prática a comunicação é sempre ponto-a-ponto, porque apenas 2 processos se comunicam por vez

  10. Mapeamento de processos • O que temos em CSP? • P = pre & a -> P • P = a?x:{restricao} -> P • P = a!x?y -> P • P = (a -> P) [] (b -> P) • P = (a -> P) |~| (b -> P) • P = a -> Q • P = (a -> Q) [] (b -> R) • P = Q ||| R • P = Q || R • P = Q |a| R • .... CUIDADO JCSP não possui mecanismos naturais para algumas destas construções!

  11. Mapeamento de processos 1. P = pre & a -> P P implements CSProcess { AltingChannelInput a; public void run() { boolean pre = ... Guard[] guards = new Guard[]{a}; bollean[] preconditions = new boolean[] {pre}; Alternative alt = new Alternative(guards); while (true) { switch (alt.select(preconditions)) case 0: a.read(); break; } } }

  12. Mapeamento de processos 2. P = a?x:{restricao} -> P • A restrição de um valor de entrada pode ser verificada apenas após a leitura do dado. • Mas neste ponto já houve sincronização!! • Se o canal for de saída (ChannelOutput), a restrição pode ser implementada if (f_restricao(x)) { a.write(x); }

  13. Mapeamento de processos 3. P = a!x?y -> P • Há várias formas de implementar canais com múltiplos dados • Atenção para troca mútua de dados: P(e) = a?x!e -> P(e) Q(e) = a!x?e -> Q(e)

  14. Mapeamento de processos 3.1 P = a!x?y -> P P = a!x?y -> ... // um canal para cada dado Q = a?x!y -> ... P { ChannelOutput ax; AltingChannelInput ay; ... ax.write(valueX); DataY valueY = (DataY)ay.read(); ... } Q { AltingChannelInput ax; ChannelOutput ay; ... DataX valueX = (DataX)ax.read(); ay.write(valueY); ... }

  15. Mapeamento de processos 4. P = (a -> P) [] (b -> P) • Os canais de entrada são naturalmente usados como Guard • Canais de saída não podem ser usados como Guard • opção 1: criar um novo canal de entrada e antecedê-lo ao canal de saída b!out -> .... user -> b!out -> ... • opção 2: usar um timeout antes da ocorrência do canal de saída

  16. Mapeamento de processos 4. P = (a!x -> P) [] (b?y -> P) P implements CSProcess { AltingChannelInput b, user; OutputChannel a; public void run() { Guard[] guards = new Guard[]{b, user}; Alternative alt = new Alternative(guards); while (true) { switch (alt.select()) case 0: b.read(); break; case 1: user.read(); a.write(..); break; } } }

  17. Mapeamento de processos 5. P = (a -> P) |~| (b -> P) • Noção pouco clara • O não-determinismo pode ser implementado através do método de seleção de Alternative select() – seleciona arbitrariamente na lista de guardas ativas priSelect() – seleciona o primeiro da lista de guardas ativas fairSelect() – seleciona a guarda ativa menos visitada

  18. Mapeamento de processos 6. P = a -> Q • P = a -> Skip;Q P implements CSProcess { ChannelInput a; public void run() { a.read(); new Q().run(); } } new Sequence( new CSProcess[] { new PSkip(..), new Q(...) } )

  19. Mapeamento de processos 6. P = a -> Q • Atenção para a passagem de parâmetros P(x) = ... -> Q(f(x)) onde definir f(x)? P implements CSProcess { Object x; public void run() { ... new Q( f(x) ).run(); } }

  20. Mapeamento de processos 7. P = (a -> Q) [] (b -> R) P implements CSProcess { AltingChannelInput a, b; public void run() { Guard[] guards = new Guard[]{a, b}; Alternative alt = new Alternative(guards); switch (alt.select()) case 0: a.read(); new Q().run(); break; case 1: b.read(); new R().run(); break; } }

  21. Mapeamento de processos 8. P = Q ||| R • Canais Any2One, One2Any e Any2Any class Q implements CSProcess { ChannelInput a; ChannelOutput b; a.in().read(); ... b.out().write(...); } class Exemplo { Any2OneChannel a = Channel.any2one(); One2AnyChannel b = Channel.one2any(); public void run(){ new Parallel (new CSProcess[] { new Q(a.out(),b.in()), //b.in()!=b.in() // a.out() SharedChannelOutoput new Q(a.out(),b.in()), //b.in() SharredChannelInput new CSProcess () { public void run () { a.out().write(1); b.in().read();} } }).run (); }}

  22. Mapeamento de processos 9. P = Q || R e 10. P = Q |a| R • Canais One2One devem ser usados para garantir a sincronização ponto-a-ponto • Os demais tipos de canais (One2Any, Any2One, Any2Any) não garantem comunicação síncrona entre todos os participantes. • A sincronização é alcançada pelo uso da referência ao mesmo canal em Q e R

  23. Mapeamento de processos 9. P = Q || R e 10. P = Q |a| R • Para cada2 processos em paralelo é usado 1 canal One2One para cada evento de sincronização // Q |a| R One2OneChannel a = Channel.one2one(); public void run(){ new Parallel (new CSProcess[] { new Q(a.in()), new R(a.out()) }).run (); }

  24. Mapeamento de processos 9. P = Q || R e 10. P = Q |a| R • Para 3 ou mais processos em paralelo é usado um array de canais One2One para cada evento de sincronização // (Q |a| R) |a| S One2OneChannel[] a = Channel.one2oneArray(3); new Parallel ( new Parallel (new CSProcess[] { new Q_11(a[1].in(),a[2].out()), new R_11(a[2].in(),a[0].out()), new S_11(a[0].in(),a[1].out()) } ).run();

  25. Outras construções de JCSP • Barriers • Enquanto um Channel pode sincronizar apenas 2 processos por vez (reader e writer), Barriers podem sincronizar qualquer número definido de processos • Executam eventos que não transmitem qualquer informação, mas que bloqueiam processos até que todos possam sincronizar • Não podem ser guardas de um Alternative barrier P P P

  26. Exemplo final Barrier barrier = new Barrier (nPlayers); for (inti = 0; i < players.length; i++) { players[i] = new Player (i, nPlayers, barrier);} .... public void run(){ System.out.println ("Player " + id + " at the barrier ..."); barrier.sync (); System.out.println ("\t\t\t... Player " + id + " over the barrier"); }

  27. flush() Outras construções de JCSP • Buckets • Executam eventos que não transmitem qualquer informação, mas que bloqueiam processos até que seu método flush() seja executado • São não-determinísticos, desde que a decisão para executar o flush() é uma escolha interna do processo responsável Flusher bucket P P P

  28. Exercício • Implementar em JCSP os seguintes processos: VM(c,t) = c > 0 & coffee -> VM(c-1,t) [] t > 0 & tea -> VM(c,t-1) CLIENT = coffee -> CLIENT |~| tea -> CLIENT SYSTEM = VM(10,10) [|{|coffee, tea|}|] CLIENT

  29. Exemplos: www.cin.ufpe.br/~pmf/jcsp www.cin.ufpe.br/~rmd/esd/ Lembrete: Documentação mais atual: http://www.cs.kent.ac.uk/projects/ofa/jcsp/jcsp1-0-rc7/jcsp-docs/

More Related