Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

30
Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Transcript of Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Page 1: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Introdução a JCSP

Augusto Sampaio (acas)Patrícia Muniz (pmf)Rafael Duarte (rmd)

Page 2: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Antes de JCSP ...

Implementação pode ser realizada em outra plataforma• UML-RT• CTJ (Biblioteca semelhante a JCSP)• occam (“implementação” de CSP)• ...

Mas o curso inclui apresentação apenas de JCSP e UML-RT

Page 3: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

JCSP - Características gerais Biblioteca Java que implementa o modelo

de comunicação e concorrência de CSP/occam (com restrições)

Suporta o projeto orientado a processos Implementação com base no mecanismo

de threads/monitor de Java Versões

• Base Edition • Network Edition (suporte a distribuição)

Page 4: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

JCSP - Características gerais Elementos de CSP disponíveis

• Canais • Comunicação (também com buffer e multi)• Composição seqüencial• Paralelismo (não alfabetizado)• Escolha externa

Alguns operadores não implementados• Hiding, interrupção, paralelismo

alfabetizado, indexação, ...

Page 5: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Processos em JCSP ... Um processo é uma entidade autônoma

(fluxo de execução independente) Encapsula estado (atributos) e métodos

• Construtores são públicos Comunicação com o ambiente via canais

(como em CSP ou como cápsulas UML-RT) Comportamento ativo (fluxo) implementado

pelo método run() (público)

Page 6: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Processos em JCSP ...

Um processo é um objeto de uma classe que implementa a interface CSProcess

interface CSProcess { public void run();}

Toda classe que implementa CSProcess deve prover uma implementação de run()

Page 7: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

... private support methods (part of a run) ... public void run() (process starts here)

Estrutura de um processoEstrutura de um processoclass Example implements CSProcess {

}

... private shared synchronisation objects (channels etc.) ... private state information

... public constructors ... public accessors(gets)/mutators(sets) (only to be used when not running)

Page 8: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Canais em JCSP ... Um canal é um objeto de uma classe

que implementa uma das interfaces:• ChannelInput• ChannelOutput• ChannelInputInt• ChannelOutputInt

Page 9: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Canais em JCSP Um canal carrega algum tipo de

informação Canais podem levar informação a um

processo (output channels), ou trazer informação de um processo (input channels)

Page 10: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Processos e canais Quando um processo dispara um evento

através de um canal, permanece bloqueado até que seu receptor responda

class P implements CSProcess{ ChannelOutput a; public void run() { a.write(...); }}

class P implements CSProcess{ ChannelOutput a; public void run() { a.write(...); }}

class Q implements CSProcess{ ChannelInput a; public void run() { x = a.read(); }}

class Q implements CSProcess{ ChannelInput a; public void run() { x = a.read(); }}

Page 11: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

interface ChannelOutput { public void write (Object o);}

interface ChannelInput { public Object read ();}

interface ChannelOutputInt { public void write (int o);}

interface ChannelInputInt { public int read ();}

Interfaces para canais de inteiros e objetos

Page 12: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

One2OneChannelOne2OneChannel

Any2OneChannelAny2OneChannel

Não são canais broadcast! zero-buffering

Page 13: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

One2AnyChannelOne2AnyChannel

Any2AnyChannelAny2AnyChannel

Não são canais broadcast! zero-buffering

Page 14: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Canais em JCSP

Page 15: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Como default, canais são (fully synchronised).• Write -> Read, Read ->Write

JCSP oferece um conjunto de plugins de canais que fornece uma variedade de tipos de bufferização (FIFO blocking, overflowing, overwriting, infinite)

Ver jcsp.util.

Canais de objetos … Canais de objetos …

Page 16: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

public SuccInt (ChannelInputInt in, ChannelOutputInt out) { this.in = in; this.out = out; }

public void run () { while (true) { int n = in.read (); out.write (n + 1); } }

private final ChannelInputInt in; private final ChannelOutputInt out;

class SuccInt implements CSProcess {

}

SuccIntSuccIntin out

Exemplo

Page 17: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

public PlusInt (ChannelInputInt in0, ChannelInputInt in1, ChannelOutputInt out) { this.in0 = in0; this.in1 = in1; this.out = out; }

... public void run ()

private final ChannelInputInt in0; private final ChannelInputInt in1; private final ChannelOutputInt out;

class PlusInt implements CSProcess {

}

in1

outin0++

Exemplo

Page 18: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

seqüencialseqüencial seqüencialseqüencial

... public PlusInt (ChannelInputInt in0, ...)

