Académique Documents
Professionnel Documents
Culture Documents
LABORATORIO 1
Leitores: Processos, os quais no so requeridos excluir uns aos outros (entre eles). Escritores: Processos, os quais so requeridos excluir todos os outros processos leitores e processos, escritores.
Este problema uma abstrao do acesso base de dados, onde no existe o perigo em termos de diversos processos lendo concorrentemente, mas escrevendo ou mudando os dados deve ser feito sob excluso mtua para garantir consistncia.
Mesmo antes de vermos o monitor, deve estar claro que os procedimentos Start podem causar um processo leitor ou escritor suspender sua escritor, execuo (bloquear), mas que os procedimentos End somente retomam a execuo (desbloqueiam).
O MONITOR
O monitor tem duas variveis de status: Readers: um contador do nmero de leitores que tem passado b t d bem sucedidos em St t R d e did Start_Read esto correntemente lendo. Writing: Um flag que verdadeiro quando um processo escritor est escrevendo. escrevendo
O MONITOR
Existem duas variveis de condio (Condition): Ok_to_Read: para suspender leitores (leitores so colocados numa fila). Ok_to_Write: para suspender escritores (escritores so colocados numa fil ) ( it l d fila).
O MONITOR
A forma geral do monitor no difcil para seguir. As variveis Readers e Writing so incrementadas nos procedimentos de Start e decrementadas nos procedimentos de End End. No incio dos procedimentos St t uma varivel Start, booleana testada para ver se alguma condio deve ser sinalizada. Estas expresses determinam o comportamento do monitor.
O MONITOR
Um leitor suspenso se algum processo escritor est correntemente escrevendo (Writing) ou algum processo est esperando para escrever (Non_Empty (Ok_to_Write)). A primeira condio obviamente requerida pela declarao do problema. A segunda condio uma deciso para dar ao primeiro writer suspenso, prioridade sobre leitores esperando.
O MONITOR
Por outro lado, um escritor suspenso somente se existem processos correntemente lendo (Readers 0) ou escrevendo (Writing) (Writing). Start_Write Start Write no verifica as filas de condio condio. End_Read E d R d executa Si Signal(Ok_to_Write) se l(Ok t W it ) no mais existem leitores. Se existem escritores suspensos, um deles ser acordado e permitido completar Start Write. Start_Write.
O MONITOR
Por outro lado, a operao no faz nada e retornamos ao estado inicial. End-Write d prioridade ao primeiro leitor suspenso, suspenso se existe algum De outra maneira ele algum. maneira, acorda escritores suspensos, se existem. Finalmente, qual a funo de Signal(Ok_to_Read)em Start_Read Signal(Ok to Read)em Start Read ?
O MONITOR
Esta declarao realiza um cascaded wakeup dos leitores suspensos. A t i d um escritor, l it Ao trmino de it damos prioridade para acordar um leitor suspenso, sobre um escritor suspenso suspenso.
O MONITOR
Contudo, se um processo permitido ler, poderamos por bem acordar todos. Quando o primeiro leitor completa Start_to_Read, St t t R d ele assinalar ( i (signal) ao l) prximo leitor, e assim por diante, at que esta cascata de signals acorde todos leitores correntemente suspensos.
O MONITOR
O que se sabe sobre leitores que tentam iniciar leitura durante o cascaded wake-up (a cascata de ativao) ? Eles tero prioridade sobre escritores suspensos ? Pela exigncia de retomada imediata o cascaded imediata, wake-up ser executada at seu trmino, antes de qualquer novo leitor seja permitido comear a execuo de um procedimento do monitor.
O MONITOR
Quando o ltimo Signal(Ok_to_Read) for executado (e nada f it porque a fila d l it t d ( d feito fil de leitores est vazia), o monitor ser liberado e um novo leitor pode entrar entrar. Contudo, Contudo ele (o leitor) est sujeito verificao usual que causar ele, leitor, suspender, se existem escritores esperando. p
O MONITOR
Para sumarizar: Se existem escritores suspensos, um novo leitor requerido esperar at o trmino do (ao menos) primeiro escritor escritor.
Se existem leitores suspensos, eles sero (todos) liberados, antes do prximo escritor liberados escritor.
VARIVEIS DE CONDIO
Uma varivel d condio (C diti ) C t U i l de di (Condition) tem trs t operaes definidas:
Wait(C) O processo que chamou o procedimento do monitor, satisfazendo a condio C suspenso e colocado numa fila associada a C W it(C) pode ser C. Wait(C) lida: Estou esperando para C ocorrer. Signal(C) Se a fila para a condio C no vazia, ento acorde o processo na cabea da fila. Signal ( )p (C) pode ser lida: Estou sinalizando que C ocorreu. q Non_Empty (C) Uma funo booleana que retorna true se a fila para C no vazia vazia.
O MONITOR
monitor R d it Reader_Write_Monitor i W it M it is Readers: Integer := 0; Wrinting: Boolean : false; := OK_to_Read, Ok_to_Write: Condition; procedure Start_Read is begin g if Writing or Non_Empty(Ok_to_Write) then Wait(ok_to_Read); W it( k t R d) Readers := Readers + 1; g ( ) Signal(Ok_to_Read); end Start_Read;
O MONITOR
procedure End Read is End_Read begin Readers := Readers - 1; if Readers = 0 then Signal(Ok_to_Write); g ( ); end End_Reader;
O MONITOR
procedure Start Write is Start_Write begin if Readers /= 0 or Writing then / wait(Ok_to_Write); Writing := true; end Start_Writer;
O MONITOR
procedure End_Write is begin b i Writing := false; if Non Empty(Ok to Reader) then Non_Empty(Ok_to_Reader) signal(Ok_to_Read); else signal(Ok_to_Write); end End_Writer; end Read_Writer_Monitor;