SlideShare uma empresa Scribd logo
1 de 4
Disciplina: Sistemas Operacionais
Professor: Arildo Antônio Sônego
Acadêmicos: Fábio Duarte de Souza
Mateus Luiz
Título: Linguagens de Programação Concorrente
Programação Concorrente
Programação concorrente é uma visão que o programador possui sobre a estruturação
e execução de um programa. Por exemplo, em programação orientada a objetos, programadores
podem abstrair um programa como uma coleção de objetos que interagem entre si, enquanto em
programação funcional os programadores abstraem o programa como uma sequência de funções
executadas de modo empilhado.
Para a construção de programas e execução concorrente (simultânea) de várias
tarefas computacionais interativas, que podem ser implementadas como programas separados ou
como um conjunto de thread 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 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 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 mais robusta de programação
concorrente.
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 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 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, 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++.
Linguagem de Programação Limbo
É uma linguagem de programação que foi desenvolvida pela Lucent Technologies Inc.
para a execução de aplicações distribuídas de pouca escalabilidade (aplicações que executam
sobre um número pequeno de nodos).
Limbo é uma linguagem de programação imperativa , que apesar de rodar em cima de
uma máquina virtual, não é considerada orientada a objetos, pois não possui suporte a herança e
nem a definição de classes .
Byte unsigned (8-bits)
int signed (32-bits)
big signed (64-bits)
real long float (64-bits)
list,array
String
channel (para comunicaçao entre processos)
adt (análogo ao struct presente em C)
pick (análogo ao union presente em C)
module
Exemplo de código da Linguagem Limbo:
hello.b)
implement Hello;
include "sys.m"; //biblioteca da linguagem Limbo
sys: Sys;
include "draw.m";
Hello: module
{
init: fn(ctxt: ref Draw->Context, argv: list of string);
};
init(ctxt: ref Draw->Context, argv: list of string)
{
sys = load Sys Sys->PATH;
sys->print("hello, worldn");
}
OCCAM
OCCAM é uma linguagem para aplicações científicas e de engenharia, para processos
de controle industrial e para sistemas embarcados. OCCAM foi originalmente projetado para
transputer (contração entre transistor e computer), uma arquitetura microprocessada, desenvolvida
pelo INMOS, que suporta concorrência e sincronização.
A OCCAM possui características especiais para solução de problemas de
programação concorrente (cf. CARNEIRO, 2001, p.35) e a semântica formal da linguagem auxilia a
transformação e validação dos programas em modelos matemáticos.
Em OCCAM, as partes de um programa são tomadas como processos que executam
suas funções e terminam. Pode-se ter mais de um processo sendo executado concorrentemente e
processos podem trocar mensagens entre si (cf. CARNEIRO, 2001, p.35).
A comunicação é feita através de um construtor especial da linguagem chamado canal.
Um canal é um caminho unidirecional de comunicação entre dois processos concorrentes e é
implementado na prática usando regiões alocadas de memória, se os processos estão residentes
no mesmo transputer, ou por links de comunicação dos transputers, se os processos comunicantes
estiverem em diferentes transputers.
P1 P2
SEQ SEQ
canal1 ! A canal2 ! X
canal2 ? B canal1 ? X
PAR
SEQ
canal3 ? valor1
valor := valor1 + 1
SEQ
canal4 ! valor2
valor2 := valor2 + 1
Linguagem de programação Erlang
Erlang é uma linguagem de programação declarativa, para programação paralela e
distribuída. Seu “jeitão” é muito mais parecido com Prolog ou Lisp que com C ou Java… e não é
orientada a objetos, é “orientado à concorrência”, como costuma-se dizer.
Tanto a AMD quanto a Intel estão criando processadores dual core e quad core para
as massas. A Intel também tem o Hyper-Threading, que trata um núcleo como se fossem dois. Um
processador Intel Xeon quad core com HT comporta-se como se fossem 8 processadores!
Atualmente temos o Pentium Itanium, Pentium Xeon, Pentium 4 HT e AMD Opteron que podem ser
utilizados de forma paralela (ambos os núcleos trabalhando ao mesmo tempo).
O bacana do Erlang é que ela tira o máximo proveito de paralelismo com
processadores. Na teoria, um programa em Erlang é N vezes mais rápido que um programa em
outras linguagens sem paralelismo, sendo N o número de processadores na máquina. Na teoria
pois nem sempre o processador é o gargalo da performance, pode ser leitura/escrita em disco,
acesso à memória, interface com outros dispositivos, sistema operacional, etc.
Código escrito em Erlang
-module(hello_concurrent).
-export([receiver/0. giver/1. start/0]).
receiver() ->
receive
diediedie -> ok;
{ name, Name} -> io:format(“hello, ~s~n”, [Name]), receiver()
end.
giver(ReceiverPid) ->
ReceiverPid = spawn(hello_concurrent, receiver, [] ),
spawn(hello_concurrent, giver, [ReceiverPid]),
start_finished.

