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

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
Linha 25: Linha 25:


==Linguagens para programação concorrente==
==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 contruções podem envolver multi-tarefa, suporte para sistemas distribuídos, troca de mensagens e recursos compartilhados.
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, suporte para sistemas distribuídos, troca de mensagens e recursos compartilhados.


Atualmente, as linguagens mais utilizadas para tais contruçõ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 idsso, 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]] é possivelmente a mais utilizada pela indústria atualmente.
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]] é 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 nos desde a década de 1980.
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 ofrnecem o suporte à concorrência através de bibliotecas, como por exemplo [[Linguagem de programação C|C]] e [[C++]].
Várias outras linguagens oferecem o suporte à concorrência através de bibliotecas, como por exemplo [[Linguagem de programação C|C]] e [[C++]].


[[Categoria:Programação]]
[[Categoria:Programação]]

Revisão das 03h34min de 24 de maio de 2006

Programação concorrente é o paradigma para a construção de programas para a execução concorrente (simultânea) de várias tarefas computacionais interativas, que podem ser implementadas como programas separados ou como um conjunto de processos (threads) criadas por um único programa. Essas tarefas também podem ser executadas por um único processador, vários processadores em um único equipamento ou processadores distibuí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 concorrente incluem Edsger Dijkstra, Per Brinch Hansen, e C. A. R. Hoare.

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:

Comunicação por memória compartilhada
componentes concorrentes comunicam-se ao alterar o conteúdo de áreas de memória compartilhadas. Java e C# são linguagens que utilizam tal modelo. Esse estilo de programação geralmente requer o desenvolvimento de alguns métodos de trava como mutex, semáforo ou monitor para gerenciar a utilização da memória entre as tarefas.
Comunicação por troca de mensagens
componentes concorrentes comunicam-se ao trocar mensagens. Erlang e Occam são linguagens que utilizam tal modelo. A troca de mensagens pode ser lidada 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.

A comunicação por mensagens tende a ser mais simples que a comunicação por memória compartilhada, e é considerada como uma forma mis 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.

Cordenando 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 balanco:

1  bool saque(int quantia) {
2     if( balanco > quantia ) {
3         balanco = balanco - quantia;
4         return true;
5     } else return false;
6  }

Suponha que balanco = 500, e dois processos concorrentes realizam a chamada saque(300) e saque(350) . 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.

Como sistemas concorrentes necessitam a utilização de recursos compartilhaods, 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, suporte para sistemas distribuídos, troca de mensagens e recursos compartilhados.

Atualmente, as linguagens mais utilizadas para tais construções são Java e 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 é 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 e 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 bibliotecas, como por exemplo C e C++.