Monitores (1) � Sugeridos por Dijkstra (1971) e desenvolvidos por Hoare (1974) e Brinch Hansen (1975), são estruturas de sincronização de alto nível, que têm por objetivo impor Sincronização de Processos (5) (forçar) uma boa estruturação para programas concorrentes. � Motivação: Aula 14 – Monitores e Troca de Mensagens � Sistemas baseados em algoritmos de exclusão mútua ou semáforos estão sujeitos a erros de programação. Embora estes devam estar inseridos no código do processo, não existe nenhuma reivindicação formal da sua presença. Assim, erros e omissões (deliberadas ou não) podem existir e a exclusão mútua pode não ser atingida. Prof a . Patrícia D. Costa LPRM/DI/UFES 2 Sistemas Operacionais 2008/1 Monitores (2) Monitores (3) � São elementos de uma linguagem de programação que provêm � Um monitor pode ser visto como um bloco que funcionalidade equivalente a dos semáforos mas que são de contém internamente dados para serem controle mais fácil. compartilhados e procedimentos para manipular � Solução: � Tornar obrigatória a exclusão mútua. Uma maneira de se fazer isso é esses dados. colocar as seções críticas em uma área acessível somente a um processo de cada vez. � Os dados declarados dentro do monitor são � Idéia central: compartilhados por todos os processos, mas só � Em vez de codificar as seções críticas dentro de cada processo, podem ser acessados através dos procedimentos do podemos codificá-las como procedimentos ( procedure entries ) do monitor. Assim, quando um processo precisa referenciar dados monitor, isto é, a única maneira pela qual um compartilhados, ele simplesmente chama um procedimento do processo pode acessar os dados compartilhados é monitor. indiretamente, por meio das procedure entries . � Resultado: o código da seção crítica não é mais duplicado em cada processo. Prof a . Patrícia D. Costa LPRM/DI/UFES 3 Prof a . Patrícia D. Costa LPRM/DI/UFES 4 Sistemas Operacionais 2008/1 Sistemas Operacionais 2008/1
Monitores (4) Variáveis de Condição (1) � As procedure entries são executadas de forma � Mecanismo usado por monitores para realizar mutuamente exclusiva. A forma de implementação do sincronização monitor já garante a exclusão mútua na manipulação � São variáveis que estão associadas a condições que dos seus dados internos. provocam a suspensão e a reativação de processos. � Apenas um processo pode “estar executando” em um Permitem, portanto, sincronizações do tipo sleep- monitor. Qualquer outro processo que tenha invocado o wakeup. monitor é bloqueado (esperando pela disponibilidade do � Só podem ser declaradas dentro do monitor e são monitor). sempre usadas como argumentos de dois comandos � Monitor é um conceito incluído em algumas linguagens especiais: de programação: � Wait (ou Delay ) � Módula, Pascal Concorrente, Java. � Signal (ou Continue ) Prof a . Patrícia D. Costa LPRM/DI/UFES Prof a . Patrícia D. Costa LPRM/DI/UFES 5 6 Sistemas Operacionais 2008/1 Sistemas Operacionais 2008/1 Variáveis de Condição (3) Variáveis de Condição (2) � Wait (condition) � O que acontece após um Signal (condition) ? � Faz com que o monitor suspenda o processo que fez a chamada � Hoare propôs deixar o processo Q recentemente acordado (suspende processo na condição). O monitor armazena as executar, bloqueando o processo P sinalizador . P deve informações sobre o processo suspenso em uma estrutura de esperar em uma fila pelo término da operação de monitor dados (fila) associada à variável de condição. Monitor é liberado realizada por Q . para outro processo. � Fila de Sinalizadores (pode ter prioridade) � Signal (condition) � Brinch Hansen propôs que o processo P conclua a operação � Faz com quer o monitor reative UM dos processos suspensos na em curso, uma vez que já estava em execução no monitor fila associada à variável de condição. Se um processo der um (i.e., Q deve esperar). Neste caso, a condição lógica pela qual signal e não tiver outra tarefa esperando na condição, o sinal é o processo Q estava esperando pode não ser mais verdadeira perdido. quando Q for reiniciado. � Simplificação: o comando signal só pode aparecer como a declaração final em um procedimento do monitor. Prof a . Patrícia D. Costa LPRM/DI/UFES 7 Prof a . Patrícia D. Costa LPRM/DI/UFES 8 Sistemas Operacionais 2008/1 Sistemas Operacionais 2008/1
Exemplo (Abordagem de Hoare ) Exemplo (Abordagem de Hoare ) (cont.) P1 P2 Procedure A Condition 1 P5 P6 P1 P2 Procedure A Condition 1 P6 Dados Críticos Dados Críticos Procedure B Condition 2 Procedure B P5 Condition 2 P4 Procedure C P3 Sinalizadores P4 Procedure C Sinalizadores P3 Prof a . Patrícia D. Costa LPRM/DI/UFES Prof a . Patrícia D. Costa LPRM/DI/UFES 9 10 Sistemas Operacionais 2008/1 Sistemas Operacionais 2008/1 MONITOR <NomedoMonitor>; Declaração dos dados a serem compartilhados pelos processos (isto é, das variáveis globais acessíveis a todos procedimentos do monitor); Exemplos: X,Y: integer; C, D: condition; Entry Procedimento_1(Argumentos_do_Procedimento_1) Declaração das variáveis locais do Procedimento_1 Begin ... Código do Procedimento_1 (ex: X:=1; wait(C)) ... End Formato de Visão da Estrutura Entry Procedimento_N(Argumentos_do_Procedimento_N) um Monitor de um Monitor Declaração das variáveis locais do Procedimento_N Begin ... Código do Procedimento_N (ex: Y:=2; signal(C)) ... End BEGIN ... Iniciação das variáveis globais do Monitor ... END Prof a . Patrícia D. Costa LPRM/DI/UFES 11 Prof a . Patrícia D. Costa LPRM/DI/UFES 12 Sistemas Operacionais 2008/1 Sistemas Operacionais 2008/1
Problema do Produtor- monitor ProducerConsumer Consumidor condition full, empty ; Processo P1 integer count ; //Processo Produtor Begin ... procedure producer ; Chamada a um procedimento do monitor procedure enter ; begin ... begin while true do End if count = N then wait (full) ; begin enter_item ; produce_item ; Processo P2 count := count + 1; ProducerConsumer.enter Begin if count = 1 then signal (empty) end Chamada de ... end ; Chamada a um procedimento do monitor end ; procedure remove ; ... procedimento begin End //Processo Consumidor do Monitor if count = 0 then wait (empty) ; procedure consumer ; Processo P3 remove_item ; begin Begin count := count - 1; while true do ... if count = N - 1 then signal (full) begin Chamada a um procedimento do monitor end ; ... End ProducerConsumer.remove ; count := 0; consume_item end monitor ; end end ; Prof a . Patrícia D. Costa LPRM/DI/UFES Prof a . Patrícia D. Costa LPRM/DI/UFES 13 14 Sistemas Operacionais 2008/1 Sistemas Operacionais 2008/1 Filósofos Glutões Filósofos Glutões (cont.) void pickup(int i) { void putdown(int i) { monitor dp state[i] = hungry; state[i] = thinking; { test[i]; // test left and right neighbors enum {thinking, hungry, eating} state[5]; if (state[i] != eating) test((i+4) % 5); condition self[5]; self[i].wait(); test((i+1) % 5); void pickup(int i) // prox. slide } } void putdown(int i) // prox. slide void test(int i) { void test(int i) // prox. slide if ( (state[i] == hungry) && void init() { (state[(i + 4) % 5] != eating) && for (int i = 0; i < 5; i++) (state[(i + 1) % 5] != eating)) { state[i] = thinking; state[i] = eating; } self[i].signal(); } } Prof a . Patrícia D. Costa LPRM/DI/UFES 15 Prof a . Patrícia D. Costa LPRM/DI/UFES } 16 Sistemas Operacionais 2008/1 Sistemas Operacionais 2008/1
Recommend
More recommend