Você está na página 1de 26

Sistemas Operacionais

Programao Concorrente
Problemas clssicos

Edson Moreno
edson.moreno@pucrs.br
http://www.inf.pucrs.br/~emoreno

Sumrio
Produtor / consumidor
O jantar dos filsofos
O barbeiro sonolento

Produtor / Consumidor
Caracterstica de execuo
Dois processos que compartilham um buffer de tamanho limitado
O processo produtor:

Produz um dado
Insere no buffer
Volta a gerar um dado

O processo consumidor:

Consome um dado do buffer (um por vez)

O problema
Como garantir que o produtor no adicionar dados no buffer se este estiver cheio?
Como garantir que o consumidor no vai remover dados de um buffer vazio?

Produtor / Consumidor
Soluo
Para o processo produtor
Entrar em Sleep ou descartar o dado se o buffer estiver cheio
Quando o consumidro remover um item do buffer, este notifica o produtor
Para o processo consumidor
O mesmo pode ser feito no sentido inverso
Na prxima insero de dados pelo produtor, este notifica o consumidor

Como implementar a soluo?


Via IPC, tal como semforos.
Construo deve ser cuidadosa
Soluo inadequada pode acarretar em deadlock
Ambos processos aguardando notificao

Produtor / Consumidor
Proposta de soluo
A partir do uso de semforos
Implementao de excluso mtua
Semforos cheio e vazio
cheio conta os espaos utilizados
Se cheio igual a zero, ento o consumidor deve ser bloqueado
vazio conta os espaos no utilizados no buffer
Se vazio igual a zero, ento o produtor deve ser bloqueado

Produtor / Consumidor
int buffer[TAM_BUFFER];
sem_t cheio, vazio;

void produtor(void *) {
while (true) {
item = produceItem();
sem_wait(&vazio);
putItemIntoBuffer(item);
sem_post(&cheio);
}
}
int main(){
pthread_t prod, cons;
sem_init(&cheio, 0, ?);
sem_init(&vazio, 0, ?);

void consumidor(void *) {
while (true) {
sem_wait(&cheio);
item = removeItemFromBuffer();
sem_post(&vazio);
consumeItem(item);
}
}

pthread_create(&prod, NULL, produtor, NULL);


pthread_create(&cons, NULL, consumidor, NULL);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
}

Produtor / Consumidor
int buffer[TAM_BUFFER];
sem_t cheio, vazio;
void consumidor(void *) {
void produtor(void *) {
while (true) {
while (true) {
sem_wait(&cheio);
item = produceItem();
item = removeItemFromBuffer();
sem_wait(&vazio);
sem_post(&vazio);
putItemIntoBuffer(item);
consumeItem(item);
sem_post(&cheio);
}
}
}
}
int main(){
pthread_t prod, cons;
sem_init(&cheio, 0, 0);
sem_init(&vazio, 0, TAM_BUFFER);
pthread_create(&prod, NULL, produtor, NULL);
pthread_create(&cons, NULL, consumidor, NULL);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
}

Sumrio
Produtor / consumidor
O jantar dos filsofos
O barbeiro sonolento

O jantar dos filsofos

Jantar dos Filsofos


Defino do problema
H cinco filsofos em torno de uma mesa.
Um garfo colocado entre cada filsofo.
Cada filsofo deve, alternadamente, refletir e comer.
Para que um filsofo coma, ele deve possuir dois garfos
Os dois garfos devem ser aqueles logo a sua esquerda e a sua direita

Para pegar um garfo


Somente pode ser pego por um filsofo
Somente pode ser pego no estiver em uso por nenhum outro filsofo

Aps comer, o filsofo deve liberar o garfo que utilizou

Um filsofo pode segurar o garfo da sua direita ou o da sua esquerda assim que

estiverem disponveis
Mas, s pode comear a comer quando ambos estiverem sob sua posse

Jantar dos Filsofos Soluo 1

Soluo funciona bem?

Jantar dos Filsofos Soluo 1

No, pois pode ocorrer deadlock Como?

Jantar dos Filsofos Soluo 2


Proposta de soluo
E se aps pegar pegarmos um garfo e no conseguimos pegar o

outro devolvssemos mesa o primeiro garfo e esperssemos


um tempo fixo?

Jantar dos Filsofos Soluo 2


Proposta de soluo
E se aps pegar pegarmos um garfo e no conseguimos pegar o

outro devolvssemos mesa o primeiro garfo e esperssemos


um tempo fixo?
Soluo propensa a starvation

Jantar dos Filsofos Soluo 3


Proposta de soluo
E se aps pegar pegarmos um garfo e no conseguimos pegar o

outro devolvssemos mesa o primeiro garfo e esperssemos


um tempo, mas agora ALEATRIO?

Jantar dos Filsofos Soluo 3


Proposta de soluo
E se aps pegar pegarmos um garfo e no conseguimos pegar o outro

devolvssemos mesa o primeiro garfo e esperssemos um tempo,


mas agora ALEATRIO?
Funcionaria algumas vezes, mas nem sempre
Essas soluo usada em rede local Ethernet quando da coliso de pacotes;
Assim sendo, a soluo vlida para alguns caso, mas e se

precisssemos de uma soluo que funcionasse corretamente sempre?

Jantar dos Filsofos Soluo 4


Proposta de soluo
Usando semforos
Aps a estgio de pensamento tem-se
Ou a captura dos recursos necessrio para comer
Ou o aguarde de uma notificao de que est apto a comer

Jantar dos Filsofos Soluo 4

Jantar dos Filsofos Soluo 4

Uma soluo para o problema do jantar dos filsofos (parte 2)

Sumrio
Produtor / consumidor
O jantar dos filsofos
O barbeiro sonolento

O barbeiro sonolento

O barbeiro sonolento
Descrio do problema

A analogia de uma barbearia com um barbeiro.


A barbearia possuir
Uma cadeira para corte de cabelo
Uma sala de espera com um nmero determinado de cadeiras
Quando o barbeiro finaliza o corte de cabelo de um cliente
Ele libera o cliente e vai at a sala de espera para ver se h algum cliente esperando
Se h algum cliente esperando, ele trs consigo um dos clientes corta o seu cabelo
Se no h clientes esperando ento ele volta para a cadeira de corte para dormir
Quando um cliente chega barbearia
O cliente olha o que o barbeiro est fazendo.
Se o barbeiro estiver dormindo, ele o acorda e senta na cadeira.
Se o barbeiro estiver trabalhando ento o cliente vai para a sala de espera
Se houver uma cadeira livre na sala de espera ento ele senta e aguarda sua vez
Se no houver cadeira livre na sala de espera ento o cliente vai embora.

O barbeiro sonolento
O problema
Como programar o barbeiro e o(s) cliente(s) para no entrarem

em uma situao de corrida


Situao similar a ambientes que trabalham com fila
Exemplo: Helpdesks para clientes cujo atendimento enfileirado por um
sistema centralizador de espera em uma fila de vagas limitadas

O Barbeiro Sonolento

O barbeiro sonolento
Soluo proposta
Usa trs semforos
Customer: Contabiliza e limita o nmero de clientes em espera
Waiting: Essencialmente uma cpia de customer
Barber: Contabiliza o nmero de barbeiros dormindo
Mutex: usado para acesso regio crtica

O Barbeiro Sonolento

Você também pode gostar