Sistemas de Computação I - Lista de Exercícios - 6/4/99

  1. Problema dos Leitores e Escritores. Considere a solução abaixo para o problema dos leitores e escritores, dada em sala.
    int nr=0; int nw=0; int dr=0; int dw=0;
    sem e; e.valor = 1;
    sem r; r.valor = 0; sem w; w.valor = 0;
    
    void le(...) {                      void escreve(...) {
      P(e);                               P(e);
      if (nw>0) {                         if (nr>0 || nw>0) {
        dr++;                               dw++;
        V(e);                               V(e);
        P(r);                               P(w);
      }                                   }
      nr++;                               nw++;
      if (dr>0) {                         V(e);
        dr--;                        
        V(r);                             escreve
      {                            
      else /* dr==0*/                     P(e);
        V(e);                             nw--;
                                          if (dr>0) {
      le a base de dados                    dr--;
                                            V(r);
      P(e);                               }
      nr--;                               else if (dw>0) {
      if (nr==0 && dw>0) {                  dw--;
        dw--;                               V(w);
        V(w);                             else /* dr==0 && dw==0 */
      }                                     V(e);
      else /* nr>0 || dw==0 */            }
        V(e);
    }
    Sugira como ela poderia ser alterada de forma a dar preferência aos leitores, ie:
    1. Bloquear um leitor se houver algum escritor esperando
    2. Acordar um leitor somente se não houver nenhum escritor esperando.
  2. Problema do Jantar Comunal. Suponha que um grupo de N canibais come jantares a partir de uma grande travessa que comporta M porções. Quando alguém quer comer, ele(ela) se serve da travessa, a menos que ela esteja vazia. Se a travessa está vazia, o canibal acorda o cozinheiro e espera até que o cozinheiro coloque mais M porções na travessa. Desenvolva código para as ações dos canibais e do cozinheiro. Use semáforos para sincronização. A solução deve evitar deadlock e deve acordar o cozinheiro apenas quando a travessa estiver vazia. (Suponha um longo jantar, onde cada canibal continuamente se serve e come, sem se preocupar com as demais ações na vida do canibal...)
  3. Problema da Montanha Russa. Suponha que há n processos passageiros e um processo vagão. Os passageiros repetidamente esperam para andar no vagão, que comporta v passageiros, onde v<n. O vagão só pode percorrer a montanha russa quando está cheio.
    1. Usando semáforos, desenvolva código para as ações dos processos.
    2. Generalize sua solução para m processos vagão, onde m>1. Um vagão não pode ultrapassar outro, ou seja, os vagões têm que terminar o percurso na mesma ordem em que o iniciaram. Novamente, um vagão só pode iniciar o percurso quando estiver completo.