concorrência em lf1 paradigmas de linguagens de programação 20 de junho de 2006 aline timóteo...
TRANSCRIPT
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