1. 1º Teste 2002/03
Considere que existe um serviço com 3 guichets de atendimento (três processos servidores) a que chegam clientes (processos clientes). O sistema deve funcionar do seguinte modo:
| Cliente | Servidor | 
| for (;;){
    If(NovoCliente()) {
        Servico();
    } else ....
} | for (;;){
    RequisitarServico();
    Atendimento();
} | 
Programe as funções que os processos devem invocar:
RequisitarServico()
e NovoCliente().
Utilize semáforos para sincronizar os processos.
Programe em C ou pseudocódigo e defina as variáveis que necessitar. Não se
preocupe com o procedimento Atendimento() e Serviço(); apenas se sabe que é um
procedimento executado por ambos os processos e que termina ao fim de um
intervalo de tempo finito.
2. 1º Teste 2001/02
Pretende-se construir uma aplicação em que processos Produtores enviam mensagens para um processo Consumidor. As mensagens são colocadas em 4 filas cada uma associada a um nível de prioridade (podíamos considerar mensagens com quatro níveis de urgência). As mensagens são todas do mesmo tamanho. As filas de mensagens têm espaço para 3 mensagens.
Quando um produtor pretende escrever a mensagem e a fila está cheia, fica bloqueado. O processo consumidor retira a mensagem da fila mais prioritária. Se não houver mensagem deve ficar bloqueado. Programe as 2 rotinas que permitem inserir e retirar mensagens:
      void inserir(int Prioridade, struct mens m)
      struct mens retirar()
Utilize semáforos para sincronizar os processos. Para simplificar considere as seguintes estruturas:
struct mens - para representar as mensagens.
struct mens [NIVEL] [TAMANHO] buffer - para
representar as filas de mensagem NÍVEL corresponde ao nível de prioridade e
TAMANHO ao número máximo de mensagens por fila.
3. 1º Teste Repescagem 2002/03
Considere o algoritmo dos leitores/escritores tal como foi explicado nas aulas teóricas e que teve oportunidade de usar no trabalho da cadeira. Modifique o programa para que tenha em conta os seguintes requisitos suplementares:
inicia_escrita() se já
    existirem 3 escritores à espera não deve ficar bloqueado retornando com uma
    indicação de erro. 4. 1º Exame 2004/05
Considere uma sala de exposições e um conjunto de
    visitantes. Cada visitante é um ciclo infinito em que 
    entra()
    numa sala de exposições e sai()
    dela ao fim de um determinado tempo. Cada exposição numa sala começa e acaba
    a uma hora determinada, e os visitantes só podem entrar e sair a essas
    horas. Cada sala tem N lugares; se houver mais visitantes, estes esperam
    pela próxima sessão. Programe as rotinas 
    visitante()
    e sala()
    correspondentes aos visitantes e à sala de exposições, respectivamente,
    usando semáforos e trincos lógicos.