\begin{myslide}

  \begin{center}

    {\large \sf \textbf{MC514--Sistemas Operacionais: Teoria e Prática}\\
      1s2010}

    \subheading{Barbeiro Dorminhoco}
  
\end{center}

\end{myslide}

\begin{myslide}
\heading{Barbeiro Dorminhoco}
\bigskip
  \centerline{\epsfig{figure=mos2-figs/2-35.eps,scale=.5}}
\end{myslide}


\begin{myslide}
\heading{Barbeiro Dorminhoco}
\bigskip
\begin{itemize}
\item Se não há clientes, o barbeiro adormece;
\item Se a cadeira do barbeiro estiver livre, 
um cliente pode ser atendido imediatamente;
\item O cliente espera pelo barbeiro se
  houver uma cadeira de espera vazia.
\item Se não tive onde sentar, o cliente vai embora...
\end{itemize}
\end{myslide}

\begin{myslide}
\heading{Cadeiras da sala de espera}
\bigskip
\begin{itemize}
\item Se não tiver onde sentar, o cliente vai embora...
\item Esta abordagem funciona?
\end{itemize}
\begin{verbatim}
semaforo cadeiras = 5;
wait(cadeiras);
\end{verbatim}
\end{myslide}

\begin{myslide}
\heading{Cadeiras da sala de espera}
\bigskip
\begin{itemize}
\item Esta abordagem funciona?
\end{itemize}
\begin{verbatim}
semaforo cadeiras = 5;
if (sem_getvalue(cadeiras) > 0)
  wait(cadeiras);
\end{verbatim}
\end{myslide}

\begin{myslide}
\heading{Cadeiras da sala de espera}
\bigskip

\begin{verbatim}
sem_t mutex;
int cadeiras = 5;

wait(mutex);
if (cadeiras > 0) 
  cadeiras--;
  signal(mutex);
  entra_na_barbearia();
else 
   signal(mutex);
   desiste_de_cortar_o_cabelo();
\end{verbatim}

\end{myslide}

\begin{myslide}
\heading{Clientes só esperam nas cadeiras}
\bigskip

\begin{verbatim}
semaforo cadeiras = 5;

if (trywait(cadeiras) == 0)
  entra_na_barbearia();
else
  desiste_de_cortar_o_cabelo();
\end{verbatim}
\end{myslide}


\begin{myslide}
\heading{Disputa pela cadeira do barbeiro}
\bigskip

\begin{verbatim}
semaforo cadeiras = 5;
semaforo cad_barbeiro = 1;

if (trywait(cadeiras) == 0)
   wait(cad_barbeiro);
\end{verbatim}

\begin{itemize}
\item Todo cliente precisa passar pela sala de espera?
\end{itemize}

\end{myslide}

\begin{myslide}
\heading{Disputa pela cadeira do barbeiro}
\bigskip

\begin{verbatim}
semaforo cadeiras = 5;
semaforo cad_barbeiro = 1;

if (trywait(cad_barbeiro) == 0)
  if (trywait(cadeiras) == 0)
     wait(cad_barbeiro);
\end{verbatim}

\begin{itemize}
\item Esta abordagem é justa?
\end{itemize}
\end{myslide}


\begin{myslide}
\heading{Iniciando o corte}
\bigskip

\begin{verbatim}
semaforo cadeiras = 5;
semaforo cad_barbeiro = 1;

if (trywait(cadeiras) == 0)
   wait(cad_barbeiro);
\end{verbatim}

\begin{itemize}
\item Como avisar o barbeiro que você está esperando?
\end{itemize}

\end{myslide}

\begin{myslide}
\heading{Iniciando o corte}
\bigskip

\begin{verbatim}
semaforo cadeiras = 5;
semaforo cad_barbeiro = 1;

if (trywait(cadeiras) == 0)
   wait(cad_barbeiro);
\end{verbatim}

\begin{itemize}
\item Como avisar o barbeiro que você está esperando?
\end{itemize}

\end{myslide}

\begin{myslide}
  \heading{Iniciando o corte}
\bigskip

\begin{verbatim}
semaforo cadeiras = 5;
semaforo cad_barbeiro = 1;
semaforo cliente_cadeira = 0;

if (trywait(cadeiras) == 0)
   wait(cad_barbeiro);
   signal(cliente_cadeira);
\end{verbatim}
\begin{itemize}
\item E os outros clientes?
\end{itemize}
\end{myslide}

\begin{myslide}
  \heading{Cortando o cabelo}
\bigskip

\begin{verbatim}
semaforo cadeiras = 5;
semaforo cad_barbeiro = 1;
semaforo cliente_cadeira = 0;

