Top Banner
MC504/MC514 - Sistemas Operacionais Barbeiro dorminhoco Islene Calciolari Garcia Primeiro Semestre de 2017
24

Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Dec 15, 2018

Download

Documents

buique
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

MC504/MC514 - Sistemas Operacionais

Barbeiro dorminhoco

Islene Calciolari Garcia

Primeiro Semestre de 2017

Page 2: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Sumario

Introducao

Implementacao com semaforos

Multiplos barbeiros

Page 3: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Barbeiro Dorminhoco

Tanenbaum: Figura 1.20

Page 4: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Barbeiro Dorminhoco

I Se nao ha clientes, o barbeiro adormece;I Se a cadeira do barbeiro estiver livre, um cliente pode ser

atendido imediatamente;I O cliente espera pelo barbeiro se houver uma cadeira de

espera vazia.I Se nao tive onde sentar, o cliente vai embora...

Page 5: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Cadeiras da sala de espera

I Se nao tiver onde sentar, o cliente vai embora...I Esta abordagem funciona?

semaforo cadeiras = 5;

wait(cadeiras);

Page 6: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Cadeiras da sala de espera

I Esta abordagem funciona?

semaforo cadeiras = 5;

if (sem_getvalue(cadeiras) > 0)

wait(cadeiras);

Page 7: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Cadeiras da sala de espera

sem_t mutex;

int cadeiras = 5;

wait(mutex);

if (cadeiras > 0)

cadeiras--;

signal(mutex);

entra_na_barbearia();

else

signal(mutex);

desiste_de_cortar_o_cabelo();

Page 8: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Clientes so esperam nas cadeiras

semaforo cadeiras = 5;

if (trywait(cadeiras) == 0)

entra_na_barbearia();

else

desiste_de_cortar_o_cabelo();

Page 9: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Disputa pela cadeira do barbeiro

semaforo cadeiras = 5;

semaforo cad_barbeiro = 1;

if (trywait(cadeiras) == 0)

wait(cad_barbeiro);

I Todo cliente precisa passar pela sala de espera?

Page 10: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Disputa pela cadeira do barbeiro

semaforo cadeiras = 5;

semaforo cad_barbeiro = 1;

if (trywait(cad_barbeiro) == 0)

if (trywait(cadeiras) == 0)

wait(cad_barbeiro);

I Esta abordagem e justa?

Page 11: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Iniciando o corte

semaforo cadeiras = 5;

semaforo cad_barbeiro = 1;

if (trywait(cadeiras) == 0)

wait(cad_barbeiro);

I Como avisar o barbeiro que voce esta esperando?

Page 12: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Iniciando o corte

semaforo cadeiras = 5;

semaforo cad_barbeiro = 1;

if (trywait(cadeiras) == 0)

wait(cad_barbeiro);

I Como avisar o barbeiro que voce esta esperando?

Page 13: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Iniciando o corte

semaforo cadeiras = 5;

semaforo cad_barbeiro = 1;

semaforo cliente_cadeira = 0;

if (trywait(cadeiras) == 0)

wait(cad_barbeiro);

signal(cliente_cadeira);

I E os outros clientes?

Page 14: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Cortando o cabelo

semaforo cadeiras = 5;

semaforo cad_barbeiro = 1;

semaforo cliente_cadeira = 0;

if (trywait(cadeiras) == 0)

wait(cad_barbeiro);

signal(cadeiras);

signal(cliente_cadeira);

I Quem decide que o corte acabou?

Page 15: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Cliente

if (trywait(cadeiras) == 0)

wait(cad_barbeiro);

signal(cadeiras);

signal(cliente_cadeira);

wait(cabelo_cortado);

signal(cad_barbeiro);

Page 16: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Barbeiro

semaforo cabelo_cortado = 0;

semaforo cliente_cadeira = 0;

while (true)

wait(cliente_cadeira);

corta_cabelo();

signal(cabelo_cortado);

I Veja o codigo barbeiro.cI Como implementar uma animacao?

Page 17: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Multiplos Barbeiros Dorminhocos

Page 18: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Multiplos Barbeiros Dorminhocos

I Varios semaforos semelhantes ao problema anterior

semaforo cadeiras = N_CADEIRAS_ESPERA;

semaforo cad_barbeiro[N_BARBEIROS] =

{0, 0, 0, ..., 0};

semaforo cabelo_cortado[N_BARBEIROS] =

{0, 0, 0, ..., 0};

semaforo cliente_cadeira[N_BARBEIROS] =

{0, 0, 0, ..., 0};

Page 19: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Multiplos Barbeiros Dorminhocos

I O cliente precisa saber qual e o identificador do barbeirodisponıvel.

I Problema analogo a fila unica em bancos com painel parachamar os clientes.

Page 20: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Modelando o painel

I Variavel para armazenar identificadores:int painel;

I Barbeiros executam escritas:I um barbeiro so pode escrever se o barbeiro anterior ja

recebeu um cliente;I Clientes executam leituras:

I apenas um cliente pode ser atendido de cada vez.I Como controlar?

Page 21: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Multiplos Barbeiros Dorminhocos

I Barbeiros executam escritas:I um barbeiro so pode escrever se o barbeiro anterior ja

recebeu um cliente;I Clientes executam leituras:

I apenas um cliente pode ser atendido de cada vez.

semaforo escreve_painel = 1;

semaforo le_painel = 0;

int painel;

Page 22: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Barbeiro

while (true)

wait(escreve_painel);

painel = id_barbeiro;

signal(le_painel);

wait(cliente_cadeira[id_barbeiro]);

corta_cabelo();

signal(cabelo_cortado[id_barbeiro]);

Page 23: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Cliente

if (trywait(cadeiras) == 0)

signal(cadeiras);

wait(le_painel);

minha_cadeira = painel;

signal(escreve_painel);

wait(cad_barbeiro[minha_cadeira]);

signal(cliente_cadeira[minha_cadeira]);

wait(cabelo_cortado[minha_cadeira]);

signal(cad_barbeiro[minha_cadeira]);

I Podemos eliminar cad barbeiro?

Page 24: Barbeiro dorminhocoislene/1s2017-mc504/barbeiro/barbeiro.pdf · Barbeiro Dorminhoco I Se nao h˜ a clientes, o barbeiro adormece;´ I Se a cadeira do barbeiro estiver livre, um cliente

Multiplos Barbeiros Dorminhocos

I Como implementar uma animacao?I Veja o codigo implementado por Danilo e Erika (EC 2005)