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

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

Embed Size (px)

Citation preview

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

Mapeamento de CSP para JCSPMapeamento de CSP para JCSP

Patrícia Muniz (pmf)

Rafael Duarte (rmd)

Page 2: 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(); }

interface CSProcess { public void run(); }

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

Revisão JCSP

• Um canal é um objeto de uma classe que implementa:

interface Channel { } interface Channel { }

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

Revisão JCSP

• Já vimos interfaces e classes JCSP que implementam:– Processos– Canais– Paralelismo– Composição sequencial

• Falta apresentar escolha (Alternative)

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

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

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

Canais em JCSP

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

Alternative

• Uma guarda pode ser apenas um evento de entrada, ou um timeout, ou o processo Skip

Sempre ativo

Torna-se ativo quando o timeoutdispara

Torna-se ativo quando chega um sinal

Torna-se ativo quando umachamada demétodo pode serexecutada

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

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();

O evento aa foi selecionado porque está ativo, embora tenha sido direcionado para outro processo

Não compila! SharedChannelInput não é do tipo Guard

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

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

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

Mapeamento de processos

• O que temos em CSP?1. P = pre & a -> P2. P = a?x:{restricao} -> P3. P = a!x?y -> P4. P = (a -> P) [] (b -> P)5. P = (a -> P) |~| (b -> P)6. P = a -> Q7. P = (a -> Q) [] (b -> R)8. P = Q ||| R9. P = Q || R10. P = Q |a| R11. ....

CUIDADOJCSP não possui mecanismos naturais para algumas destas construções!

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

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;

}}

}

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

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 implementadaif (f_restricao(x)) {

a.write(x);}

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

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)

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

Mapeamento de processos

3.1 P = a!x?y -> PP = a!x?y -> ... // um canal para cada dadoQ = 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 dadoQ = 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);...

}

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

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

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

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;

}}

}

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

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 Alternativeselect() – seleciona arbitrariamente na lista de guardas ativas

priSelect() – seleciona o primeiro da lista de guardas ativas

fairSelect() – seleciona a guarda ativa menos visitada

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

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(...)

} )

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

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();

}}

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

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;

}}

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

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 (); }}

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

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

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

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| ROne2OneChannel a = Channel.one2one(); public void run(){ new Parallel (new CSProcess[] { new Q(a.in()), new R(a.out()) }).run (); }

// Q |a| ROne2OneChannel a = Channel.one2one(); public void run(){ new Parallel (new CSProcess[] { new Q(a.in()), new R(a.out()) }).run (); }

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

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| SOne2OneChannel[] 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| SOne2OneChannel[] 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();

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

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

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

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");}

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

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

P P P

Flusher

flush()

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

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

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

Exemplos: www.cin.ufpe.br/~pmf/jcspwww.cin.ufpe.br/~rmd/esd/

Lembrete:Documentação mais atual:

http://www.cs.kent.ac.uk/projects/ofa/jcsp/jcsp1-0-rc7/jcsp-docs/