View
2.599
Download
0
Category
Preview:
DESCRIPTION
Citation preview
ProgramaçãoProgramaçãoConcorrenteConcorrente
SincronizaçãoSincronização
Glêdson EliasGlêdson Eliasgledson@di.ufpb.brgledson@di.ufpb.br
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
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
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
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
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
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
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
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
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() { }}
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); }}
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;}
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) { ... } }
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); } }}
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(); }
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; }
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(); }}
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))
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)
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?
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();
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();
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
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
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
Recommended