A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Mapeamento de CSP para JCSP Patrícia Muniz (pmf) Rafael Duarte (rmd)"— Transcrição da apresentação:

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(); } interface CSProcess { public void run(); }

3 Revisão JCSP Um canal é um objeto de uma classe que implementa: interface Channel { } 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 Alternative –Implementa (external) choice –Exemplo: AltingChannelInput ch1, ch2 =... Guard[] guards = new Guard[] {ch1, ch2}; boolean[] preconditions = new boolean[] {g1, g2}; Alternative alt = new Alternative(guards); int indexGuard = alt.select(preconditions); AltingChannelInput ch1, ch2 =... Guard[] guards = new Guard[] {ch1, ch2}; boolean[] preconditions = new boolean[] {g1, g2}; Alternative alt = new Alternative(guards); int indexGuard = alt.select(preconditions); algoritmo de seleção

6 Canais em JCSP

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

8 Alternative Canais One2Any e Any2Any não podem ser usados como guardas, porque podem gerar inconsistências One2AnyChannel a; a.out().write(...); One2AnyChannel a; a.out().write(...); One2AnyChannel a; alt = new Alternative(a.in()); switch (alt.select()) case 0: a.in().read(); One2AnyChannel a; alt = new Alternative(a.in()); switch (alt.select()) case 0: a.in().read(); One2AnyChannel a; a.in().read(); One2AnyChannel a; a.in().read(); a O evento a foi selecionado porque está ativo, embora tenha sido direcionado para outro processo 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? 1.P = pre & a -> P 2.P = a?x:{restricao} -> P 3.P = a!x?y -> P 4.P = (a -> P) [] (b -> P) 5.P = (a -> P) |~| (b -> P) 6.P = a -> Q 7.P = (a -> Q) [] (b -> R) 8.P = Q ||| R 9.P = Q || R 10.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; } 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);... } 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; } 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(); } P implements CSProcess { ChannelInput a; public void run() { a.read(); new Q().run(); } new Sequence( new CSProcess[] { new PSkip(..), new Q(...) } ) 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(); } 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; } 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 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 ();} 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 cada 2 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 (); } // 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(); // (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 PPP

26 Exemplo final Barrier barrier = new Barrier (nPlayers); for (int i = 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"); } final Barrier barrier = new Barrier (nPlayers); for (int i = 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 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 bucket PPP Flusher flush()

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: Lembrete: Documentação mais atual: rc7/jcsp-docs/


Carregar ppt "Mapeamento de CSP para JCSP Patrícia Muniz (pmf) Rafael Duarte (rmd)"

Apresentações semelhantes


Anúncios Google