Mais conteúdo relacionado

Mais procurados

Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação CJose Augusto Cintra
 
Trabalho de Paradigmas Da Linguagem De Programação - Python
Trabalho de Paradigmas Da Linguagem De Programação - PythonTrabalho de Paradigmas Da Linguagem De Programação - Python
Trabalho de Paradigmas Da Linguagem De Programação - PythonJanderson Campêlo
 
Linguagens de Programação
Linguagens de ProgramaçãoLinguagens de Programação
Linguagens de Programação12anogolega
 
4 introdução ao paradigma funcional
4 introdução ao paradigma funcional4 introdução ao paradigma funcional
4 introdução ao paradigma funcionalPéricles Miranda
 
Python Training #1, ed. 6
Python Training #1, ed. 6Python Training #1, ed. 6
Python Training #1, ed. 6Fabio Spanhol
 
Introduçãso a linguagem c
Introduçãso a linguagem cIntroduçãso a linguagem c
Introduçãso a linguagem csergiocrespo
 
Python - Introdução Básica
Python - Introdução BásicaPython - Introdução Básica
Python - Introdução BásicaChristian Perone
 
Introdução a programação em python d2
Introdução a programação em python d2Introdução a programação em python d2
Introdução a programação em python d2Moises de Paula
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem cJefferson Bessa
 
Linguagem C e Dev-C++ Algumas Explicações
Linguagem C e Dev-C++  Algumas ExplicaçõesLinguagem C e Dev-C++  Algumas Explicações
Linguagem C e Dev-C++ Algumas Explicaçõesnataferraz
 
Computação paralela utilizando OpenMP para aplicações matemáticos
Computação paralela utilizando OpenMP para aplicações matemáticosComputação paralela utilizando OpenMP para aplicações matemáticos
Computação paralela utilizando OpenMP para aplicações matemáticosbshecht
 
Introdução à programação em Android e iOS - Conceitos fundamentais de program...
Introdução à programação em Android e iOS - Conceitos fundamentais de program...Introdução à programação em Android e iOS - Conceitos fundamentais de program...
Introdução à programação em Android e iOS - Conceitos fundamentais de program...Luís Gustavo Martins
 

Mais procurados (20)

Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
15. introducao ao c++
15. introducao ao c++15. introducao ao c++
15. introducao ao c++
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
C sharp lesson1
C sharp lesson1C sharp lesson1
C sharp lesson1
 
Trabalho de Paradigmas Da Linguagem De Programação - Python
Trabalho de Paradigmas Da Linguagem De Programação - PythonTrabalho de Paradigmas Da Linguagem De Programação - Python
Trabalho de Paradigmas Da Linguagem De Programação - Python
 
Linguagens de Programação
Linguagens de ProgramaçãoLinguagens de Programação
Linguagens de Programação
 
4 introdução ao paradigma funcional
4 introdução ao paradigma funcional4 introdução ao paradigma funcional
4 introdução ao paradigma funcional
 
Python Training #1, ed. 6
Python Training #1, ed. 6Python Training #1, ed. 6
Python Training #1, ed. 6
 
