Sistemas Operacionais
Programao ConcorrenteProblemas clssicos
Edson [email protected]
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 / Consumidorint buffer[TAM_BUFFER];
sem_t cheio, vazio;
void produtor(void *) {
while (true) {
item = produceItem();
sem_wait(&vazio);
putItemIntoBuffer(item);
sem_post(&cheio);
}
}
void consumidor(void *) {
while (true) {
sem_wait(&cheio);
item = removeItemFromBuffer();
sem_post(&vazio);
consumeItem(item);
}
}
int main(){
pthread_t prod, cons;
sem_init(&cheio, 0, ?);
sem_init(&vazio, 0, ?);
pthread_create(&prod, NULL, produtor, NULL);
pthread_create(&cons, NULL, consumidor, NULL);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
}
Produtor / Consumidorint buffer[TAM_BUFFER];
sem_t cheio, vazio;
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);
}
void produtor(void *) {
while (true) {
item = produceItem();
sem_wait(&vazio);
putItemIntoBuffer(item);
sem_post(&cheio);
}
}
void consumidor(void *) {
while (true) {
sem_wait(&cheio);
item = removeItemFromBuffer();
sem_post(&vazio);
consumeItem(item);
}
}
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
Soluo funciona bem?
Jantar dos Filsofos Soluo 1
No, pois pode ocorrer deadlock Como?
Jantar dos Filsofos Soluo 1
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 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, 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 3
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
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
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
O Barbeiro Sonolento