Concorrência em LF1 Paradigmas de Linguagens de Programação 20 de junho de 2006 Aline Timóteo...

Preview:

Citation preview

Concorrência em LF1

Paradigmas de Linguagens de Programação20 de junho de 2006

Aline TimóteoCarlos Rodrigues

Flávia FalcãoTiago Rolim

Roteiro• Conceitos de concorrência

– Definição– Programação concorrente X seqüencial– Formas de implementar concorrência

• Visão geral de Erlang• Proposta de projeto

Concorrência

• Um programa seqüencial tem uma simples thread de controle.– Sua execução é chamada de

processo• Um programa concorrente tem

múltiplas threads de controle– Eles podem ser executados como

processos em paralelo

Por que programas concorrentes?• Otimização da computação

– Diminuir delay e aumentar throughput• Simulação

– Necessidade de modelar aspectos concorrentes do mundo real

• Paralelismo– Execução usando várias CPUs

• Distribuição– Coordenar serviços distribuídos

Características de linguagensconcorrentes

• Uma linguagem de programação concorrente deve prover mecanismos para:– Criar processo

• Como especificar processos concorrentes?– Comunicação

• Como fazer processos trocarem informações?– Sincronização

• Como fazer processos manterem consistência?

Formas de Implementar Concorrência• Compartilhamento

de memória– A comunicação é

feita ao alterar o conteúdo de áreas de memória compartilhadas.

– Java e C# são linguagens que utilizam tal modelo

x zy

P1P2

P3

• Troca de mensagem– A comunicação é feita através das troca de

mensagens– A troca de mensagens pode ser realizada

assincronamente– Erlang e Occam são linguagens que utilizam

tal modelo

P1

P2

P3

xy

z

Formas de Implementar Concorrência

• Troca de Mensagem– Canal para armazenar a mensagem

• Buffer• Fila de mensagens

– A comunicação em um canal pode ser um a um ou broadcast

– A mensagem trocada pode conter cópia do dado ou ponteiro para ele

Formas de Implementar Concorrência

Erlang• O que é?

Uma linguagem funcional, de uso geral, com suporte incorporado para concorrência, distribuição e tolerância a falhas.

• Para que serve?– Sistemas de Telecomunicações– Servidores de Internet– Gerenciamento de redes móveis– Aplicações de banco de dados

ErlangErlang• Características

– Linguagem declarativa– Não existe declaração de tipos de dados– Concorrência– Comunicação entre processos por

mensagens– Manipulação de exceções– Programação distribuída

ErlangErlang• Tipos de dados

– Números: Inteiros e Floats– Àtomos– Tuplos– Listas– Pids (Process Ids)– Ports (canais de comunicação)– Referências (objetos únicos ao nível de vários

nós)– Binários (pacotes ou outros conjuntos de bits)

ErlangErlang• Concorrência

– ProcessosPid=spawn(m,f,[Arg1,Arg2])

– Mensagens• Send

Pid ! Mensagem• Receive

receivePattern1 -> ação1;Pattern2 -> ação2;

end

Erlang – Exemplo: Echo Erlang – Exemplo: Echo ProgramProgram-module(echo).-export([go/0, loop/0]). go() ->

Pid2 = spawn(echo, loop, []),Pid2 ! {self(), hello},receive

{Pid2, Msg} ->io:format("P1 ~w~n",[Msg])

end,Pid2 ! stop.

loop() ->receive

{From, Msg} -> From ! {self(), Msg},loop();

stop ->true

end.

Pid1 Pid2Pid2! hello

Receive {From,MSG} -> stop ->

Pid1! hello

Proposta de projeto• Extender LF1 para incluir

concorrência• O modelo proposto é baseado em

processos, não em threads– Não há compartilhamento de recursos

• Os processos se comunicam através de mensagens assíncronas

Proposta de projeto• BNF original

– Programa ::= Expressao– Expressao ::= Valor

| ExpUnaria | ExpBinaria | ExpDeclaracao | Id | Aplicacao | IfThenElse

– DeclaracaoFuncional ::= DecVariavel | DecFuncao | DeclaracaoFuncional "," DeclaracaoFuncional

Proposta de projeto• BNF extendida

– Programa ::= Expressao– Expressao ::= Valor

| ExpUnaria | ExpBinaria | ExpDeclaracao | Id | Aplicacao | IfThenElse | EnviaMensagem | RecebeMensagem

– DeclaracaoFuncional ::= DecVariavel | DecFuncao | DecProcesso | DeclaracaoFuncional "," DeclaracaoFuncional

– ListaClausulas ::= “{” ListId “}” “->” ListExp | ListaClausulas “;” ListaClausulas

Proposta de projeto• BNF extendida

– DecProcesso ::= “proc” Id “(” Id ListExp “)”• Associa o identificador do processo criado a

Id – EnviaMensagem ::= Id “!” “{” ListExp “}”

• Retorna true se o processo identificado por Id existir, e false caso contrário

– RecebeMensagem ::= “receive” ListaClausulas “end”• Retorna true quando dados são recebidos

– ListaClausulas ::= “{“ ListId “}” “->” ListExp | ListaClausulas “;” ListaClausulas

Proposta de projeto• O mecanismo de concorrência

proposto dá ao programador a possibilidade de tratar erros

• Exemplo:if pid ! “teste” then

<faz_alguma_coisa>else

<faz_outra>

Proposta de projeto• Assim como em Erlang, a função

self() retorna o identificador do processo que a chama– Isto permite que o processo inicial

possa enviar uma referência para si próprio a outros processos

– Com isso, estes processos podem enviar o resultado de alguma computação de volta a ele