Linguagem C clecioamerico
Linguagem C clecioamericoLinguagem C clecioamerico
Linguagem C clecioamerico
 
Introduçãso a linguagem c
Introduçãso a linguagem cIntroduçãso a linguagem c
Introduçãso a linguagem c
 
Python - Introdução Básica
Python - Introdução BásicaPython - Introdução Básica
Python - Introdução Básica
 
Introdução a programação em python d2
Introdução a programação em python d2Introdução a programação em python d2
Introdução a programação em python d2
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Pascal 70
Pascal 70Pascal 70
Pascal 70
 
joane
joane joane
joane
 
Linguagem C e Dev-C++ Algumas Explicações
Linguagem C e Dev-C++  Algumas ExplicaçõesLinguagem C e Dev-C++  Algumas Explicações
Linguagem C e Dev-C++ Algumas Explicações
 
Computação paralela utilizando OpenMP para aplicações matemáticos
Computação paralela utilizando OpenMP para aplicações matemáticosComputação paralela utilizando OpenMP para aplicações matemáticos
Computação paralela utilizando OpenMP para aplicações matemáticos
 
Ud2
Ud2Ud2
Ud2
 
Introdução à programação em Android e iOS - Conceitos fundamentais de program...
Introdução à programação em Android e iOS - Conceitos fundamentais de program...Introdução à programação em Android e iOS - Conceitos fundamentais de program...
Introdução à programação em Android e iOS - Conceitos fundamentais de program...
 

Destaque

Comparativo entre Go e Lua
Comparativo entre Go e LuaComparativo entre Go e Lua
Comparativo entre Go e Luagpolo
 
Concorrência na Linguagem de Programação
Concorrência na Linguagem de ProgramaçãoConcorrência na Linguagem de Programação
Concorrência na Linguagem de ProgramaçãoAlexsandro Pereira
 
Uma visão de mercado das linguagens de programação
Uma visão de mercado das linguagens de programaçãoUma visão de mercado das linguagens de programação
Uma visão de mercado das linguagens de programaçãoRogério Moraes de Carvalho
 
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Rogério Moraes de Carvalho
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - IntroduçãoFabio Moura Pereira
 
Programação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaProgramação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaFabio Moura Pereira
 
Informática para Internet - Informática Aplicada - Aula 07
Informática para Internet - Informática Aplicada - Aula 07Informática para Internet - Informática Aplicada - Aula 07
Informática para Internet - Informática Aplicada - Aula 07Anderson Andrade
 
Sistemas operacionais aula 01
Sistemas operacionais   aula 01Sistemas operacionais   aula 01
Sistemas operacionais aula 01Professor Douglas
 
Fundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplina
Fundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplinaFundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplina
Fundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplinaHelder Lopes
 
Linguagens De ProgramaçãO Clp
Linguagens De ProgramaçãO ClpLinguagens De ProgramaçãO Clp
Linguagens De ProgramaçãO ClpJÚLIO PEIXOTO
 
Tipos de Sistemas Operacionais
Tipos de Sistemas OperacionaisTipos de Sistemas Operacionais
Tipos de Sistemas OperacionaisLuciano Crecente
 

Destaque (16)

Além do java
Além do javaAlém do java
Além do java
 
Comparativo entre Go e Lua
Comparativo entre Go e LuaComparativo entre Go e Lua
Comparativo entre Go e Lua
 
Inglês doenças
Inglês doençasInglês doenças
Inglês doenças
 
Concorrência na Linguagem de Programação
Concorrência na Linguagem de ProgramaçãoConcorrência na Linguagem de Programação
Concorrência na Linguagem de Programação
 
Uma visão de mercado das linguagens de programação
Uma visão de mercado das linguagens de programaçãoUma visão de mercado das linguagens de programação
Uma visão de mercado das linguagens de programação
 
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
 
Programação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaProgramação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e Concorrência
 
