Sistemas de Computação I - Prova 2
PUC-Rio - 1/07/98

  1. Considere o problema dos canibais dado em sala. Suponha que o cozinheiro tem um comportamento diferente do dado anteriormente. Agora ele cozinha continuamente, produzindo porções de missionário de uma em uma e colocando uma porção na travesssa assim que fica pronta. O cozinheiro só para quando chega na travessa e ela está cheia (suponha que cabem 50 porções na travessa). Nesse caso ele fica esperando algum canibal se servir para poder colocar mais comida na travessa. Cada canibal continua se servindo da travessa e comendo repetidamente. Quando não há comida na travessa, ele simplesmente espera, pois sabe que eventualmente o cozinheiro vai colocar uma nova porção. Modele o comportamento novo do canibal e do cozinheiro, evitando deadlock, starvation, e espera ocupada.
  2. Sistemas de Arquivos: DOS X Unix
    1. Explique a forma usada pelo DOS e pelo Unix para gerenciar os endereços de blocos de um arquivo. Em cada caso, que tipos de arquivos ou sistemas de arquivos podem exigir acessos a muitos blocos de disco para um acesso aleatório?
    2. No DOS um diretório contém informações diversas sobre um arquivo, enquanto no Unix ele contém apenas o endereço do i-node, onde efetivamente estão armazenadas as informações de tamanho, proteção, etc. Que vantagens tem esse nível de indireção?
  3. Considere a descrição do mecanismo de sincronização de Java dado em lista:

    Java, que define concorrência baseada em threads, oferece um conceito bastante similar ao de monitores. Métodos de um objeto definidos como synchronized garantem execução com exclusão mútua em relação a qualquer outro método também definido dessa forma. Em contraste com monitores tradicionais, que oferecem variáveis de condição, Java oferece a primitiva de sincronização wait, que faz um processo ficar bloqueado numa fila de espera associada a um objeto, notify, que acorda o primeiro thread nessa fila, e notifyAll, que acorda todos os threads na fila. Não há uma condição específica associada a cada uma dessas primitivas. Observe que, de forma geral, também não há como saber qual thread é o primeiro em uma fila de espera.

    Usando os mecanismos descritos (não se preocupe com sintaxe, apenas suponha que existem métodos sincronizados e primitivas wait, notify e notifyAll), defina uma classe semáforo, com operações P() e V(), que implemente semáforos contadores (semáforos comuns). Não se preocupe em garantir uma ordem FIFO associada à primitiva P().

  4. Por motivos de desempenho, todo sistema de arquivos mantém um cache de blocos (ou outra unidade) em memória principal. Os problemas relativos a modificações feitas neste cache são um pouco diferentes de modificações feitas em páginas físicas em um sistema de memória virtual. Por que? Que modificações são especialmente importantes? Discuta os mecanismos usados por sistemas de arquivos para gerenciar as modificações feitas ao cache de blocos.

Noemi Rodriguez
Wed Jun 23 11:31:07 EST 1999