if (trywait(cadeiras) == 0)
   wait(cad_barbeiro);
   signal(cadeiras);
   signal(cliente_cadeira);
\end{verbatim}
\begin{itemize}
\item Quem decide que o corte acabou?
\end{itemize}
\end{myslide}

\begin{myslide}
\heading{Cliente}
\bigskip

\begin{verbatim}
if (trywait(cadeiras) == 0)
   wait(cad_barbeiro);
   signal(cadeiras);
   signal(cliente_cadeira);
   wait(cabelo_cortado);
   signal(cad_barbeiro);
\end{verbatim}
\end{myslide}

\begin{myslide}
\heading{Barbeiro}
\bigskip

\begin{verbatim}
semaforo cabelo_cortado = 0;
semaforo cliente_cadeira = 0;

while (true) 
  wait(cliente_cadeira); 
  corta_cabelo();
  signal(cabelo_cortado);
\end{verbatim}

\begin{itemize}
\item Veja o código barbeiro.c
\item Como implementar um cineminha?
\end{itemize}
\end{myslide}


\begin{myslide}
\heading{Múltiplos Barbeiros Dorminhocos}
\bigskip
  \centerline{\epsfig{figure=barbeiro/barbeiros.eps,scale=.35}}
\end{myslide}

\begin{myslide}
\heading{Múltiplos Barbeiros Dorminhocos}
\bigskip
\begin{itemize}
\item  Vários semáforos semelhantes ao problema anterior
\end{itemize}
\begin{verbatim}
semaforo cadeiras = N_CADEIRAS_ESPERA;
semaforo cad_barbeiro[N_BARBEIROS] = 
                        {0, 0, 0, ..., 0};
semaforo cabelo_cortado[N_BARBEIROS] = 
                        {0, 0, 0, ..., 0};
semaforo cliente_cadeira[N_BARBEIROS] = 
                        {0, 0, 0, ..., 0};
\end{verbatim}
\end{myslide}

\begin{myslide}
\heading{Múltiplos Barbeiros Dorminhocos}
\bigskip
\begin{itemize}
\item O cliente precisa saber qual é o identificador
do barbeiro disponível.

\item Problema análogo a fila única em bancos com visor
para chamar os clientes.

\end{itemize} 
\end{myslide}

\begin{myslide}
\heading{Modelando o visor}
\bigskip
\begin{itemize}
\item Variável para armazenar identificadores:
\begin{verbatim}
int visor;
\end{verbatim}
\item Barbeiros executam escritas
  \begin{itemize}
  \item Um barbeiro só pode escrever
    se o barbeiro anterior já atendeu um cliente;
  \end{itemize}
\item Clientes executam leituras
  \begin{itemize}
  \item Apenas um cliente pode ser atendido de cada vez.
  \end{itemize}
\end{itemize}
\end{myslide}

\begin{myslide}
\heading{Múltiplos Barbeiros Dorminhocos}
\bigskip
\begin{itemize}
\item O cliente precisa saber qual é o identificador
do barbeiro disponível.

\item Problema análogo a fila única em bancos com visor
para chamar os clientes.

\begin{verbatim}
semaforo escreve_visor = 1;
semaforo le_visor = 0;
int visor;
\end{verbatim}
\end{itemize}
\end{myslide}


\begin{myslide}
\heading{Barbeiro}
\bigskip

\begin{verbatim}
while (true) 
  wait(escreve_visor);
  visor = id_barbeiro;
  signal(le_visor);
  wait(cliente_cadeira[id_barbeiro]);
  corta_cabelo();
  signal(cabelo_cortado[id_barbeiro]);
\end{verbatim}
\end{myslide}

\begin{myslide}
\heading{Cliente}
\bigskip

\begin{verbatim}
if (trywait(cadeiras) == 0)
   signal(cadeiras);
   wait(le_visor);
   minha_cadeira = visor;
   signal(escreve_visor);
   wait(cad_barbeiro[minha_cadeira]);
   signal(cliente_cadeira[minha_cadeira]);
   wait(cabelo_cortado[minha_cadeira]);
   signal(cad_barbeiro[minha_cadeira]);
\end{verbatim}
\begin{itemize}
\item Podemos eliminar cad\_barbeiro?
\end{itemize}
\end{myslide}

\begin{myslide}

\heading{Múltiplos Barbeiros Dorminhocos}  
\bigskip

\begin{itemize}

\item Como implementar um cineminha? 

\item Como você implementaria este problema
   utilizando locks e variáveis de condição?
   
\end{itemize}  

\end{myslide}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../base"
%%% End: 