Informática para Internet - Informática Aplicada - Aula 07
Informática para Internet - Informática Aplicada - Aula 07Informática para Internet - Informática Aplicada - Aula 07
Informática para Internet - Informática Aplicada - Aula 07
 
Sistemas operacionais aula 01
Sistemas operacionais   aula 01Sistemas operacionais   aula 01
Sistemas operacionais aula 01
 
Sistemas Operacionais
Sistemas OperacionaisSistemas Operacionais
Sistemas Operacionais
 
SO-04 Escalonamento de Processos
SO-04 Escalonamento de ProcessosSO-04 Escalonamento de Processos
SO-04 Escalonamento de Processos
 
Fundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplina
Fundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplinaFundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplina
Fundamentos de Sistemas Operacionais - Aula 1 - Introdução à disciplina
 
Linguagens De ProgramaçãO Clp
Linguagens De ProgramaçãO ClpLinguagens De ProgramaçãO Clp
Linguagens De ProgramaçãO Clp
 
Sistemas Operacionais
Sistemas OperacionaisSistemas Operacionais
Sistemas Operacionais
 
Tipos de Sistemas Operacionais
Tipos de Sistemas OperacionaisTipos de Sistemas Operacionais
Tipos de Sistemas Operacionais
 

Semelhante a Programação concorrente

Programacao_Concorrente slide.pdf
Programacao_Concorrente slide.pdfProgramacao_Concorrente slide.pdf
Programacao_Concorrente slide.pdfMuseiwaLopes
 
Tópicos - Computacao Paralela Programação 3 (Visão geral)
Tópicos - Computacao Paralela Programação 3 (Visão geral)Tópicos - Computacao Paralela Programação 3 (Visão geral)
Tópicos - Computacao Paralela Programação 3 (Visão geral)Luiz Arthur
 
Introdução a Lógica e Conceitos de Programação.ppt
Introdução a Lógica e Conceitos de Programação.pptIntrodução a Lógica e Conceitos de Programação.ppt
Introdução a Lógica e Conceitos de Programação.pptBrennoPimenta
 
Apresentação final
Apresentação finalApresentação final
Apresentação finalvalmon
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpPedro Vuvu Alvaro
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpMarcio Chiaveli
 
Tópicos - Computacao Paralela Programação (Visão geral)
Tópicos - Computacao Paralela Programação (Visão geral)Tópicos - Computacao Paralela Programação (Visão geral)
Tópicos - Computacao Paralela Programação (Visão geral)Luiz Arthur
 
Linguágens de programação
Linguágens de programaçãoLinguágens de programação
Linguágens de programaçãoAlbertoVach
 
Lista exercicios algoritmos
Lista exercicios algoritmosLista exercicios algoritmos
Lista exercicios algoritmosslashmelhor
 
Linguagem c wellington telles - aula 01
Linguagem c   wellington telles - aula 01Linguagem c   wellington telles - aula 01
Linguagem c wellington telles - aula 01profwtelles
 
Linguagens de Programação
Linguagens de ProgramaçãoLinguagens de Programação
Linguagens de ProgramaçãoBeDMK
 
Java programação orientada a objetos
Java   programação orientada a objetosJava   programação orientada a objetos
Java programação orientada a objetosPaulo Carvalho
 

Semelhante a Programação concorrente (20)

Curso openmp
Curso openmpCurso openmp
Curso openmp
 
Programacao_Concorrente slide.pdf
Programacao_Concorrente slide.pdfProgramacao_Concorrente slide.pdf
Programacao_Concorrente slide.pdf
 
Tópicos - Computacao Paralela Programação 3 (Visão geral)
Tópicos - Computacao Paralela Programação 3 (Visão geral)Tópicos - Computacao Paralela Programação 3 (Visão geral)
Tópicos - Computacao Paralela Programação 3 (Visão geral)
 
Introdução a Lógica e Conceitos de Programação.ppt
Introdução a Lógica e Conceitos de Programação.pptIntrodução a Lógica e Conceitos de Programação.ppt
Introdução a Lógica e Conceitos de Programação.ppt
 
