conceitos de programação paralela - 2 mo801/mc972

27
Conceitos de Programação Paralela - 2 MO801/MC972

Upload: internet

Post on 17-Apr-2015

103 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Conceitos de Programação Paralela - 2 MO801/MC972

Conceitos de Programação Paralela - 2

MO801/MC972

Page 2: Conceitos de Programação Paralela - 2 MO801/MC972

Visão Geral

• Existem várias bibliotecas disponíveis para programação– Mesmos conceitos básicos– Implementações diferentes

• Exemplo:– Windows Threads– POSIX Threads (pthread))

Page 3: Conceitos de Programação Paralela - 2 MO801/MC972

Sincronização

• É um mecanismo para impor restrições na ordem de execução das threads– Evita que um

comportamento não desejado aconteça

• Pouco usada diretamente pelos programadores

Entrada

Saída

Shared data or critical section

Page 4: Conceitos de Programação Paralela - 2 MO801/MC972

Região Crítica

• É uma região do código onde existem variáveis das quais dependem múltiplas threads

• Somente uma thread pode estar numa região crítica por vez

• Pode ocasionar contenção se for uma grande região de código com grande concorrência

Page 5: Conceitos de Programação Paralela - 2 MO801/MC972

Dois casos comuns

• Mutual exclusion– Uma thread bloqueia uma região e todas as

outras ficam aguardando sua vez de entrar na região

• Condition synchronization– A thread é bloqueada aguardando por uma

determinada condição

Page 6: Conceitos de Programação Paralela - 2 MO801/MC972

Exemplo Genérico

<Entrada na região crítica, faz com que outras threads fiquem aguardando>…Região crítica…

<Saída da região crítica, permite que outras threads entrem>

Page 7: Conceitos de Programação Paralela - 2 MO801/MC972

Deadlock

• Ocorre sempre que uma thread está esperando um lock de outra thread que nunca ficará disponível

• Pode ser de 3 tipos diferentes– Self-deadlock– Recursive deadlock– Lock-ordering deadlock

Page 8: Conceitos de Programação Paralela - 2 MO801/MC972

Self deadlock

• A própria thread possui um lock que ela deseja, mas executa uma operação de bloqueio aguardando o lock

• Não deveria ocasionar problema– O programador pode testar se já possui o

lock antes– O sistema operacional pode saber se a

thread já possui o lock

Page 9: Conceitos de Programação Paralela - 2 MO801/MC972

Recursive deadlock

• A thread i possui um lock e, antes de liberá-lo, precisa de algo da thread j, que por sua vez tenta obter o mesmo lock

• Esse problema pode escalar para dentro de bibliotecas

Page 10: Conceitos de Programação Paralela - 2 MO801/MC972

Lock-ordering deadlock

• Ocorre quando, por exemplo, a thread A possui o lock i e quer o lock j e a thread B possui o lock j e quer o lock i

• É o tipo mais comum de deadlock

• Pode ser corrigido sempre solicitando os locks na mesma ordem

Page 11: Conceitos de Programação Paralela - 2 MO801/MC972

Primitivas de sincronização

• São implementadas sobre operações atômicas fornecidas pelo sistema de memória (memory fence, ou memory barrier)– Test and set– Read and increment– Compare and swap

• Três tipos de primitivas– Semaphores– Locks– Condition variables

Page 12: Conceitos de Programação Paralela - 2 MO801/MC972

Semaphores

• Permite o acesso a uma ou mais threads numa região de código

• Utiliza duas operações: P(s) e V(s)

• O valor armazenado indica– Quantas threads ainda podem entrar na

região, se positivo– Quantas threads estão aguardando para

entrar na região, se negativo

Page 13: Conceitos de Programação Paralela - 2 MO801/MC972

Pseudo-código

P(s) {atomic { sem=sem-1; temp=sem }

if (temp < 0){ Thread bloqueada }

}V(s) {atomic { sem=sem+1; temp=sem }

if (temp <= 0){ Libera uma thread bloqueada

}}

Page 14: Conceitos de Programação Paralela - 2 MO801/MC972

Tipos de semáforos

• Do ponto de vista da usabilidade, existem dois tipos de semáforos– Forte (strong)

• A ordem de solicitação é garantida como ordem de obtenção

– Fraco (weak)• A ordem de solicitação não é garantida como

ordem de obtenção

