sincronização - glêdson elias

25
Programação Programação Concorrente Concorrente Sincronização Sincronização Glêdson Elias Glêdson Elias [email protected] [email protected]

Upload: elenilson-vieira

Post on 18-Nov-2014

2.598 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Sincronização - Glêdson Elias

ProgramaçãoProgramaçãoConcorrenteConcorrente

SincronizaçãoSincronização

Glêdson EliasGlêdson [email protected]@di.ufpb.br

Page 2: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

MonitoresMonitores Construção que pode ser usada para Construção que pode ser usada para

exclusão mútua e sincronização de exclusão mútua e sincronização de processosprocessos

Proposto por Proposto por DijkstraDijkstra e posteriormente e posteriormente implementado por implementado por HoareHoare e e HansenHansen

ExplicitaExplicita e e centraliza centraliza as as sessões críticassessões críticas em em uma parte especial do códigouma parte especial do código Exclusão mútua é automaticamente forçadaExclusão mútua é automaticamente forçada Facilita o entendimentoFacilita o entendimento

Não adota primitivas para demarcar Não adota primitivas para demarcar regiões críticasregiões críticas Evita o esquecimento do uso das primitivasEvita o esquecimento do uso das primitivas

Page 3: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

MonitoresMonitores Um monitor possui . . .Um monitor possui . . .

Nome Nome que tem o propósito de identificaçãoque tem o propósito de identificação Variáveis globaisVariáveis globais que são compartilhadas que são compartilhadas

entre os processos que usam do monitorentre os processos que usam do monitor Procedimentos de entradaProcedimentos de entrada (procedure (procedure

entries)entries) que podem ser ativados pelos que podem ser ativados pelos processosprocessos

Podem possuir variáveis locais e parâmetrosPodem possuir variáveis locais e parâmetros Um único processo poder ativar os Um único processo poder ativar os

procedimentos do monitor, a cada instanteprocedimentos do monitor, a cada instante Impõe a exclusão mútua entre processosImpõe a exclusão mútua entre processos Variáveis globais somente podem ser Variáveis globais somente podem ser

acessadas a partir dos procedimentosacessadas a partir dos procedimentos Código de inicializaçãoCódigo de inicialização das variáveis globais das variáveis globais

Page 4: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

MonitoresMonitores

monitor: nomemonitor;

declaração de variáveis globais;

procedure operação1(parâmetros); declaração de variáveis locais; begin código que implementa a operação end;...procedure operaçãoN(parâmetros); declaração de variáveis locais; begin código que implementa a operação end;

begin código de inicialização das variáveis globaisend

Page 5: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores x SemáforosMonitores x Semáforos

Begin ... oper1(params); ...End;

Begin ... oper2(params); ...End;

Begin ... operN(params); ...End;

Begin ... P(s) Sessão crítica 1 V(s) ...End;

Processo 1Processo 1Begin ... P(s) Sessão crítica 2 V(s) ...End;

Processo 2Processo 2Begin ... P(s) Sessão crítica N V(s) ...End;

Processo NProcesso NSSeemmááffoorroo

MMoonniittoorr

Page 6: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

MonitoresMonitores Podem ser implementados como uma Podem ser implementados como uma

classe em linguagens orientadas a objetosclasse em linguagens orientadas a objetos Nome da classeNome da classe ou ou instância do objetoinstância do objeto

representa o representa o nome do monitornome do monitor AtributosAtributos representam as representam as variáveis globaisvariáveis globais

compartilhadascompartilhadas Métodos Métodos representam os representam os procedimentos de procedimentos de

entradaentrada ConstrutorConstrutor representa o representa o código de código de

inicializaçãoinicialização das variáveis compartilhadas das variáveis compartilhadas

Page 7: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Todo objeto Java possui um monitor Todo objeto Java possui um monitor

associadoassociado Primitiva Primitiva synchronized synchronized permite acessar o permite acessar o

monitor de um objetomonitor de um objeto Primitiva pode ser usada em Primitiva pode ser usada em métodosmétodos ou ou

trechos de código (trechos de código (statementsstatements)) Assegura que, em um dado instante, apenas Assegura que, em um dado instante, apenas

um único um único threadthread pode executar métodos do pode executar métodos do objetoobjeto

ThreadThread possui o bloqueio ( possui o bloqueio (locklock) do monitor do ) do monitor do objetoobjeto

ThreadThread está dentro do monitor do objeto está dentro do monitor do objeto

Page 8: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Primitiva Primitiva synchronizedsynchronized

Métodos SincronizadosMétodos Sincronizados Métodos estáticos também podem ser Métodos estáticos também podem ser

sincronizadossincronizados Instâncias e classe possuem monitores Instâncias e classe possuem monitores

((lockslocks) independentes) independentes Cada monitor (objeto / classe), em um dado Cada monitor (objeto / classe), em um dado

instante, permite a execução de um único instante, permite a execução de um único threadthread