Apresentação final
Apresentação finalApresentação final
Apresentação final
 
Apostila de C# & Asp.Net
Apostila de C# & Asp.NetApostila de C# & Asp.Net
Apostila de C# & Asp.Net
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharp
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharp
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Aula 01 algoritmo
Aula 01 algoritmoAula 01 algoritmo
Aula 01 algoritmo
 
Tópicos - Computacao Paralela Programação (Visão geral)
Tópicos - Computacao Paralela Programação (Visão geral)Tópicos - Computacao Paralela Programação (Visão geral)
Tópicos - Computacao Paralela Programação (Visão geral)
 
Linguágens de programação
Linguágens de programaçãoLinguágens de programação
Linguágens de programação
 
Linguagem da programação
Linguagem da programaçãoLinguagem da programação
Linguagem da programação
 
Linguagem da programação
Linguagem da programaçãoLinguagem da programação
Linguagem da programação
 
Lista exercicios algoritmos
Lista exercicios algoritmosLista exercicios algoritmos
Lista exercicios algoritmos
 
Linguagem c wellington telles - aula 01
Linguagem c   wellington telles - aula 01Linguagem c   wellington telles - aula 01
Linguagem c wellington telles - aula 01
 
Linguagens de Programação
Linguagens de ProgramaçãoLinguagens de Programação
Linguagens de Programação
 
Java programação orientada a objetos
Java   programação orientada a objetosJava   programação orientada a objetos
Java programação orientada a objetos
 
Cap02
Cap02Cap02
Cap02
 
Cap02
Cap02Cap02
Cap02
 

Mais de Fabio Duarte

Trabalho - Assistência técnica
Trabalho - Assistência técnicaTrabalho - Assistência técnica
Trabalho - Assistência técnicaFabio Duarte
 
Artigo - Módulo de assistência técnica
Artigo - Módulo de assistência técnicaArtigo - Módulo de assistência técnica
Artigo - Módulo de assistência técnicaFabio Duarte
 
Gestão de risco e auditoria
Gestão de risco e auditoriaGestão de risco e auditoria
Gestão de risco e auditoriaFabio Duarte
 
Gestão de risco e auditoria
Gestão de risco e auditoriaGestão de risco e auditoria
Gestão de risco e auditoriaFabio Duarte
 
Programação concorrente
Programação concorrenteProgramação concorrente
Programação concorrenteFabio Duarte
 

Mais de Fabio Duarte (6)

Trabalho - Assistência técnica
Trabalho - Assistência técnicaTrabalho - Assistência técnica
Trabalho - Assistência técnica
 
Artigo - Módulo de assistência técnica
Artigo - Módulo de assistência técnicaArtigo - Módulo de assistência técnica
Artigo - Módulo de assistência técnica
 
Gestão de risco e auditoria
Gestão de risco e auditoriaGestão de risco e auditoria
Gestão de risco e auditoria
 
Gestão de risco e auditoria
Gestão de risco e auditoriaGestão de risco e auditoria
Gestão de risco e auditoria
 
Programação concorrente
Programação concorrenteProgramação concorrente
Programação concorrente
 
O kernel do linux
O kernel do linuxO kernel do linux
O kernel do linux
 

