LEIC/LERC 2009/10

Sistemas Operativos

Aula 5

Exercícios de Sincronização II

Objectivo

 


Introdução

1. Leitores/Escritores

Este slide apresenta uma solução alternativa para o problema dos Leitores/Escritores. Estude a solução e responda às questões seguintes:

a) De que forma é assegurada a exclusão mútua entre escritores? E entre um escritor e um leitor?

b) Se um escritor está a escrever, o que impede todos os leitores de aceder aos dados?

c) Se um escritor acaba de escrever, o que permite a todos os leitores bloqueados de aceder aos dados?

 

2. Barbeiro

Numa barbearia existe uma cadeira onde o barbeiro corta cabelo e N cadeiras para os clientes que estão à espera. Se não existem clientes, o barbeiro senta-se na cadeira e adormece. Quando um cliente chega, ele tem que acordar o barbeiro dorminhoco para lhe cortar o cabelo. Se entretanto chegarem mais clientes enquanto o barbeiro estiver a cortar o cabelo ao primeiro, ou esperam numa cadeira livre ou vão-se embora se já não houver mais cadeiras livres. Considere que o barbeiro e os clientes são implementados, respectivamente, pelas tarefas thr_barber e thr_customer.

I.

a) Verifique que esta é uma solução possível para o problema.

b) Qual a função do semáforo SemBarber? E do semáforo SemCustomers?

c) Porque razão é necessário o trinco Mutex?

II.

a) Verifique que esta pode ser também uma solução para o problema através do emprego de monitores.

b) Explique a função do monitor e das variáveis globais na solução apresentada na alínea anterior.

 

Material de Apoio

 


Exercícios

1. O Supermercado

Considere um supermercado com N caixas de pagamento com um empregado em cada caixa. Enquanto houver clientes na sua fila o empregado atende-os. Se não tiver nenhum cliente para ser atendido na sua fila, o empregado pode atender um cliente de outra fila. Se não estiver ninguém para atender em nenhumas das filas, o empregado bloqueia-se à espera de clientes.

O cliente quando chega, escolhe a fila (ou uma das filas) que tiver menos menos clientes. Mas uma vez escolhida, o cliente não pode trocar de fila, excepto para ser atendido conforme descrito anteriormente. O número de clientes por fila é ilimitado.

Implemente em pseudo-código C:

As rotinas Empregado(int fila) e Cliente() que correspondem respectivamente às funções de empregado e cliente. Considere que ainda existem 2 rotinas -Atender() e serAtendido()- que são chamadas respectivamente pelas rotinas Empregado() e Cliente() quando o empregado está a atender o cliente e, por sua vez, o cliente está a ser atendido pelo empregado. A implementação das rotinas Atender() e serAtendido() não faz parte do exercício (considere-as uma caixa negra).

a) Usando semáforos.

b) Usando monitores.

 

2. Leitores/Escritores

Considere de novo o problema dos Leitores/Escritores.

a) Escreva uma solução em pseudo-código C para as rotinas: th_reader() e, th_writer() utilizando monitores como ferramenta de sincronização entre as várias tarefas concorrentes.

b) Suponha que é permitido o acesso, no máximo, a 2 tarefas escritoras consecutivas. Alterar convenientemente a solução anterior de modo a acomodar esta nova situação.

 


Exercício Suplementar

Movimento Portuário

Um porto marítimo de uma cidade pode receber no máximo N navios que entram através de um canal. Pelo canal pode transitar apenas um navio de cada vez. Os navios que saiem do porto têm prioridade na travessaia do canal.

Cada navio é simulado por uma tarefa cujo pseudo-código é o seguinte:

        thr_navio() {
 	      < Chegada à entrada do canal >
              pedido_entrada();
	      < Atravessa o canal >
	      entrada_OK();
	      < Atraca no porto >
	      pedido_saida();
	      < Atravessa o canal >
	      saida_OK();
              < Parte em viagem para outro porto >       
        }    

Utilizando monitores, implemente em pseudo-código C as funções pedido_entrada(), entrada_OK(), pedido_saida() e saida_OK().