Trechos de Código SincronizadosTrechos de Código Sincronizados Pode incrementar a concorrência de Pode incrementar a concorrência de threadsthreads Permite execução simultânea de diversos Permite execução simultânea de diversos

métodosmétodos

Page 9: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java

MétodoMétodosincronizadosincronizado

MétodoMétodosincronizadosincronizado

Método nãoMétodo nãosincronizadosincronizado

Método nãoMétodo nãosincronizadosincronizado

DadosOObbjjeettoo

Fila de processos doFila de processos domonitor do objetomonitor do objeto

Fila de processos doFila de processos domonitor da classemonitor da classe

Conjunto de processosConjunto de processossem bloqueio dos monitoressem bloqueio dos monitores

Page 10: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Métodos SincronizadosMétodos Sincronizados

public class SynchClassName { private String globalVar;

public SynchClassName() { }

public synchronized void synchMethod() { String localVar; }

public void nonSynchMethod() { }

public static synchronized void synchStaticMethod() { } public static void nonSynchStaticMethod() { }}

Page 11: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Métodos SincronizadosMétodos Sincronizados

public class SynchClass {

public synchronized void synchMethod(int i) { while (true) System.out.println(i); }

public void nonSynchMethod(int i) { while (true) System.out.println(i); }

public static synchronized void synchStaticMethod(int i) { while (true) System.out.println(i); }

public static void nonSynchStaticMethod(int i) { while (true) System.out.println(i); }}

Page 12: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Métodos SincronizadosMétodos Sincronizados

public class SynchImpl extends Thread { int id; SynchClass sc; ... public void run() { switch (id) { case 0: case 1: sc.synchMethod(id); break; case 2: case 3: sc.nonSynchMethod(id); break; case 4: case 5: SynchClass.synchStaticMethod(id); break; case 6: case 7: SynchClass.nonSynchStaticMethod(id); break; } } ...}

public static void main (String[] args) { SynchClass sc = new SynchClass(); for (int i=0; i < 8; i++) (new SynchImpl(i, sc)).start();}

public SynchImpl(int id, SynchClass sc) { this.id = id; this.sc = sc;}

Page 13: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Trechos de Código SincronizadosTrechos de Código Sincronizados

