Concorrência em LF1 Paradigmas de Linguagens de Programação 20 de junho de 2006 Aline Timóteo Carlos Rodrigues Flávia Falcão Tiago 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 linguagens concorrentes 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 C oncorrê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 z y P1 P2 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 x y z Formas de Implementar C oncorrê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 C oncorrê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
Erlang 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
Erlang 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)
Erlang Concorrência –Processos Pid=spawn(m,f,[Arg1,Arg2]) –Mensagens Send Pid ! Mensagem Receive receive Pattern1 -> ação1; Pattern2 -> ação2; end
Erlang – Exemplo: Echo Program -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. Pid1Pid2 Pid2! 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 else
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