Programação Concorrente Monitores e Troca de Mensagens Monitores Considere que, no projeto da solução do produtor-consumidor com semáforos, os 2 downs tenham sido trocados Se o buffer estiver cheio deadlock Monitor = coleção de variáveis, estruturas e procedimentos que são agrupados em um módulo ou pacote (tipo abstrato de dados com operações bem definidas para atuarem sobre sua estrutura de dados) Um monitor é uma abstração de alto nível que provê exclusão mútua Os procedimentos de um monitor só executam alguma tarefa quando chamados por processos (são passivos) e operam sobre variáveis comuns que constituem sua estrutura de dados 2 Monitores e Troca de Mensagens 1
Monitores Os processos podem chamar procedimentos dos monitores, mas não têm acesso à estrutura interna dos mesmos Somente um processo pode estar ativo em um monitor em cada instante, sendo assim, definem regiões críticas criando exclusão mútua para a estrutura de dados do monitor Quando um processo chama um procedimento num monitor, verifica-se se outro processo está ativo no monitor Sim: processo suspenso Não: processo pode entrar na Região Crítica A sincronização entre processos concorrentes se faz através de operações WAIT e SIGNAL sobre variáveis do tipo evento, definidas dentro do monitor Uma thread (ou procedimento) que invoca x.wait é suspensa até que outra(o) invoque x.signal Implementação: precisa de suporte da linguagem 3 Monitores e Troca de Mensagens Monitores Somente uma thread (ou procedimento) pode estar ativo dentro do monitor por vez monitor monitor-name { // variable declarations public entry p1( ) { public entry p2( ) { 4 Monitores e Troca de Mensagens 2
Monitor com variáveis veis de condição 5 Monitores e Troca de Mensagens Produtor/Consumidor com Monitor procedure producer; while true do produce_item; ProduceConsumer.enter; procedure consumer; while true do ProduceConsumer.remove; consume_item; 6 Monitores e Troca de Mensagens 3
(cont.) Prod/Cons com Monitor monitor ProducerConsumer condition full, empty; integer count; procedure enter; if count = N then wait(full); enter_item; count := count + 1; if count = 1 then signal(empty); procedure remove; if count = 0 then wait(empty); remove_item; count := count - 1; if count = N - 1 then signal(full); count := 0; end monitor; 7 Monitores e Troca de Mensagens Troca de Mensagens Os mecanismos anteriores permitem comunicação indireta O mecanismo de troca de mensagens entre um processo gerente, destinado a disciplinar a utilização de determinado recurso, e os processos concorrentes pode ser usado para se obter exclusão mútua Duas primitivas -não há compartilhamento de memória SEND(destino, msg) RECEIVE(fonte, &msg) destino: processo destinatário (ex.: PID) msg: mensagem que se quer enviar fonte: processo que enviou msg: mensagem retornada, se existir Caso não exista mensagem, o processo pode ser bloqueado até a existência de uma 8 Monitores e Troca de Mensagens 4
(cont.) Troca de Mensagens Identificação dos processos: processo@máquina Nomes de máquinas iguais domínio (proc@máq.domínio) O armazenamento e a sincronização são feitos pelas primitivas, ou seja, pelo SO, que é o responsável A mensagem pode se perder na rede: mensagem de reconhecimento (acknowledgement) se ACK não chegar, retransmite e se a msg chega, mas o ACK se perde? fonte envia msg novamente Confiabilidade autenticação n o de identificação de msg Se transmissor e receptor estão na mesma máquina, o rendimento cai pelo excesso de cópias de dados 9 Monitores e Troca de Mensagens Prod/Cons com Troca de Mensagens #include prototypes.h #define N 100 #define MSIZE 4 typedef int message[4]; void producer(void) { int item; message m; while (TRUE) { produce_item(&item); receive(cons, &m); build_msg(&m, item); send(cons, &m); void consumer(void) { int item, i; message m; for(i=0; i<n; i++) send(prod, &m); while (TRUE) { receive(prod, &m); extract_msg(&m,item); send(prod, &m); consume_item(item); 10 Monitores e Troca de Mensagens 5