17
Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela Prof. Hélio de Sousa Lima Filho ( [email protected] )

Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

  • Upload
    kyle

  • View
    49

  • Download
    0

Embed Size (px)

DESCRIPTION

Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela Prof. Hélio de Sousa Lima Filho ( [email protected] ). Referencial Bibliográfico. Coulouris, George; Dollimore, Jean e Kindberg, Tim. Sistemas Distribuídos: conceitos e projeto . - PowerPoint PPT Presentation

Citation preview

Page 1: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sistemas Distribuídos

Aula 05 – Programação Multithread/Paralela

Prof. Hélio de Sousa Lima Filho ([email protected])

Page 2: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Referencial Bibliográfico

• Coulouris, George; Dollimore, Jean e Kindberg, Tim. Sistemas Distribuídos: conceitos e projeto.

• Ribeiro, Uirá. Sistemas Distribuídos, Desenvolvendo aplicações de Alta Performance no Linux.

2Sistemas Distribuídos

Page 3: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sincronização

public class ContaBancaria {. . .public void depositar(double valor) {

double aux;aux = getSaldo();aux = aux +valor;

setSaldo(aux); } public void sacar(double valor) {

double aux;aux = getSaldo();aux = aux - valor;

setSaldo(aux); }}

3Sistemas Distribuídos

Page 4: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sincronização

• Se duas threads chamarem depositar(100);

4Sistemas Distribuídos

Thread1 Thread2 Saldo

aux = getSaldo(); //aux = 100

100

aux = getSaldo(); //aux = 100

aux = aux +valor;//aux = 200

aux = aux +valor;//aux = 200

setSaldo(aux); 200

setSaldo(aux); 200

Page 5: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sincronização

• Como criar seções críticas? – Por meio da palavra synchronized.

5Sistemas Distribuídos

public class ContaBancaria {. . .public synchronized void depositar(double valor) {

setSaldo(getSaldo()+valor); } public synchronized void sacar(double valor) {

setSaldo(getSaldo()+valor); }}

Page 6: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sincronização

• Todo objeto em Java possui um lock: – informa se o objeto foi ou não “travado” por alguma

thread

• Seja a chamada p.m(): (m é synchronized) – Antes executar m, thread deve adquirir lock de p (i.e.,

travar p). • Se p já estiver travado, thread espera até ser destravado.

– Quando thread terminar execução de m, ela libera o lock de p

– Durante execução de m, thread pode chamar outros métodos synchronized desse objeto (sem esperar)

6Sistemas Distribuídos

Page 7: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sincronização

• Como colocar uma thread para dormir: – por meio de wait()– Chamado por thread de posse do lock de um

objeto p– Libera-se o lock deste objeto– Execução desta thread é suspensa até uma

execução de notify() ou notifyAll() sobre p– Ao ser “acordada”, thread volta a disputar o

lock de p. Execução reinicia na linha seguinte ao wait()

7Sistemas Distribuídos

Page 8: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sincronização

• Como “acordar” uma thread? notify() ou notifyAll()

• notify(): – chamado por thread de posse do lock de um

objeto p– Acorda (arbitrariamente) uma das threads que

estejam “dormindo” sobre este objeto– Thread acordada volta a disputar lock de p

• notifyAll(): – acorda todas as threads que estejam dormindo

sobre um determinado objeto.

8Sistemas Distribuídos

Page 9: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sincronização

• Todo objeto em Java possui dois conjuntos:– Conjunto de entrada:

• threads que estão bloqueadas, disputando o lock desse objeto (i.e., chamaram um método sincronizado, mas não iniciaram a execução do mesmo)

– Conjunto de espera: • threads cuja execução está suspensa

9Sistemas Distribuídos

Page 10: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Sincronização

• Operações:– wait():

• move a thread corrente para o conjunto de espera do objeto sobre o qual a operação foi chamada.

– notify(): • move uma thread arbitrária do conjunto de espera para o

conjunto de entrada– notifyAll():

• move todas as threads do conjunto de espera para o conjunto de entrada

• Quando uma thread libera o lock de um objeto, uma thread arbitrária do conjunto de entrada é desbloqueada

10Sistemas Distribuídos

Page 11: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Produtor/Consumidor Java

public class Produtor extends Thread { private Buffer buf; private int numero; public Produtor(Buffer buf, int numero) { this.buf= buf; this.numero = numero; } public void run() { for (int i = 0; i < 10; i++) { // armazena 10 valores no buffer buf.put(i); System.out.println("Produtor #" + numero + " put: “+ i); try { sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { } } }}

11Sistemas Distribuídos

Page 12: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Produtor/Consumidor Java

public class Consumidor extends Thread { private Buffer buf; private int numero; public Consumidor(Buffer buf, int numero) { this.buf= buf; this.numero = numero; } public void run() { // retira 10 valores do buffer int x; for (int i = 0; i < 10; i++) { x = buf.get(); System.out.println("Consumidor #"+ numero + " get: "

+ x); } }

12Sistemas Distribuídos

Page 13: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Produtor/Consumidor Java

• Suponha um buffer com capacidade para apenas um inteiro e métodos get() e put():

– No método get(), ao sair do wait, • thread deve voltar a testar se buffer

está vazio. • Pode ser que outro consumidor tenha

obtido o lock do objeto na frente e esvaziado o buffer.

– Se isso tiver acontecido, thread volta a dormir

– No método put(), ao sair do wait, • thread deve voltar a testar se buffer

está cheio. • Pode ser que outro produtor tenha

obtido o lock do objeto na frente e ocupado o buffer.

– Se isso tiver acontecido, thread volta a dormir

13Sistemas Distribuídos

public class Buffer { private int valor; private boolean cheio = false; public synchronized int get() { while (!cheio) { try { wait(); } catch (InterruptedException e) { } } cheio= false; notifyAll(); return valor; } public synchronized void put(int valor) { while (cheio) { try { wait(); } catch (InterruptedException e) { } } this.valor= valor; cheio= true; notifyAll(); }}

Page 14: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Leitores e Escritores

• Assuma que threads leitoras e escritoras compartilham um objeto de uma classe BD, a qual possui um atributo inteiro x e dois métodos: read (retorna o valor de x) e write (incrementa o valor de x).

• A solução proposta deve permitir leituras concorrentes.

14Sistemas Distribuídos

Page 15: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Leitores e Escritores

class BD { private int x; private int nr= 0; private synchronized void

startRead() { nr++; } public synchronized void

endRead() { nr--; if (nr==0) notify(); }

public int read() { int t; startRead(); t= x; endRead(); return t; } public synchronized void write() { while (nr > 0) wait(); x++; notify(); }}

15Sistemas Distribuídos

Page 16: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Leitores e Escritores

• Se um escritor ativo: – leitor é bloqueado no startRead()

• Se existe leitor ativo: – novos leitores conseguem ler; – novo escritor fica bloqueado no while

• notify de endRead: – desbloquear escritores

• notify de write; – desbloquear outros escritores

16Sistemas Distribuídos

Page 17: Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela

Comando synchronized

• Permite adquirir o lock de qualquer objeto (por uma duração inferior à execução completa de um método)

• Exemplo:void abs (int [] v) { synchronized (v) { // garante que v é acessado

//em uma seção crítica for (int i= 0; i < v.lenghth; i++) if (v[i] < 0) v[i]= -v[i]; }}

17Sistemas Distribuídos