View
215
Download
0
Category
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
Recommended