Usando Semaforo

Post on 05-Nov-2015

229 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Este artigo resolve problema do jantar dos filósofos usando semáforo

Transcript

  • Sistemas Operacionais

    Programao ConcorrenteProblemas clssicos

    Edson Morenoedson.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 / 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

top related