Programação concorrente

  • 1. Disciplina: Sistemas Operacionais Professor: Arildo Antônio Sônego Acadêmicos: Fábio Duarte de Souza Mateus Luiz Título: Linguagens de Programação Concorrente Programação Concorrente Programação concorrente é uma visão que o programador possui sobre a estruturação e execução de um programa. Por exemplo, em programação orientada a objetos, programadores podem abstrair um programa como uma coleção de objetos que interagem entre si, enquanto em programação funcional os programadores abstraem o programa como uma sequência de funções executadas de modo empilhado. Para a construção de programas e execução concorrente (simultânea) de várias tarefas computacionais interativas, que podem ser implementadas como programas separados ou como um conjunto de thread 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 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 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 mais robusta de programação concorrente. Coordenando o acesso aos recursos
  • 2. 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 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, 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++. Linguagem de Programação Limbo É uma linguagem de programação que foi desenvolvida pela Lucent Technologies Inc. para a execução de aplicações distribuídas de pouca escalabilidade (aplicações que executam sobre um número pequeno de nodos). Limbo é uma linguagem de programação imperativa , que apesar de rodar em cima de uma máquina virtual, não é considerada orientada a objetos, pois não possui suporte a herança e nem a definição de classes . Byte unsigned (8-bits)
  • 3. int signed (32-bits) big signed (64-bits) real long float (64-bits) list,array String channel (para comunicaçao entre processos) adt (análogo ao struct presente em C) pick (análogo ao union presente em C) module Exemplo de código da Linguagem Limbo: hello.b) implement Hello; include "sys.m"; //biblioteca da linguagem Limbo sys: Sys; include "draw.m"; Hello: module { init: fn(ctxt: ref Draw->Context, argv: list of string); }; init(ctxt: ref Draw->Context, argv: list of string) { sys = load Sys Sys->PATH; sys->print("hello, worldn"); } OCCAM OCCAM é uma linguagem para aplicações científicas e de engenharia, para processos de controle industrial e para sistemas embarcados. OCCAM foi originalmente projetado para transputer (contração entre transistor e computer), uma arquitetura microprocessada, desenvolvida pelo INMOS, que suporta concorrência e sincronização. A OCCAM possui características especiais para solução de problemas de programação concorrente (cf. CARNEIRO, 2001, p.35) e a semântica formal da linguagem auxilia a transformação e validação dos programas em modelos matemáticos. Em OCCAM, as partes de um programa são tomadas como processos que executam suas funções e terminam. Pode-se ter mais de um processo sendo executado concorrentemente e processos podem trocar mensagens entre si (cf. CARNEIRO, 2001, p.35). A comunicação é feita através de um construtor especial da linguagem chamado canal. Um canal é um caminho unidirecional de comunicação entre dois processos concorrentes e é implementado na prática usando regiões alocadas de memória, se os processos estão residentes no mesmo transputer, ou por links de comunicação dos transputers, se os processos comunicantes estiverem em diferentes transputers. P1 P2 SEQ SEQ canal1 ! A canal2 ! X canal2 ? B canal1 ? X
  • 4. PAR SEQ canal3 ? valor1 valor := valor1 + 1 SEQ canal4 ! valor2 valor2 := valor2 + 1 Linguagem de programação Erlang Erlang é uma linguagem de programação declarativa, para programação paralela e distribuída. Seu “jeitão” é muito mais parecido com Prolog ou Lisp que com C ou Java… e não é orientada a objetos, é “orientado à concorrência”, como costuma-se dizer. Tanto a AMD quanto a Intel estão criando processadores dual core e quad core para as massas. A Intel também tem o Hyper-Threading, que trata um núcleo como se fossem dois. Um processador Intel Xeon quad core com HT comporta-se como se fossem 8 processadores! Atualmente temos o Pentium Itanium, Pentium Xeon, Pentium 4 HT e AMD Opteron que podem ser utilizados de forma paralela (ambos os núcleos trabalhando ao mesmo tempo). O bacana do Erlang é que ela tira o máximo proveito de paralelismo com processadores. Na teoria, um programa em Erlang é N vezes mais rápido que um programa em outras linguagens sem paralelismo, sendo N o número de processadores na máquina. Na teoria pois nem sempre o processador é o gargalo da performance, pode ser leitura/escrita em disco, acesso à memória, interface com outros dispositivos, sistema operacional, etc. Código escrito em Erlang -module(hello_concurrent). -export([receiver/0. giver/1. start/0]). receiver() -> receive diediedie -> ok; { name, Name} -> io:format(“hello, ~s~n”, [Name]), receiver() end. giver(ReceiverPid) -> ReceiverPid = spawn(hello_concurrent, receiver, [] ), spawn(hello_concurrent, giver, [ReceiverPid]), start_finished.