08.02.2015 Views

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

notas de aula - Jerônimo C. Pellegrini<br />

Há três mecanismos importantes para o suporte a programação concorrente do ponto<br />

de vista do programador:<br />

• Criação de threads ou processos: toda linguagem ou framework <strong>com</strong> suporte a programação<br />

concorrente oferece algum meio para criação de threads e processos;<br />

• Comunicação: a criação de múltiplos processos e threads não é interessante se não<br />

puder haver alguma forma de <strong>com</strong>unicação entre eles. Isso normalmente é feito por<br />

regiões <strong>com</strong>partilhadas de memória ou por troca de mensagens;<br />

• Sincronização: embora não seja possível interferir diretamente no <strong>com</strong>portamento<br />

do escalonador, deve haver algum método para restringir, de maneira limitada, sua<br />

ordem de execução.<br />

Linguagens e bibliotecas que suportam programação concorrente diferem em <strong>com</strong>o<br />

implementam estes mecanismos. É <strong>com</strong>um classificar linguagens e frameworks para programação<br />

concorrente de acordo <strong>com</strong> seus mecanismos de <strong>com</strong>unicação e sincronização<br />

em duas grandes classes: a das linguagens <strong>com</strong> memória <strong>com</strong>partilhada e as que suportam<br />

passagem de mensagens.<br />

As linguagens <strong>com</strong> memória <strong>com</strong>partilhada oferecem <strong>com</strong>o mecanismo de <strong>com</strong>unicação<br />

o <strong>com</strong>partilhamento de variáveis. O uso de uma mesma variável por mais de uma<br />

thread gera a necessidade de mecanismos explícitos de sincronização que impeçam o<br />

acesso e modificação desordenados daquela variável.<br />

As linguagens que suportam passagem de mensagem oferecem um só mecanismo<br />

para <strong>com</strong>unicação e sincronização: diferentes threads trocam mensagens, sem <strong>com</strong>partilhar<br />

variáveis.<br />

Para ilustrar a diferença entre as duas abordagens, pode-se imaginar um contador<br />

que diferentes threads devem atualizar (um contador de acessos a algum recurso, por<br />

exemplo). Usando memória <strong>com</strong>partilhada, cada thread acessa diretamente o contador e<br />

o atualiza; as threads devem usar algum mecanismo de sincronização que garanta que o<br />

acesso será feito de forma a preservar a consistência dos dados. Já usando mensagens, o<br />

contador não é <strong>com</strong>partilhado – ele é acessado diretamente por apenas uma thread, e a<br />

sua atualização é feita através de troca de mensagens entre as threads.<br />

Versão Preliminar<br />

226<br />

[ 27 de outubro de 2010 at 15:47 ]

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!