Monitores - inf.puc-rio.brnoemi/pc-12/aula5/aula5-monitores.pdf · Monitores Programa˘c~ao...
Transcript of Monitores - inf.puc-rio.brnoemi/pc-12/aula5/aula5-monitores.pdf · Monitores Programa˘c~ao...
Monitores
Programacao Concorrente – 2012.2
September 11, 2012
Programacao Concorrente – 2012.2 Monitores
Monitores
mecanismo de sincronizacao classico
Brinch-Hansen e Hoare, circa 1974
nıvel de protecao diferente do apresentado em outraspropostas
Programacao Concorrente – 2012.2 Monitores
o que sao?
construcao sintatica: parte da linguagem
construcao garante exclusao mutua para as operacoesencapsuladas
combinacao de variaveis compartilhadas e procedimentos queoperam sobre essas variaveis
controle
unica forma de acesso a dados compartilhados!
ausencia de condicoes de corrida
Programacao Concorrente – 2012.2 Monitores
Exemplo – Exclusao Mutua
monitor conta {
int saldo ();
void transfere (...);
void deposita (...);
}
saldo estruturas de dadosinternas
transfere
deposita
...
Programacao Concorrente – 2012.2 Monitores
Exemplo exclusao mutua: buffer ilimitado
monitor BufferIlimitado {
int buf[]; int nxtfree = 0; int nxtdata = 0;
void deposit (int data) {
buf[nxtfree] = data;
nxtfree = nxtfree+1;
}
int fetch () {
int data;
data = buf[nxtdata];
nxtdata = nxtdata+1
return data;
}
}
Programacao Concorrente – 2012.2 Monitores
Cooperacao
espera de condicao: variaveis de condicao
primitivas wait e signal
Programacao Concorrente – 2012.2 Monitores
Exclusao Mutua e Cooperacao
monitor BoundedBuffer {
int buf[SIZE]; int nxtfree = 0; int nxtdata = 0;
cond hasfree, hasdata;
void deposit (int data) {
while ((nxtfree+1)%SIZE == nxtdata) wait(hasfree);
buf[nxtfree] = data;
nxtfree = (nxtfree+1)%SIZE;
signal(hasdata);
}
int fetch () {
int data;
while (nxtfree == nxtdata) wait(hasdata);
data = buf[nxtdata];
nxtdata = (nxtdata+1)%SIZE;
signal(hasfree);
}
}
Programacao Concorrente – 2012.2 Monitores
Cooperacao
sinalizacao a cada vez que condicao e garantida simplificaprograma
mas chamadas a signal tem custo...
Programacao Concorrente – 2012.2 Monitores
Espera, Sinalizacao e Exclusao Mutua
espera por condicao nao pode manter exclusao mutua
caso contrario a condicao provavelmente nunca sera verdadeira
primitiva wait deve liberar EM
e o que acontece quando um outro processo executa signal?
dois processos dentro do monitor?
Programacao Concorrente – 2012.2 Monitores
Polıticas propostas
1 sinaliza e continua (SC)
2 sinaliza e espera (SW)
3 sinaliza e retorna
exclusao mutua e wait
independentemente da polıtica, wait sempre libera exclusaomutua
Programacao Concorrente – 2012.2 Monitores
Polıticas de Sinalizacao
fila de entrada
fila de condição
execução no
monitor
chamadamonitor livre
SW (sinalizador)
SW (proc sinalizado)SC (proc sinalizado)wait
SC (sinalizador)
SR (sinalizador)
SR (proc sinalizado)
Programacao Concorrente – 2012.2 Monitores
Polıticas de Sinalizacao
com SW, processo sinalizado pode ter certeza que a condicaoe verdadeira
polıtica proxima a proposta inicialmente por Hoare
com SC, o proprio processo sinalizador ou outros processos dafila de entrada podem ter revertido a condicao
sinalizacao passa a ser apenas “dica”teste de condicao deve, quase sempre, ficar dentro de loopmais facil de entender!
Programacao Concorrente – 2012.2 Monitores
Polıticas de Sinalizacao
a implementacao de um semaforo e um bom exemplo dadiferenca entre as polıticas:
monitor Semaphore {
int s = 0; ## s >= 0
cond pos; # signaled when s > 0
procedure Psem() {
while (s == 0) wait(pos);
s = s-1;
}
procedure Vsem() {
s = s+1;
signal(pos);
}
}
Programacao Concorrente – 2012.2 Monitores
Passagem de Condicao
tecnica um pouco semelhante a passagem de bastao pode serusada:
monitor Semaphore {
int s = 0; ## s >= 0
cond pos; # signaled when s > 0
procedure Psem() {
if (s == 0) wait (pos);
else s = s-1;
}
procedure Vsem() {
if (empty(pos)) s = s+1;
else signal(pos);
}
}
mais difıcil de entender...
Programacao Concorrente – 2012.2 Monitores
Leitores e Escritores
monitor RW_Controller {
int nr = 0, nw = 0; ## (nr == 0 or nw == 0) and nw <= 1
cond oktoread; # signaled when nw == 0
cond oktowrite; # signaled when nr == 0 and nw == 0
procedure request_read() {
while (nw > 0) wait(oktoread);
nr = nr + 1;
}
procedure release_read() {
nr = nr - 1;
if (nr == 0) signal(oktowrite); # awaken one writer
}
procedure request_write() {
while (nr > 0 || nw > 0) wait(oktowrite);
nw = nw + 1;
}
procedure release_write() {
nw = nw - 1;
signal(oktowrite); # awaken one writer and
signal_all(oktoread); # all readers
}
}
deixa decisoes para o escalonadorProgramacao Concorrente – 2012.2 Monitores
outro exemplo: Barreira
monitor Barreira {
int qtos = 0; ## qtos >= 0
cond chegaram; # signaled when qtos == TODOS
procedure cheguei() {
qtos++;
if (qtos < TODOS)
while (qtos < TODOS) wait(chegaram);
else
signal_all (chegaram);
}
}
Programacao Concorrente – 2012.2 Monitores
Cuidados...
sinalizacao nao embute contagem
condicao sempre deve ser testada
ordens de entrada podem ser totalmente arbitrarias
aninhamento e deadlocks
reentrancia
Programacao Concorrente – 2012.2 Monitores
Aninhamento e composicao
monitores e programacao estruturada: e natural pensar emcriar novas estruturas a partir de outras ja definidas...
cond.wait()
Programacao Concorrente – 2012.2 Monitores
Implementacoes de Monitores
exemplos classicos: Concurrent Pascal, Modula, Mesa
baseadas em monitores: Java e pthreads
Programacao Concorrente – 2012.2 Monitores
Monitores em pthreads
locks explıcitos para exclusao mutuatipo pthread mutex t com operacoes pthread mutex lock
e pthread mutex unlock
variaveis de condicaotipo pthread cond t
operacoes explicitamente ligam condicoes a lockspthread cond wait(&cond, &mutex)
Programacao Concorrente – 2012.2 Monitores
Monitores em pthreads: exemplo
Soma de elementos de matriz (FMPDP)
Programacao Concorrente – 2012.2 Monitores
Java
classe Thread e interface Runnable
class Simple implements Runnable {
public void run () { System.out.println ("alo alo");}
}
Runnable s = new Simple;
new Thread(s).start();
...
metodos podem ser declarados como synchronized
lock associado a cada objeto
uma fila de condicao por objeto
Programacao Concorrente – 2012.2 Monitores
Monitores em Java: exemplo
Programacao Concorrente – 2012.2 Monitores
Construcoes com testes implıcitos
variaveis de condicao substituıdas por predicados reavaliadosautomaticamente
programacao mais facil
sinalizacao e o grande problema na abstracao de monitores
implementacao mais difıcil
especialmente em termos de eficiencia (quanto testar cadapredicado pendente?)
alem de monitores, ja foram feitas varias propostas comesperas implıcitas
Programacao Concorrente – 2012.2 Monitores
Bibliografia
Propostas originais
C. A. R. Hoare, Monitors: an operating system structuringconcept, Communications of the ACM, 17(10), p.549-557,Oct. 1974
Per Brinch Hansen, Structured multiprogramming,Communications of the ACM, 15(7), p.574-578, July 1972
P. A. Buhr and A. S. Harji. Implicit-signal monitors. ACMTransactions on Programming Languages and Systems,27:1270-1343, November 2005.
Programacao Concorrente – 2012.2 Monitores