next up previous
Next: Seu arsenal Up: ep1 Previous: ep1

O problema

Vocês devem implementar uma solução para um problema clássico de comunicação entre processos: o Problema do Produtor-Consumidor (também conhecido como o problema do bounded buffer). Trataremos aqui da versão mais simples desse problema, em que apenas dois processos compartilham um área de memória (buffer) comum, de tamanho fixo. Essa área de memória é empregada para se implementar uma fila com capacidade limitada (buffer circular).

Um dos dois processos, o produtor, coloca dados no fim da fila, enquanto que o outro -- o consumidor - retira dados do início da fila. Não é possível tecer hipóteses sobre a velocidade do trabalho desses processos, ou seja, é possível que o produtor tanto demore eternidades para produzir novos elementos quanto os produza instantaneamente. Idem para o consumidor, que pode passar períodos arbitrários entre retiradas de elementos da fila.

Problemas aparecem quando o produtor deseja adicionar um elemento à fila, e esta já se encontra lotada. Nesta situação desejamos que o produtor fique algum tempo sem processar, esperando que apareça algum lugar livre no buffer circular. Similarmente, se o consumidor quer retirar um item da fila e a encontra vazia, ele deve aguardar até que o produtor enfileire algum elemento.

O pseudo-código a seguir mostra o comportamento dos dois processos.


        #define TAM_BUFFER 100

        /*---- memória compartilhada entre os processos produtor e consumidor -------*/
        int n = 0;              /* comprimento atual da fila */
        ...                     /* outras variáveis da implementação da fila */
    
        /*------------------- processo produtor -------------------------------------*/
        int item;
    
        for ( ; ; ) {
            produz_item(&item);
            if (n == TAM_BUFFER) {
                /* buffer lotado */
                espera_sinal_de_nao_lotado();
            }
            enfileira_item(item);
            /* atualiza variavel compartilhada */
            n++;
            if (n == 1) { 
                /* estava vazio o buffer ... */
                manda_sinal_de_nao_vazio();
            }
        }
    
        /*------------------- processo consumidor -----------------------------------*/
        int item;
    
        for ( ; ; ) {
            if (n == 0) {
                /* buffer vazio */
                espera_sinal_de_nao_vazio();
            }
            desenfileira_item(&item);
            n--;
            if (n == TAM_BUFFER - 1) {
                /* estava lotado até agora */
                manda_sinal_de_nao_lotado();
            }
            consome_item(item);
        }


next up previous
Next: Seu arsenal Up: ep1 Previous: ep1
Francisco Reverbel
2001-03-26