Setembro de 2010
mecanismo de sincronização clássico referência influência de conceitos de programação estruturada C. A. R. Hoare, Monitors: an operating system structuring concept, Communications of the ACM, v.17 n.10, p.549-557, Oct. 1974 Per Brinch Hansen, Structured multiprogramming, Communications of the ACM, v.15 n.7, p.574-578, July 1972 material baseado no Cap. 5 de FMPDP (Andrews)
o que são? construção sintática: compilador entende a encapsulação por monitor construção monitor garante exclusão mútua para as operações encapsuladas monitor meusdados { int pegadado (); void poedado (int); para cooperação, uso de condições cond umacond;... while (!B) wait(umacond); primitivas wait, signal e signal all
Exclusão Mútua 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;
Exclusão Mútua e Cooperação 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);
Espera, Sinalização e Exclusão Mútua espera por condição não pode manter exclusão mútua caso contrário a condição provavelmente nunca será verdadeira primitiva wait deve liberar EM e o que acontece quando um outro processo executa signal? dois processos dentro do monitor?
Poĺıticas propostas 1 sinaliza e continua (SC) 2 sinaliza e espera (SW) 3 sinaliza e sai
Poĺıticas de Sinalização chamada fila de entrada SW (sinalizador) SC (sinalizador) execução no monitor livre monitor SC (proc sinalizado) wait fila de condição SW (proc sinalizado)
Poĺıticas de Sinalização com SW, processo sinalizado pode ter certeza que a condição é verdadeira poĺıtica próxima à proposta inicialmente por Hoare com SC, o próprio processo sinalizador ou outros processos da fila de entrada podem ter revertido a condição sinalização passa a ser apenas dica teste de condição deve, quase sempre, ficar dentro de loop mais fácil de entender!
Poĺıticas de Sinalização a implementação de um semáforo é um bom exemplo da diferença entre as poĺı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);
Passagem de Condição técnica um pouco semelhante à passagem de bastão pode ser usada: 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...
Leitores e Escritores deixa decisões para o escalonador 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
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);
Filósofos
Cuidados... sinalização não embute contagem condição sempre deve ser testada ordens de entrada podem ser totalmente arbitrárias aninhamento e deadlocks reentrância
Implementações de exemplos clássicos: Concurrent Pascal, Modula, Mesa baseadas em monitores: Java e pthreads
em pthreads locks expĺıcitos para exclusão mútua tipo pthread mutex t com operações pthread mutex lock e pthread mutex unlock variáveis de condição tipo pthread cond t operações explicitamente ligam condições a locks pthread cond wait(&cond, &mutex)
em pthreads: exemplo Soma de elementos de matriz (FMPDP)
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();... métodos podem ser declarados como synchronized lock associado a cada objeto uma fila de condição por objeto
em Java: exemplo
Construções com testes impĺıcitos programação mais fácil sinalização é um grande problema na abstração de monitores implementação mais difícil especialmente em termos de eficiência (quanto testar cada predicado pendente?) além de monitores, já foram feitas várias propostas com esperas impĺıcitas
Espera de condições em Guide CLASS FixedSizeBuffer IMPLEMENTS ProducerConsumer IS CONST size=100; buffer : ARRAY[0..size-1] OF Element; first, last: Integer = 0, 0; METHOD Put(IN m: Element); BEGIN buffer[last]:=m; last:=last+1 MOD size; END Put; METHOD Get(OUT m: Element); BEGIN m:=buffer[first]; first:= first +1 MOD size; END Get; CONTROL Put: (completed(put) - completed (Get)<size) AND current(put)=0; Get: (completed (Put) > completed (Get)) AND current(get)=0; END FixedSizeBuffer. R. Balter, S. Lacourte and M. Riveill. The Guide Language. Computer J., vol. 37, no. 6, pp. 521-530, 1994.
com sinalização impĺıcita Buhr, P. A. and Harji, A. S. 2005. Implicit-signal monitors. ACM Trans. Program. Lang. Syst. 27(6), Nov. 2005, 1270-1343.