Projeto de MC104 - SISTEMAS OPERACIONAIS

Sincronização entre Processos: Mecanismo de Monitores

 

Objetivos do Projeto

Implementar uma solução para um problema clássico de comunicação entre processos (Problema dos Barbeiros - Willian Stallings - Operating Systems: Internals and Design Principles) usando o Mecanismo de Monitores.

 

Descrição do Projeto

Com base na solução do Problema da Barbearia apresentada por Willian Stallings (Operating Systems: Internals and Design Principles) estenda a solução para "n" barbeiros trabalhando simultaneamente (ou seja, em vez de ter 03 barbeiro e 03 poltrona de corte de cabelo, a barbearia agora tem "n" barbeiros e "n" poltronas de corte de cabelo).

Considere também que a barbearia agora tem "m" assentos para os clientes que estão esperando que algum barbeiro os atenda. Quando um cliente chega à barbearia ele observa se está lotada ou não. Se a barbearia estiver lotada (se todos os "n" barbeiros estiverem atendendo clientes e se todos os "m" assentos estiverem ocupados), ele sai sem esperar que o cabelo seja cortado. Se a barbearia não estiver lotada, ele entra e espera pelo corte do seu cabelo.

Divida o programa em pelo menos dois módulos. Um desses módulos deve implementar um monitor que encapsula todos os acessos à barbearia.

  monitor Barbearia {
    /* Campos (variáveis privadas) do monitor */
    ...

    /* Operação chamada pelos clientes: */

    /* se a barbearia não estiver lotada, espera que o corte */
    /* seja feito e retorna true. */
    /* se a barbearia estiver lotada, retorna false. */
    boolean cortaCabelo() { ... }  


    /* Operações chamadas pelos barbeiros: */

    /* pega o próximo cliente (dentro desta chamada o
    /* barbeiro pode dormir esperando um cliente).
    void proximoCliente() { ... } 	

    /* o barbeiro acorda o cliente que está na sua cadeira */
    /* e espera que ele saia da barbearia */
    /* (tome cuidado para acordar o cliente certo). */
    void corteTerminado() { ... }
  } 

Como a Linguagem C não suporta a construção de monitores, implemente o Monitor Barbearia como um módulo C, que exporta as funções cortaCabelo., proximoCliente. e corteTerminado. Dentro desse módulo você precisará de um mutex (para controlar os acessos ao monitor) e de variáveis de condição. Tanto o mutex como as variáveis de condição devem ser variáveis privadas (static) do módulo C que implementa o monitor.

Além deste módulo passivo, o programa deverá acomodar pelo menos um módulo ativo, que implementará threads "barbeiro" e threads "cliente". A saída do seu programa deve indicar qual barbeiro está atendendo qual cliente (ou seja, seu programa associa uma identificação a cada barbeiro e a cada cliente). Ver solução apresentada por José Gonçalves - UFES - Problema dos Barbeiros usando PThreads

 

Aspectos Teóricos

Desenvolva o projeto usando o pacote LinuxThreads, que implementa o padrão pthreads (POSIX Threads) para versões Linux 2.x ou superiores. (The LinuxThreads Library)

Todas as funções POSIX Threads têm nome começando com "pthread_". Neste exercício você não precisará de todas as funções pthread_... Você usará funções básicas de gerenciamento de threads (pthread_create, por exemplo), mutexes (pthread_mutex_...) e variáveis de condição (pthread_cond_...) Não é permitido o uso de outras bibliotecas de suporte à programação multithread (bibliotecas de semáforos, por exemplo).

Tutoriais de PThreads disponíveis na Internet:

 


Luís Fernando Faina - faina@facom.ufu.br
Last modified: Tue Oct 10 10:55:20 2006