Você está na página 1de 28

LABORATÓRIO DE

PROGRAMAÇÃO AVANÇADA
Introdução à Concorrência (RESUMO)
Cenário das estradas

¨ Há vários carros que precisam se


movimentar
¨ Os carros podem se movimentar
¤ uma única estrada com uma faixa
única
¤ uma única estrada com várias
faixas
¤ Várias estradas separadas que
podem, ou não, ter mais de uma
faixa
Cenário computacional
¨ Há várias tarefas que
precisam ser executadas
¨ Cada tarefa pode executar
nos seguintes cenários
¤ uma de cada vez em um
único processador na
mesma máquina física
¤ em paralelo em vários
processadores na mesma
máquina física
¤ executar em várias
máquinas distintas
Programação sequencial

¨ Estrada de faixa única


¨ Um programa pode ser
subdividido em atividades
mais simples (subprogramas)
¨ Nos programas sequenciais,
essas atividades são
executadas uma após outra
em uma ordem fixa
Programação concorrente (e paralela)

¨ Nos programas
concorrentes, as atividades
computacionais se
sobrepõem (intercalam) no
tempo (estrada com várias
faixas)
¨ As execuções das atividades
podem ser simultâneas, i.e.,
paralelismo (várias
estradas)
Intercalamento
¨ A execução concorrente
não requer múltiplos
processadores
¨ Intercalar as instruções
de vários processos em
um único processador
pode ser usado para
simular a concorrência,
dando a ilusão de
execução paralela
Intercalamento

¨ Se houver múltiplos
processadores, as
instruções de um
programa concorrente
podem realmente ser
executadas em
paralelo (limitado a
quantidade de
processadores)
Sequencial, concorrente e paralelo
¨ Um programa sequencial possui uma única thread
¨ Um programa concorrente contém duas ou mais
threads
¨ Cada thread é um programa sequencial, ou seja,
uma sequência de instruções que são executadas
uma após a outra
¨ Todo sistema paralelo é concorrente, mas nem todo
sistema concorrente é paralelo
Concorrência e distribuição
¨ Várias estradas (e talvez
com várias vias cada)
¨ Máquina única (um ou
mais núcleos): interações
de memória
compartilhada
¨ Múltiplas máquinas (onde
cada pode ser um ou
mais processadores):
interações de rede de
computadores
Problema concorrente (1)

Quantas threads?
• 9 threads (uma para
cada valor de C);
• 3 threads (uma para
cada linha de C); ou
• 3 threads (uma para
cada coluna de C)

Obs: aqui não há


necessidade de
sincronizar as threads
Sincronização entre processos

¨ Tem a ver com as regras


da estrada
¨ Por exemplo, a interação
entre um processo
produtor e um processo
consumidor é geralmente
implementada usando um
buffer na memória
compartilhada
¨ O produtor escreve no
buffer; o consumidor lê do
buffer
Sincronização entre processos
¨ Duas formas de sincronização de processos (regras):
¤ A exclusão mútua garante que o produtor e o
consumidor não acessam o buffer ao mesmo tempo (um
escrevendo e outro lendo)
¤ A sincronização de condições garante que o
consumidor só pode consumir após ser sinalizado que o
produtor já produziu; e o produtor só pode produzir
após ser sinalizado que o consumidor já consumiu
Problema concorrente (2)

Depósito e retirada na mesma


conta bancária

Quantas threads? Depende de


quantos recursos se tem
disponível

Há a necessidade de
sincronismo?
Sim. Poderia ser a exclusão
mútua, garantindo que o acesso
à conta fosse exclusivo
Problema concorrente (3)

Crivo de Erastótenes

Quantas threads? Depende


de quantos recursos se tem
disponível

Há a necessidade de
sincronismo?
Sim. Poderia ser a
sincronização de condição,
que avisaria quando tivesse
“eliminado” o primero
múltiplo
Comunicação entre processos