Page 15: Conceitos de Programação Paralela - 2 MO801/MC972

Exemplo

semaphore ss.sem = 1beginT: <região não crítica>

P(s) <região crítica> V(s) Goto T

end

Page 16: Conceitos de Programação Paralela - 2 MO801/MC972

Locks

• Similares aos semáforos, só que com apenas uma thread na região crítica

• Duas operações– aquire()

• Aguarda atomicamente pela disponibilidade de lock e ativa o lock

– release()• Atomicamente desativa o lock

• A granularidade influencia fortemente no nível de contenção do sistema

Page 17: Conceitos de Programação Paralela - 2 MO801/MC972

Exemplo

{define all necessary locks}<Start multithreading blocks>…<critical sectionn start><aquire lock L>… operate on shared memory protected by lock L …

<release lock L><critical section end>…<End multithreading blocks>

Page 18: Conceitos de Programação Paralela - 2 MO801/MC972

Tipos de locks

• Vários tipos de locks podem estar disponíveis nas APIs de programação

• Evite utilizar mais de um tipo de lock no mesmo programa– Muito cuidado com bibliotecas

• Mutexes, Recursive Locks, Read-Write Locks, Spin Locks

Page 19: Conceitos de Programação Paralela - 2 MO801/MC972

Mutexes

• É o lock mais simples– Uma chamada a aquire ativa e uma chamada

a release desativa o lock

• Algumas implementações podem utilizar timers para liberar o lock– Utilize try-finally para evitar deadlock

Page 20: Conceitos de Programação Paralela - 2 MO801/MC972

Recursive locks

• Podem ser obtidos várias vezes pela mesma thread e precisam ser liberados o mesmo número de vezes– Nenhuma outra thread pode obter o lock

simultaneamente

• Muito utilizado em código recursivo• Locks recursivos são mais lentos de

implementar que os não recursivos em geral

Page 21: Conceitos de Programação Paralela - 2 MO801/MC972

Read-Write locks

• Também chamados de shared-exclusive ou multiple-read/single-write locks

• Permitem que vários locks de leitura sejam obtidos mas limitam o acesso à escrita a apenas uma thread (sozinha)

• Útil quando muitas threads tentam acessar os mesmos dados mas existem poucas escritas

Page 22: Conceitos de Programação Paralela - 2 MO801/MC972

Spin locks

• Não bloqueiam a thread, que deve ficar tentando o lock sucessivamente

• Permite evitar a troca de contexto quando ela é mais cara que a tarefa da região crítica

• Cuidado com starvation

Page 23: Conceitos de Programação Paralela - 2 MO801/MC972

Condition variables

• Similares aos semáforos, mas sem uma variável armazenada

• Três operações básicas– wait

• Atomicamente libera o lock e aguarda, retorna quando o lock tiver sido obtido novamente

– signal• Permite que uma das threads em wait executem, ao

retornar, o lock estará ativo novamente

– broadcast• Permite que todas as threads aguardando pelo lock

executem, ao retornar, o lock estará ativo novamente

Page 24: Conceitos de Programação Paralela - 2 MO801/MC972

Troca de mensagens

• É um método especial de comunicação que faz transferência de informação ou sinal de um domínio para outro

• Fortemente dependente do domínio

• Três M– Multi-granularity– Multithreading– Multitasking

Page 25: Conceitos de Programação Paralela - 2 MO801/MC972

• Em geral, associadas a processos ao invés de threads– Intra-process

• Entre duas threads do mesmo processo

– Inter-process• Entre threads de processos diferentes

– Process-Process• Entre dois processos diferentes

Page 26: Conceitos de Programação Paralela - 2 MO801/MC972

Mecanismos de controle de fluxo

• São utilizados como sincronização em sistemas multiprocessados

• Fence– Geralmente associado à memória– Todas as operações de memória anteriores são

completadas e as posteriores aguardam que a operação atual termine

• Barrier– Associado a threads colaborativas– Um ponto do código é definido como uma barreira

quando todas as threads do grupo só passam desse ponto juntas

Page 27: Conceitos de Programação Paralela - 2 MO801/MC972

Questões dependentes de implementação

• Bibliotecas de threads implementam APIs em cima dos recursos fornecidos pelo sistema operacional– Algumas funcionalidades podem variar– Podem existir chamadas aparentemente

idênticas que devem ser executadas em situações diferentes