Sie sind auf Seite 1von 25

O PROBLEMA DOS LEITORES E ESCRITORES

LABORATORIO 1

O PROBLEMA DOS LEITORES E ESCRITORES


O problema dos leitores e escritores o prximo problema abstrato em programao concorrente que resolveremos. resolveremos similar ao problema da excluso mtua em que diversos processos esto competindo para acessar uma seo crtica. Neste problema, contudo, dividimos os processos em duas classes:

O PROBLEMA DOS LEITORES E ESCRITORES

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.

O PROBLEMA DOS LEITORES E 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.

O PROBLEMA DOS LEITORES E ESCRITORES


O conceito de base de dados deve ser entendido no sentido mais amplo possvel. tid i l l Mesmo a mais simples t b l d M i i l tabela descrevendo o status d t t de um drive de disco ou um conjunto de janelas sobre uma tela de terminal podem ser considerados exemplos de uma base de dados, q pode necessitar ser p que p protegida p alguma g por g soluo para o problema dos leitores e escritores.

O PROBLEMA DOS LEITORES E ESCRITORES


O processo que deseja ler / escrever chama um procedimento adequado do monitor: St t R d Start_Read ou Start_Write. No retorno do procedimento, o processo l / escreve e ento chama um outro procedimento e, ento, do monitor End_Read or End_Write, para indicar ao monitor que ele terminou. q

O PROBLEMA DOS LEITORES E ESCRITORES

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 PROBLEMA DOS LEITORES E ESCRITORES


Processo Reader Process Reader is begin loop Start-Read; Read_the_Data; End_Read; end loop; end Reader;

O PROBLEMA DOS LEITORES E ESCRITORES


Processo Writer Process Writer is P begin loop Start_Write; Write_the_Data; End_Write; end loop; end Writer;

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;

Das könnte Ihnen auch gefallen