¨ Mundo real: é a
comunicação visando a
direção defensiva
¨ As threads/processos
trabalham juntos e se
comunicam com os outros
¨ A comunicação pode ser
de duas formas:
variáveis
compartilhadas ou troca
de mensagens
Comunicação entre processos
¨ Quando variáveis compartilhadas são usadas, um
processo armazena um valor em uma variável que é
lida por outro processo
¨ Quando a troca de mensagens é usada, um processo
envia uma mensagem, por algum canal de
comunicação, que é recebida por outro processo
Processos
¨ Programa é o código; processo é
a execução; um processo é
basicamente um programa em
execução
¨ Um processo inclui: espaço de
endereçamento (memória
“virtual” exclusiva - código e
dados) + registradores + pilha
de execução
¨ O início e término do processo
(controle) pode ser pelo usuário,
por um aplicativo ou pelo sistema
operacional
Threads
¨ Um processo pesado (heavyweight)
pode ter uma ou mais threads
(multithread)
¨ Thread é um processo leve. É a
unidade básica de uso da CPU
¨ É leve porque só tem registradores
e pilha; o código, dados globais e
demais recursos, são
compartilhados com o processo
¨ O compartilhamento faz com que
o overhead das threads seja
mínimo
Vantagens de um processo com
múltiplas threads
¨ Threads são processos "leves",
isto é, a troca de contexto é
mais rápida, além do tempo
de criação ser bem menor
¨ De forma geral, diminui o
tempo de resposta do
processo como um todo
¨ Maior facilidade para
mesclar threads I/O-bound
com threads CPU-bound
¨ Podem usar mais
eficientemente as
arquiteturas multicores
Principais usos de um processo com
múltiplas threads
¨ Não esqueça que as várias threads de um processo
trabalham em conjunto
¨ Se você tem uma aplicação que tem partes CPU
bound e outras partes são I/O bound, você ganha
sempre!
¨ Porque se uma thread está bloqueada (I/O bound)
a outra pode executar (CPU bound)
¨ Por exemplo, uma aplicação que acessa dispositivos
secundários lentos (disco local ou remoto), e não
quer perder o processador para outro processo,
pode definir outras threads que sejam CPU bound
Vantagens da programação multicore
¨ Em um sistema com um
único núcleo,
concorrência significa que
a execução das threads
vai ser intercalada ao
longo do tempo
¨ Em um sistema com
múltiplos núcleos,
concorrência significa que
algumas threads vão
executar em paralelo pois
o sistema poderá atribuir
um núcleo diferente para
cada thread
Condições de corrida

Condições de corrida são


situações onde duas ou mais
threads estão acessando
dados compartilhados (ao
mesmo tempo), e o resultado
final do processamento
depende de quem executa e
quando executa
Nem sempre é fácil encontrar
esse tipo de erro
Como evitar condições de corrida?
¨ Encontrar alguma forma
de proibir que mais de
um processo acesse o
dado compartilhado ao
mesmo tempo
¨ Duas técnicas principais:
exclusão mútua e
sincronização de
condições
Imprevisibilidade
¨ Um exemplo simples (considere x compartilhado):
thread1: x := x + 1

thread2: x := x - 1

¨ Temos duas seções críticas, uma em cada thread e,


como não foi tomado nenhum cuidado, geramos uma
condição de corrida
¨ Qual o resultado final?
Imprevisibilidade
¨ Existem 4 operações atômicas em x:
¤ Thread 1 lê x (R1), escreve em x (W1)
¤ Thread 2 lê x (R2), escreve em x (W2)
¨ Únicas duas regras: R1 deve ocorrer antes de W1 e R2
antes de W2
¨ Assumindo que x=0, esse conjunto de operações pode
ser de 6 formas (com três resultados diferentes):
¤ R1+W1+R2+W2 = 0
¤ R1+R2+W1+W2 = -1
¤ R1+R2+W2+W1 = 1
¤ R2+R1+W1+W2 = -1
¤ R2+R1+W2+W1 = 1
¤ R2+W2+R1+W1 = 0
Região crítica

Região crítica é a parte do código do programa


onde é feito o acesso à memória (ou qualquer outro
recurso) compartilhada, ou seja, é a parte do
programa cujo processamento pode levar às
condições de corrida
THERAC-25 (THErapeutic RAdiation
Computer)
¨ Uma máquina de
radioterapia controlada
por computador que
aplicava diversas doses de
radiação nos pacientes
¨ Erros de programação
https://hackaday.com/2015/10/26/kille
concorrente* contribuíram d-by-a-machine-the-therac-25/

com acidentes causando * Condições de corrida entre diferentes


atividades concorrentes no programa de
mortes e sérios ferimentos controle resultaram em saídas de controle
errados (overdose de radiação - seis
por overdose de radiação acidentes graves)
* Problemas difíceis de serem encontrados
Mars Rover (sonda de Marte)

¨ Problemas com a
interação entre tarefas
concorrentes causavam
reinicialização
periódica do software
reduzindo a
disponibilidade para a
exploração

Você também pode gostar