Top Banner

of 26

Usando Semaforo

Nov 05, 2015

Download

Documents

juniorway

Este artigo resolve problema do jantar dos filósofos usando semáforo
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
  • 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