Documente Academic
Documente Profesional
Documente Cultură
JAVAProgParSD/0030-ProgParalelaDistribuida.ppt
Sumrio
1. Introduo
a.
b.
c.
d.
e.
f.
g.
2. Problemas de concorrncia
a. Race condition
b. Vivacidade (deadlock, livelock, starvation)
c. Solues (mutex, semforos, monitor)
REFERNCIAS BIBLIOGRFICAS
(Coulouris et al., 2003) George Coulouris, Jean Dollimore, Tim Kindberg.
Distributed Systems - Concepts and Design, Addison Wesley Publ.
Comp., 3a edio, 2003.
(Tanenbaum & Steen, 2002) Andrew S. Tanenbaum, Maarten van Steen.
Distributed Systems, Prentice-Hall International, 2002.
(Garg, 2004) Vijay K. Garg. Concurrent and Distributed Computing in
Java, Wiley Inter-Science, 2004, 309p.
Concurrent programming in Java : design principles and patterns - 2nd
ed / c2000 - Livros - Acervo 225079
LEA, Douglas. Concurrent programming in Java: design principles
and patterns. 2nd ed. Reading: Addison-Wesley, c2000. 411 p.
(Java series) ISBN 0201310090 Nmero de Chamada: 005.133 L433c
2. ed.
3
Sumrio
1a
Definio de sistemas paralelos e distribudos
Sistema Paralelo
Mltiplos processadores conectados por uma memria compartilhada
Memria
Compartilhada
barramento
CPU
CPU
CPU
CPU
MEM
LOCAL
MEM
LOCAL
MEM
LOCAL
MEM
LOCAL
Sistema Distribudo
Mltiplos processadores conectados por uma rede de comunicao
Troca de mensagens
Rede de
Comunicao
Necessidades
Sistemas paralelos e distribudos
Necessitam de ferramentas e tcnicas
Distintas das utilizadas em software sequencial
Rede de
Comunicao
Memria
Compartilhada
CPU
CPU
CPU
CPU
MEM
LOCAL
MEM
LOCAL
MEM
LOCAL
MEM
LOCAL
Escalabilidade
Modularidade e heterogeneidade
Compartilhamento de dados
Compartilhamento de recursos
Estrutura distribuda por si
Confiabilidade
Baixo custo
10
Rede de
Comunicao
Memria
Compartilhada
CPU
CPU
CPU
CPU
MEM
LOCAL
MEM
LOCAL
MEM
LOCAL
MEM
LOCAL
11
Sumrio
1b
Conceitos: programa, processo e thread
12
programa
execuo
Processo 2
Processo n
13
14
15
PCR
PCR
PCR
Stack
Thread 1
Stack
Thread 2
Stack
Thread 3
Contexto de
execuo de uma
thread
heap
Method area
Compartilhado
pelas threads
16
Exemplos de threads
Threads demos
Links na pgina do curso
http://www.doc.ic.ac.uk/~jnm/concurrency/classes/ThreadDemo/ThreadDemo.html
http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/threads/threads1.html
17
Sumrio
1c
Criao de Processos/Threads
18
UNIX, C++
Criao de processos
Processo pai
programa
pid = fork();
if (pid == 0) {
cout << processo filho;
else
cout << processo pai;
pid = fork();
if (pid == 0) {
cout << processo filho;
else
cout << processo pai;
Processo filho
pid = fork();
if (pid == 0) {
cout << processo filho;
else
cout << processo pai;
19
Implements Runnable
Thread
Runnable
<<realizes>>
MinhaThread
+run():void
MinhaThread
+run():void
20
:Main
new
:MinhaThread
start()
run()
21
:Main
new
:MinhaThread
start()
run()
22
JAVARepositorio\JThreads\JThreadContadoras
Programao Paralela e Distribuda - Fundamentos/UTFPR Prof. Cesar Augusto Tacla
23
24
25
26
Sumrio
1d
Yield, Sleep e Join
27
:Main
new
t1:MinhaThread
new
start()
Incio do run()
t2:MinhaThread
start()
swap
Incio do run()
swap
yield()
yield()
28
29
30
31
t1:MinhaThread
new
start()
t2:MinhaThread
start()
Incio do run()
swap
swap
Incio do run()
sleep(2000)
Timed
waiting
swap
32
Sol. JAVARepositorio\JThreads\JCruzamento-v1
33
34
t1:MinhaThread
new
start()
t2:MinhaThread
start()
Incio do run()
swap
waiting
swap
Incio do run()
fim t1
fim t2
36
37
Sumrio
1e
Prioridade entre threads
38
39
40
41
42
http://msdn.microsoft.com/en-us/library/ms685100(VS.85).aspx
constante inteira
43
44
Responda
Que comandos da linguagem Java voc utilizaria para resolver
cada um dos itens acima?
JAVARepositorio\JThreads\JCarrosCorrida
Programao Paralela e Distribuda - Fundamentos/UTFPR Prof. Cesar Augusto Tacla
45
46
Sumrio
1f
Compartilhamento de memria
47
Compartilhamento de memria
Compartilhamento de memria um subtpico de
comunicao inter-processos (IPC)
48
class AreaMem {
static String compartilhada= Thread.currentThread().getName();;
}
class Escritora extends Thread {
public void run() {
AreaMem.compartilhada = Thread.currentThread().getName();
}
}
public class Main {
public static void main(String[] args) {
Escritora E0 = new Escritora();
Escritora E1 = new Escritora();
E0.start();
E1.start();
System.out.println("Compartilhada = " + AreaMem.compartilhada);
}
}
http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JThreads/JCompartMemStaticSimples/
49
Exerccio
Execute vrias vezes o cdigo do slide anterior
Anote os valores impressos
Qual a explicao?
50
main:Thread
c=main
new
E0:Thread
E1:Thread
start()
start()
print c
run()
run()
c=Thread-0
c=Thread-1
X
X
51
52
Thread-0:Main
Thread-1:Main
start()
start()
swap
run()
0c4
c:=2
0c4
c:=5
swap
5 c 10
c:=6
5 c 10
c:=2
X
O atributo esttico c
compartilhado pelas
threadas
53
Exerccio
Explique porque a seguinte
sequncia de mensagens no
possvel
main:Main
<<create>>
Thread-0:Main
Thread-1:Main
start()
start()
swap
run()
0c4
c:=2
swap
run()
5 c 10
swap
0c4
c:=5
swap
5 c 10
c:=6
5 c 10
c:=2
X
54
Exerccio
Objetivo: entender o
compartilhamento de memria por
atributos estticos
}
public static int op2() {
y = 2;
return 3*x;
}
Se uma thread chama op1 e outra, op2, que resultados podem ser retornados
pelos mtodos op1 e op2?
(Vijay K. Garg, 2004, p. 15)
55
Objeto compartilhado
class Deposito extends Thread {
private Conta c;
public Deposito(Conta c) {
this.c = c;
}
public void run() {
int vlrs[] = {40, 50, 60, 10, 20, 30};
for (int i=0; i <vlrs.length; i++)
c.saldo += vlrs[i];
}
}
56
Exerccio
Faa uma classe Java que faa busca paralela num array
de inteiros. A classe deve implementar o mtodo:
public static int busca(int x, int[] A, int nThreads)
O mtodo cria nThreads
Estas threads devem compartilhar o objeto A.
Cada thread busca pelo inteiro x em uma parte de A, por exemplo,
da posio 0 at a 10, outra da 11 a 20, ...
Se uma das threads encontra x, ento retorna-se o ndice i, tal que
A[i] = x
Caso contrrio, o mtodo retorna -1
Quando uma das threads encontra o nmero x, as outras devem
parar a busca!
sol. JAVARepositorio\JThreads\JBuscaParalela
Programao Paralela e Distribuda - Fundamentos/UTFPR Prof. Cesar Augusto Tacla
57
Sumrio
1g
Mquina de estados de uma thread
58
TIMED WAITING
Object.notify()
Object.notifyAll()
join thread termina
fim do sleep
Obteu lock
new()
NEW
start()
Escolhida pelo
scheduler Thread.yield()
swap do scheduler
RUNNING
Object.wait()
Thread.join()
BLOCKED
RUNNABLE
Object.notify()
Object.notifyAll()
WAITING
TERMINATED
Synchronized(obj)
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html
Programao Paralela e Distribuda - Fundamentos/UTFPR Prof. Cesar Augusto Tacla
59
RUNNING
Thread.yield()
Escolhida pelo scheduler
swap do scheduler
RUNNABLE
60
Sumrio
2
PROBLEMAS DE CONCORRNCIA
61
Sumrio
2a
Problemas de Concorrncia
62
Problemas de concorrncia
Processos compartilham dados
Sincronizar acesso aos dados necessrio
Exemplo
63
A execuo de T0 e T1 intercalada
P0: LD R, x
R=0
P0: INC R
R =1
0
10
10
Varivel x
P1: LD R, x R = 0
P0: ST R, x
Registrador R
P1: INC R
R =1
P1: ST R, x
x =1
10
1
x =1
64
Problemas de concorrncia
x := x + 1 deve ser executada atomicamente
Regio/Seo crtica necessida atomicidade
Para garantir atomicidade, excluso mtua
Processo 2
Processo 1
Transao T2:
crdito de 10% de juros
Situao desejada:
1) Aplica-se o juros
2) credita-se R$ 5,00
Funcionamento das transaes
1)
2)
3)
s:=CC.getSaldo()
Crdito na varivel s
CC.setSaldo(s)
66
TRANSAO T2
Juros de 10%
TRANSAO T1
Creditar R$ 5,00
S:= CC.getSaldo()
S:= S + 5
// R$100
// S = 105
S = CC.getSaldo( ); // R$100
S = S * 1,10;
// R$ 110,00
CC.setSaldo(S);
// R$ 110,00
CC.setSaldo(S) // R$105
67
TRANSAO T1
A.retirar(100)
Aps transferncia
Saldo A = R$ 100,00
Saldo B = R$ 400,00
TOTAL = R$ 500,00
TRANSAO T2
total = A.saldo( ); // R$100
total = total + B.saldo( ); // R$300
Mostrar total = R$ 400,00
B.depositar(100)
68
CONCORRNCIA
Exemplo de leitura suja/atualizao perdida: executar o cdigo
abaixo e observar que o nmero apontado pelo contador central difere
da soma dos contadores locais devido aos problemas de leitura suja e
atualizao perdida.
Cdigos fonte e .jar disponveis em
http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JThreads/JRaceConditionRoletas/
Contador central
160.000.000
Atualizado pelas
duas roletas de
forma concorrente
40.000.000
120.000.000
69
Sumrio
2b
Vivacidade: deadlock, livelock e starvation
70
Vivacidade
VIVACIDADE: um pedido de uma thread para entrar/acessar
uma seo crtica ser atendido mais cedo ou mais tarde
DEADLOCK: uma thread t1 bloqueia a espera de uma seo crtica
ocupada por t2 que, por sua vez, est bloqueada a espera da
seo crtica ocupada por t1 grafo wait-for cclico
STARVATION: quando uma thread solicita entrada numa seo
crtica e nunca atendida (ex. porque as outras tem maior
prioridade)
LIVELOCK: duas threads no conseguem avanar porque uma muda
seu estado em resposta mudana de estado da outra (ex. duas
pessoas no corredor que sempre escolhem o mesmo lado para
desviarem).
71
Exemplo de deadlock
DEADLOCK: filsofos podem bloquear-se.
72
Exemplo de starvation
STARVATION: um dos filsofos nunca come porque o outro
tem maior prioridade.
Prioridade por
ser o mais sbio
73
Exemplo de livelock
LIVELOCK: filsofos podem bloquear-se porque mudam de
estado continuament em funo do outro.
74
Filsofo 1
termina de
comer
F1
F1
pega
decide
2 pauzinhos comer
P2 c/ F1
P1 c/ F21
Pauzinho 1
F1 e F2
pensam
F2
decide
comer
Pauzinho 2
F2
pega
2 pauzinhos
Filsofo 2
termina
de comer
P2 c/ F2
75
76
WAIT
77
Primeiro o p1 depois o p2
P1 c/ F1
P1 c/ F21
Pauzinho 1
Filsofo 2
termina
de comer
Filsofo 1
termina de
comer
P1 e P2
C/ F1
F1
decide
comer
F1 e F2
pensam
F2
decide
comer
P1 E P2
c/ F2
Pauzinho 2
78
p4
f2
f4
p3
p2
f3
79
Sumrio
2c
Solues aos problemas de concorrncia
80
81
MUTEX BUSY-WAIT
BUSY-WAIT: um processo verifica continuamente se pode
entrar na seo crtica desperdiando assim ciclos do
processador.
public class Lock1 implements Lock {
boolean livre = true;
public void requestSC(int i ) {
while (!livre); // busy wait
livre = false;
}
public void releaseSC(int i) {
livre = true;
}
}
JAVARepositorio\JThreads\JExclusaoMutuaLock\src\jexclusaomutualock/Lock1.java
Programao Paralela e Distribuda - Fundamentos/UTFPR Prof. Cesar Augusto Tacla
82
MUTEX BUSY-WAIT
Algoritmo de excluso mtua de Peterson
Trs verses incrementais
1. no garante excluso mtua
2. Pode entrar em deadlock
3. Alternncia estrita
Verso final
Deadlock (livre de impasse)
Starvation (livre de inanio)
Vivacidade
Busy-wait: soluo de Peterson
83
84
SEMFOROS
SEMFORO (Dijkstra): uma primitiva de sincronizao de
acesso seo crtica que soluciona o problema de busywait.
API do sistema operacional (SO)
Disponvel na API do S.O.
Java no oferece semforos
85
SEMFORO BINRIO
Semforo binrio:
Valor inicial: verdadeiro
Fila de processos em wait: vazia
Operaes bsicas
P() wait
V() signal (notify)
86
Semforo binrio
T1:thread
S:SemaforoBinario
T2:thread
true
P( )
false
P( )
Na seo
crtica
V( )
true
false
wait
notify( )
Na seo
crtica
V( )
true
87
SEMFOROS
Semforo contador:
Valor inicial: valor inteiro = nmero de processos permitidos na SC
Operaes bsicas
P() wait decrementa um contador
V() signal (notify) incrementa contador
Ver cdigo
88
Semforo contador
T1:thread
S:SemaforoContador
T2:thread
T3:thread
2
P( )
1
P( )
0
Na seo
crtica
P( )
V( )
1
wait
notify( )
V( )
1
H dois recursos, neste caso o
semforo inicializado com 2
89
PRODUTOR-CONSUMIDOR
Problema do Produtor-Consumidor
Soluo utilizando semforos
K=5
PRODUTOR
CONSUMIDOR
BUFFER COMPARTILHADO
90
PRODUTOR-CONSUMIDOR
PRODUTOR-CONSUMIDOR Soluo utilizando semforos
entrada
...
sada
TAM -1
91
PRODUTOR-CONSUMIDOR
Problemas
Excluso mtua no acesso ao buffer
(ou o produtor ou o consumidor)
Consumidor no deve buscar itens quando o buffer est vazio
Produtor no pode produzir se buffer estiver cheio
SINCRONIZAO CONDICIONAL: Um processo aguarda que uma
condio se torne verdadeira antes de continuar suas operaes.
Exemplos:
Consumidor aguarda a existncia de um item
Produtor aguarda espao no buffer para produzir
92
PRODUTOR-CONSUMIDOR
Exerccio (soluo utilizando semforos)
Baixe o cdigo fonte
Faa o diagrama de sequncia para o cenrio seguinte:
O produtor produz um item (double)
O consumidor consome.
O consumidor tenta consumir um item que no existe.
Cdigo fonte e .jar disponvel em
JAVARepositorio/JThreads/JProdutorConsumidorSemaforos
93
SEMFOROS
Outros problemas bem-conhecidos
Leitor-escritor em banco de dados
No acessam o BD concorrentemente
Leitor e escritor
Dois escritores
94
MONITOR LOCK
MONITOR: mais alto nvel e mais fcil de utilizar que
semforo
Java s trabalha com monitores
Todo objeto em Java um monitor
95
MONITOR LOCK
Quando uma thread executa um bloco de cdigo
sincronizado, ela fecha o acesso s demais. Outra thread
que tentar acessar a seo crtica (o bloco de cdigo) no
conseguir at que a primeira libere o acesso.
Em java, o bloqueio feito no objeto e no no mtodo.
Isto til quando duas ou mais threads devem atualizar
a mesma rea de mmria (atributo compartilhado).
96
obj:Compartilhado
T2:thread
Lock livre
mtodo sincronizado( )
Lock ocupado
Na seo
crtica
mtodo sincronizado( )
fim mtodo
waiting
notify( )
Na seo
crtica
fim mtodo
Lock livre
97
Exemplo em JAVA
Problema das roletas e contador central
/**
* Contador um objeto compartilhado pelas threads roleta 1 e roleta 2.
*/
class ContadorCentral {
protected int numPessoas=0;
/**
* O cdigo que faz a atualizao da varivel numPessoas uma seo crtica.
* Somente um processo (ou thread) pode execut-lo por vez. Para impedir que
* mais de uma thread atualize numPessoas, utiliza-se a palavra-chave
* synchronized.
**/
protected synchronized void somarNumPessoas(int n) throws InterruptedException
{
numPessoas += n;
}
}
98
JAVARepositorio\JThreads\JRaceConditionRoletasSol
99
100
Semntica
synchronized (object)
{
como
uma
seo
crtica
.
.
.
enterMonitor():
se obtm o lock
entra no monitor
se no aguarda;
exitMonitor():
libera o lock e
notifica processos
bloqueados
101
EXERCCIO
FIM
Soluo em RepositorioJAVA/JThreads/JRaceConditionRoletasSol
Programao Paralela e Distribuda - Fundamentos/UTFPR Prof. Cesar Augusto Tacla
102
103
THREAD 1
tira
pe
THREAD 2
Pedestal
Objeto compartilhado
Programao Paralela e Distribuda - Fundamentos/UTFPR Prof. Cesar Augusto Tacla
104
105
p:Pedestal
Consumidor:Runnable
Lock
Incio do run()
synchronized(p)
Obtm o lock de p
Incio do run()
Lock
synchronized(p)
Pea Colocada
p.livre = false
Livre=false
notifyAll( )
Lock
Lock
Lock
Obtm o lock
p.livre = true
Livre=true
Pea Retirada
106
EXERCCIO
Baixe o cdigo fonte dos robs e pedestal
Inclua mais um rob consumidor
Identifique na mensagem impressa qual rob consumidor
que faz a retirada da pea
Verifique se o programa funciona corretamente.
http://www.dainf.ct.utfpr.edu.br/~tacla/JAVARepositorio/JThreads/JExemploWaitNotifyPedestal/
107
synchronized
(object) {
.
object.wait();
.
object.notify();
.
object.notifyAll(
);
.
}
108
109
Exemplo tpico
synchronized(obj) {
while(<condio>)
{
try {
wait();
}catch (InterruptedException e) { }
}
// alguma coisa
notifyAll();
}
110
111
Tipos de monitores
H duas implementaes clssicas de monitores
Hoare: o processo que faz a notificao interrompido
Estilo Java: o processo que faz a notificao no
necessariamente interrompido
112
Processo 0
synchronized (object) {
.
object.wait();
Processo 1
synchronized (object) {
.
object.notify();
113
Process 0
synchronized (object) {
.
object.wait();
Process 1
synchronized (object) {
.
object.notify();
.
}
.
}
114
Process 0
synchronized (object) {
if (x != 1)
object.wait();
A condio de sincronizao
(x=1) seguramente verdadeira quando o processo
notificado
Process 1
synchronized (object) {
x=1;
O processo que notifica
object.notify(); interrompido
assert(x==1); // x igual a 1
x++;
}
// x pode ser 0 neste ponto
}
115
Process 0
synchronized (object) {
.
object.wait();
Process 1
synchronized (object) {
.
object.notify();
// cdigo
// cdigo
}
.
}
116
Process 0
synchronized (object) {
if (x != 1)
object.wait();
P0 realiza operaes
assumindo x=1, sendo
que x pode ter outro
valor
Process 1
synchronized (object) {
x=1;
object.notify();
assert(x == 1); // x must be 1
x++;
}
assert(x==1); // falso
x++;
}
117
Process 0
synchronized (object) {
while (x != 1)
S sai do while
object.wait(); quando x=1
P0 realiza operaes
assumindo x=1, sendo
que x ser igual a 1
Process 1
synchronized (object) {
x=1;
object.notify();
assert(x == 1); // x must be 1
x++
}
assert(x==1); // verdadeiro
x++;
}
118
119
Resumo
Semforo:
Binrio, contador
Produtor-consumidor
Monitor:
Mais fcil e mais popular que semforos
Dois tipos: Hoare e estilo Java
120
EXERCCIO
Problema do barbeiro dorminhoco
121