public class SynchClassName { private String globalVar; private Object lock1 = new Object(); private Object lock2 = new Object();

public void nonsyncMethod() { String localVar; ... synchronized (this) { ... } ... }

public void nonsyncMethod1() { synchronized (lock1) { ... } }

public void nonsyncMethod2() { synchronized (lock2) { ... } }

Page 14: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Trechos de Código SincronizadosTrechos de Código Sincronizados

public class SynchClass { private Object lock1 = new Object(); private Object lock2 = new Object();

public void synchThisMethod(int i) { synchronized (this) { while (true) System.out.println(i); } }

public void synchLock1Method(int i) { synchronized (lock1) { while (true) System.out.println(i); } }

public void synchLock2Method(int i) { synchronized (lock2) { while (true) System.out.println(i); } }}

Page 15: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Trechos de Código SincronizadosTrechos de Código Sincronizados

public class SynchImpl extends Thread { int id; SynchClass sc;

public SynchImpl(int id, SynchClass sc) { this.id = id; this.sc = sc; }

public void run() { switch (id) { case 0: case 1: sc.synchThisMethod(id); break; case 2: case 3: sc.synchLock1Method(id); break; case 4: case 5: sc.synchLock2Method(id); break; } } ...}

public static void main (String[] args) { SynchClass sc = new SynchClass(); for (int i=0; i < 6; i++) (new SynchImpl(i, sc)).start(); }

Page 16: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Perigo de DeadlocksPerigo de Deadlocks

Deve-se tomar cuidado para evitar Deve-se tomar cuidado para evitar deadlockdeadlock

public class BadSynchClass { private int value;

public synchronized int get() { return value; }

public synchronized void set(int i) { value = i; }

public synchronized void swap(BadSynchClass bsc) { int tmp = get(); set(bsc.get()); bsc.set(tmp); }}

public BadSynchClass(int v) { value = v; }

Page 17: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores em JavaMonitores em Java Perigo de Perigo de DeadlocksDeadlockspublic class BadSynchImpl extends Thread { BadSynchClass a, b;

public BadSynchImpl(BadSynchClass a, BadSynchClass b) { this.a = a; this.b = b; }

public void run() { a.swap(b); System.out.println(“A: “ + a.get() + “ B: “ + b.get());

}

public static void main (String[] args) { BadSynchClass a = new BadSynchClass(1); BadSynchClass b = new BadSynchClass(2);

(new BadSynchImpl(a, b)).start(); (new BadSynchImpl(b, a)).start(); }}

Page 18: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Sincronização com MonitorSincronização com Monitor Monitor suporta o conceito de Monitor suporta o conceito de

sincronização condicionalsincronização condicional ( (conditional conditional synchronizationsynchronization)) Processos esperam que uma dada condição Processos esperam que uma dada condição

torne-se verdadeiratorne-se verdadeira Implementada com Implementada com variáveis de condiçãovariáveis de condição

((condition variablescondition variables)) São usadas para São usadas para suspendersuspender e e reativarreativar

processosprocessos São associadas a condições que causam a São associadas a condições que causam a

suspensão ou reativação de um processosuspensão ou reativação de um processo Possuem duas operações (Possuem duas operações (waitwait / / signalsignal))

Page 19: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Sincronização com MonitorSincronização com Monitor x.waitx.wait()()

Suspende processo chamador e libera Suspende processo chamador e libera monitormonitor

Monitor insere processo suspenso na fila de Monitor insere processo suspenso na fila de espera associada à variável de condiçãoespera associada à variável de condição

x.signalx.signal()() Reativa processo que está aguardando na Reativa processo que está aguardando na

fila associada à variável de condiçãofila associada à variável de condição Processo reativado retoma a execução do Processo reativado retoma a execução do

ponto logo após a chamada do ponto logo após a chamada do waitwait Processo chamador pode ou não liberar Processo chamador pode ou não liberar

monitor (depende da implementação do monitor (depende da implementação do monitor)monitor)

Page 20: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Sincronização com MonitorSincronização com Monitor Reativação de ProcessosReativação de Processos

Monitor HoareMonitor Hoare Processo chamador libera o monitorProcesso chamador libera o monitor Processo reativado inicia execuçãoProcesso reativado inicia execução

Monitor Estilo JavaMonitor Estilo Java Processo chamador continua a execuçãoProcesso chamador continua a execução Processo reativado apenas aguarda a Processo reativado apenas aguarda a

oportunidade de entrar no monitoroportunidade de entrar no monitor

Qual processo deve executar após a chamada da operação signal?

Page 21: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitor HoareMonitor Hoare Processo da fila executa após a notificaçãoProcesso da fila executa após a notificação Permite que o processo notificado inicie sua Permite que o processo notificado inicie sua

execução sem intervenção de outros execução sem intervenção de outros processosprocessos

Estado no qual o processo inicia a execução Estado no qual o processo inicia a execução é o mesmo de quando a notificação foi é o mesmo de quando a notificação foi realizadarealizada

Processo pode assumir que a condição é Processo pode assumir que a condição é verdadeira após ser reativadoverdadeira após ser reativado Assume que a notificação é ativada apenas Assume que a notificação é ativada apenas

quando a condição é verdadeiraquando a condição é verdadeiraif (! condition) x.wait();

Page 22: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitor Estilo JavaMonitor Estilo Java Processo notificador continua a execução Processo notificador continua a execução

após realizar a notificaçãoapós realizar a notificação Processo reativado não pode assumir que Processo reativado não pode assumir que

a condição é verdadeiraa condição é verdadeira Notificação é apenas um indicativo de que Notificação é apenas um indicativo de que

a condição pode ser verdadeiraa condição pode ser verdadeira Processo reativado deve explicitamente Processo reativado deve explicitamente

reavaliar a condição ao ser reativadoreavaliar a condição ao ser reativado Se a condição for falsa, processo deve ser Se a condição for falsa, processo deve ser

suspenso novamentesuspenso novamente

while (!condition) x.wait();

Page 23: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores JavaMonitores Java Java não possui variáveis de condiçãoJava não possui variáveis de condição Todo objeto possui uma única Todo objeto possui uma única fila de fila de

notificaçãonotificação Todo objeto suporta as operações Todo objeto suporta as operações waitwait / /

notifynotify / / notifyAllnotifyAll Somente podem ser ativadas por Somente podem ser ativadas por threadthread

que possui o monitor do objetoque possui o monitor do objeto

Page 24: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores JavaMonitores Java

Fila de notificaçãoFila de notificaçãodo objetodo objeto

MétodoMétodosincronizadosincronizado

MétodoMétodosincronizadosincronizado

Método nãoMétodo nãosincronizadosincronizado

Método nãoMétodo nãosincronizadosincronizado

DadosOObbjjeettoo

Fila de processos doFila de processos domonitor do objetomonitor do objeto

Fila de processos doFila de processos domonitor da classemonitor da classe

Conjunto de processosConjunto de processossem bloqueio dos monitoressem bloqueio dos monitores

Page 25: Sincronização - Glêdson Elias

Glêdson EliasGlêdson EliasProgramação ConcorrenteProgramação Concorrente

SincronizaçãoSincronização

Monitores JavaMonitores Java wait()wait()

Suspende Suspende threadthread chamador e o insere na chamador e o insere na fila de notificação do objetofila de notificação do objeto

notifynotify()() / / notifyAll()notifyAll() Reativa um único Reativa um único threadthread ( (notifynotify) ou todos ) ou todos

os os threadsthreads ( (notifyAllnotifyAll) da fila de ) da fila de notificação do objetonotificação do objeto

ThreadThread chamador continua execução e não chamador continua execução e não libera o monitorlibera o monitor

Cada Cada threadthread reativado é colocado na fila do reativado é colocado na fila do monitor do objetomonitor do objeto