public void run () { while (true) { int n0 = in0.read (); int n1 = in1.read (); out.write (n0 + n1); } }

... private final channels (in0, in1, out)

class PlusInt implements CSProcess {

}

in1

outin0++

Exemplo

Page 19: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Redes de processos

Instâncias de processos (componentes) podem ser combinadas para formar uma rede

A rede resultante é também um processo

Componentes são interligados via conectores (instâncias dos canais)

Os componentes executam em paralelo, como em um diagrama de estrutura UML-RT

Page 20: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

A classe Parallel

Parallel é um CSProcess cujo construtor tem como argumento um array de processos

O método run() implementa a composição paralela dos processos argumentos

A semântica é a mesma do operador de CSP || [Hoare]: o método run() termina apenas quando todos os argumentos finalizam com sucesso

Page 21: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

public void run () {

}

in1

outin0++

while (true) { parRead.run (); out.write (readIn0.getValue() + readIn1.getValue()); }

ProcessReadInt readIn0 = new ProcessReadInt (in0); ProcessReadInt readIn1 = new ProcessReadInt (in1);

CSProcess parRead = new Parallel (new CSProcess[] {readIn0, readIn1});

em paralelo dos em paralelo dos argumentos de argumentos de entrada Leituraentrada Leitura

Exemplo

Evite o uso de sets, ou métodos públicos além do run. É possivel colocar, mas não é recomendado

Page 22: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Mais sobre a classe Parallel Oferece métodos para adicionar

(addProcess) e remover processos (removeProcess)

Entretanto, estes métodos só devem ser invocados quando o objeto não está em execução (método run())

Se invocados durante a execução, o efeito só ocorrerá após o final da mesma

Page 23: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Detalhes de implementação

Um objeto JCSP Parallel executa os primeiros (n-1) componentes em threads separadas e o último componente na sua própria thread de controle.

Quando Parallel.run() termina, o objeto Parallel guarda todas as threads para reuso, caso o Parallel execute novamente

Processos como PlusInt geram o overhead de criação de threads apenas a primeira vez

Portanto, definir/criar parRead fora do loop, ao invés de construí-lo anonimamente em cada iteração tem forte impacto em eficiência

Page 24: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Exercício Implemente em JCSP o processo

Main

Send (i) = chan ! i -> Send (i+1) Read = chan ? x -> Print(x); Read Print(x) = ...

Main = Send (0) || Read

Page 25: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

public class Send implements CSProcess { private final ChannelOutputInt chan; private int i;

public Send(ChannelOutputInt chan, int i) { this.chan = chan; this.i = i; }

public void run() { while (true) { chan.write(i);

i = i + 1; } } }

Exercício 1 – processo Send

Page 26: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

public class Read implements CSProcess { private final ChannelInputInt chan;

public Read(ChannelInputInt chan) { this.chan = chan;

}

public void run() {while (true) { int i = chan.read(); System.out.println(i);}

} }

Exercício – processo Read

Page 27: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

public class ExampleMain { public static void main (String[] args) {

One2OneChannelInt chan = Channel.one2oneInt();

Send send = new Send(chan.out(),0); Read read = new Read (chan.in()); CSProcess[] parArray = {send,read}; Parallel par = new Parallel (parArray); par.run(); } }

Exercício – processo Main

Page 28: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

public class ExampleMain { public static void main (String[] argv) {

One2OneChannelInt chan1 = Channel.one2oneInt();

One2OneChannelInt chan2 = Channel.one2oneInt();

new Parallel ( new CSProcess[] { new Send (chan1.out()), new IdentityInt(chan1.in(), chan2.out()),new Read (chan2.in())} ).run ();

} }

Exercício 2 – Comunicação Assíncrona

Send Identity Readchan1 chan2

Page 29: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Composição seqüencial class Sequence (implements

CSProcess)

•CSProcess cujo construtor tem como argumento um array de processos

•O método run() implementa a composição seqüencial dos processos argumentos.

Page 30: Introdução a JCSP Augusto Sampaio (acas) Patrícia Muniz (pmf) Rafael Duarte (rmd)

Leitura e Instalação

An Introduction to JCSP Base Edition (tutorial interessante, mas versão da biblioteca não é a mais atual)http://www.quickstone.com/resources/jcspnetworkedition/IntroductionToJCSP.pdf

Versão mais atualhttp://www.cs.kent.ac.uk/projects/ofa/jcsp/jcsp1-0-rc7/jcsp-docs/

Instalaçãohttp://www.cs.kent.ac.uk/projects/ofa/jcsp/