Produtor consumidor

Disponível somente no TrabalhosFeitos
  • Páginas : 6 (1359 palavras )
  • Download(s) : 0
  • Publicado : 24 de novembro de 2011
Ler documento completo
Amostra do texto
Sumário
1. O problema do produtor consumidor 3
2. Soluções para o consumidor e produtor 3
2.1. Solução com Dormir e Acordar 4
2.2. Semáforos 6
2.3. Solução Produtor Consumidor com Semáforos 6
3. Bibliografia 9

O problema do produtor consumidor

O problema do produtor consumidor é um problema clássico de sincronização condicional. Sincronização condicional é uma situação emque o acesso ao recurso compartilhado exige a sincronização de processos vinculada a uma condição de acesso. Um recurso pode não se encontrar pronto para o uso devido a uma condição especifica. Nesse caso, o processo que deseja acessa-lo deverá permanecer bloqueado até que o recurso fique disponível.
No produtor consumidor existem dois processos que compartilham um buffer comum e que possui o seutamanho fixo. Um deles é o processo produtor, responsável por inserir dados nesse buffer e o outro é o consumidor, responsável por retirar esses dados do buffer e executar quaisquer que sejam os procedimentos para o processamento daquela informação.
O problema ocorre quando o processo produtor tenta inserir um dado em um buffer que já está cheio, ou quando o processo consumidor tenta ler dadosde um buffer vazio. Para ambas as situações é necessário utilizar mecanismos que controlem essas condições para o uso do recurso compartilhado e para coordenar o acesso concorrente a esse recurso.

Soluções para o consumidor e produtor

Ao longo dos anos alguns algoritmos que permitem a solução do problema do produtor consumidor foram desenvolvidos. Um deles é a solução de dormir e acordar, queutiliza a solução de espera ociosa, e a outra é a solução utilizando o conceito de semáforos.

1.
2.
Solução com Dormir e Acordar

A solução utilizando o conceito de dormir e acordar funciona de maneira que se coloca o processo produtor para dormir caso o buffer já esteja cheio e caso o buffer esteja vazio, coloca-se o processo consumidor para dormir.
Essa solução embora pareçasimples coloca alguns problemas de disputa. Para manter o controle de número de itens no buffer, será necessário utilizar uma variável, que nesse caso chamaremos de count.
Como o número máximo de itens que o buffer pode conter é N, o produtor deverá primeiro verificar se o valor da variável count é igual ao valor de N. N nesse caso é uma constante que define quantidade máxima de itens no buffer.Caso o valor de count seja igual a N, ele será posto para dormir, caso contrario ele adiciona um item no buffer e incrementa a variável count.
Já o consumidor ira trabalhar de maneira semelhante. Primeiro ele ira verificar se o valor de count é igual a 0. Caso seja verdadeiro, ele irá dormir, porém se for falso, e retira um item do buffer e decrementa a variável count.
Além dessas verificações osprocessos fazem mais uma verificação, que é verificar se o outro está dormindo. Caso isso seja verdadeiro é enviado um sinal para acordar o outro processo.
Os algoritmos do produtor e do consumidor seguem abaixo:

#define N 100 /* número de lugares no buffer */
Int count = 0; /* número de itens no buffer */

Void producer(void){
Int item;
While(TRUE){ /* repita parasempre */
Item = produce_item(); /* gera o próximo item */
If(count == N) sleep(); /* se o buffer estiver cheio, vá dormir */
Isert_item(item); /* ponha um item no buffer */
Count = count + 1; /* incremente o contador de itens do buffer */
If(count == 1) wakeup(consumer); /* o buffer estava vazio? */
}
}

Void consumer(void){Int item;
While(TRUE){ /* repita para sempre */
If(count == 0) sleep(); /* se o buffer estiver vazio vá dormir */
Item = remove_item(item); /* retire um item do buffer */
Count = count - 1; /* decresça o contador de itens do buffer */
If(count == N - 1) wakeup(producer); /* o buffer estava cheio? */
Consume_item(item);
}
}...
tracking img