mapeamento de csp para jcsp patrícia muniz (pmf) rafael duarte (rmd)

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

Upload: internet

Post on 19-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

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/