Programação concorrente: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Leonardo.stabile (discussão | contribs)
*txt
Linha 1:
'''Programação concorrente''' é oum [[paradigma de programação]] para a construção de [[programas parade acomputador|programas de computador]] que fazem uso da execução concorrente (simultânea) de várias tarefas computacionais interativas, que podem ser implementadas como programas separados ou como um conjunto de ''[[thread (ciência da computação)|threadthreads]]'' criadas por um único programa. Essas tarefas também podem ser executadas por um único [[processador]], [[Multicore|vários processadores em um único equipamento]] ou [[computação distribuída|processadores distribuídos por uma rede]]. Programação concorrente é relacionada com [[programação paralela]], mas foca mais na interação entre as tarefas. A interação e a comunicação correta entre as diferentes tarefas, além da coordenação do acesso concorrente aos recurso computacionais são as principais questões discutidas durante o desenvolvimento de sistemas concorrentes. Pioneiros na área de programação concorrentepesquisa incluem [[Edsger Dijkstra]], [[Per Brinch Hansen]], e [[C. A. R. Hoare]].
 
Vantagens do paradigma incluem o aumento de desempenho, pois aumenta-se a quantidade de tarefas sendo executadas em determinado período de tempo, e a possibilidade de uma melhor modelagem de programas, pois determinados problemas computacionais são concorrentes por natureza.
 
==Interação e comunicação concorrente==
Em alguns sistemas computacionais concorrentes, a comunicação entre os componentes é escondida do programador, enquanto em outros a comunicação deve ser lidada explicitamente. A comunicação explícita pode ser dividida em duas classes: por memória compartilhada ou por troca de mensagens.
 
=== Comunicação por memória compartilhada ===
Componentes concorrentes comunicam-se ao alterar o conteúdo de áreas de memória compartilhadas., [[Java (linguagem de programação)|Java]] e [[C sharp|C#]] são linguagenso que utilizam tal modelo. Esse estilo de programação geralmente requer o desenvolvimento de alguns métodos de trava como [[mutexexclusão mútua]], [[Semáforo (computação)|semáforo]] ou [[monitor (concorrência)|monitor]] para gerenciar a utilização da memória entre as tarefas.
 
=== Comunicação por troca de mensagens ===
Componentes concorrentes comunicam-se ao trocar [[mensagem|mensagens.]], Erlangcuja e Occam são linguagens que utilizam tal modelo. A troca de mensagensleitura pode ser lidadafeita [[Comunicação assíncrona|assincronamente]] (também denominada como "enviar e rezar", apesar da prática padrão ser reenviar mensagens que não são sinalizadas como recebidas) ou pelo método ''rendezvous'', no qual o emissor é bloqueado até que a mensagem seja recebida ([[comunicação síncrona]]).
 
A comunicação por mensagens tende a ser mais simples que a comunicação por memória compartilhada, e é considerada como uma forma mais robusta de programação concorrente. Um ampla variedade de teorias matemáticas estão disponíveis para o entendimento e análise de sistemas de comunicação por envio de mensagem, incluindo o [[modelo de Ator]].
 
==Coordenando o acesso aos recursos==
Um dos assuntos de maior discussão em programação concorrente é como prevenir que tarefas concorrentes interfiram umas nas outras. Por exemplo, considerando o seguinte algoritmo para realizar saques de uma conta representada pelo recurso compartilhado <code>balanco</code>:
 
<pre><nowiki>
<source lang="c" line>
1 bool saque(int quantia) {
2bool ifsaque( balanco >int quantia ) {
{
3 balanco = balanco - quantia;
if( balanco > quantia )
4 return true;
{
5 } else return false;
3 balanco = balanco - quantia;
6 }
4 return true;
</nowiki></pre>
6 }
Suponha que <code>balanco = 500</code>, e dois processos concorrentes realizam a chamada <code>saque(300)</code> e <code>saque(350)</code> . Se em ambas as operações a linha 2 é executada antes da linha 3 do processo concorrente, ambas as operações irão deduzir que o balanço é maior que a quantia a ser sacada, e a execução irá proceder subtraido os valores a serem sacados em ambos os processos. Apesar disso, como ambos os processos realizam o saque, o balanço acaba ficando com valor negativo, um resultado que não deveria acontecer. Esses tipos de probemas com recursos compartilhados requerem o uso de controles concorrentes, ou algoritmos não bloqueantes.
else
{
5 } else return false;
}
}
</source>
 
Suponha que <code>balanco = 500</code>, e dois processos concorrentes realizam a chamada <code>saque(300)</code> e <code>saque(350)</code>, respectivamente. Se em ambas as operações a linha 23 é executada antes da linha 35 do processo concorrente, ambas as operações irão deduzir que o balanço é maior que a quantia a ser sacada, e a execução irá proceder subtraidosubtraindo os valores a serem sacados em ambos os processos. Apesar disso, como ambos os processos realizam o saque, o balanço acaba ficando com valor negativo, um resultado que não deveria acontecer. EssesEsse tipostipo de probemasproblema com recursos compartilhados requeremrequer o uso de controles concorrentesde concorrência, ou algoritmos não bloqueantes.
 
Como sistemas concorrentes necessitam a utilização de recursos compartilhados, a programação concorrente geralmente requer o uso de algum método de árbitro, um elemento neutro, para coordenar o acesso a tais recursos. Isso introduz a possibilidade do aparecimento de problemas com decisões não determinísticas, apesar de que o desenvolvimento cuidadoso de árbitros pode reduzir a probabilidade de tais situações aparecerem.
 
==Linguagens para programação concorrente==
As '''linguagens de programação concorrente''' são linguagens de programação que usam construções para a concorrência. tais construções podem envolver multi-tarefa[[multitarefa]], suporte para sistemas distribuídos, troca de mensagens e recursos compartilhados.
 
Atualmente, as linguagens mais utilizadas para tais construções são [[Java (linguagem de programação)|Java]] e [[C sharp|C#]]. Ambas utilizam o modelo de memória compartilhada, com o bloqueio sendo fornecido por monitores. Apesar disso, o modelo de troca de mensagens pode ser implementado sobre o modelo de memória compartilhada. Entre linguagens que utilizam o modelo de troca de mensagens, [[Erlang (linguagem de programação)|Erlang]] é possivelmente a mais utilizada pela indústria atualmente.
 
Várias linguagens de programação concorrente foram desenvolvidas como objeto de pesquisa, como por exemplo [[Pict]]. Apesar disso, linguagens como [[Erlang]], [[Limbo (linguagem de programação)|Limbo]] e [[Linguagem de programação Occam|Occam]] tiveram uso industrial em vários momentos desde a [[década de 1980]].
 
Várias outras linguagens oferecem o suporte à concorrência através de [[Biblioteca (computação)|bibliotecas]], como por exemplo [[Linguagem de programação C|C]] e [[C++]].
 
[[Categoria:Computação concorrente| ]]