O Produtor e o Consumidor

Este artigo tem por finalidade apresentar um problema clássico em sistemas operacionais, a relação "o produtor e o consumidor", que visa por em prática a gerência de processos concorrentes em um sistema operacional. Problema: um processo escreve em um buffer limitado, enquanto outro lê e limpa o mesmo, preservando a integridade dos dados.

[ Hits: 95.308 ]

Por: Ricardo Bocchi em 27/01/2010 | Blog: http://ricardobocchi.blogspot.com/


O problema, uma breve introdução



Não é possível descrever o problema sem antes haver uma breve explicação sobre programação concorrente. Diferentemente da programação sequencial, a que estamos habituados a programar, programação concorrente tem por base a separação de processos dentro um mesmo programa, através de threads ou de novos processos (fork) para otimização do processamento.

Algumas vantagens da programação concorrente são:
  • Até mesmo com um único núcleo de processador, pode-se otimizar processos de E/S, pois uma parte do programa não precisará esperar o disco responder para continuar executando;
  • Pode-se ter uma visão mais clara de certas etapas dos programas;
  • Quando se trata de um computador com mais de um núcleo de processador, o programa tira proveito de todos os núcleos;
  • Dependendo da programação, erros "fatais" podem afetar apenas seu processo, preservando a integridade dos demais.

Agora algumas desvantagens:
  • Maior complexidade na programação e na depuração de erros;
  • Erros podem depender de certo "alinhamento" ou certa sequência de eventos entre os processos, se usar a frase "esse processo nunca vai chegar antes", pode acreditar que ele vai chegar;
  • Atenção redobrada com áreas críticas do programa (variáveis compartilhadas).

A comunicação é feita através de áreas de memórias compartilhadas, ou através de troca de mensagens. Neste artigo abordaremos os dois métodos. Teremos áreas de memória compartilhadas entre os processos e teremos mensagens entre eles, para tirá-los de modo de espera quando necessário.

Vamos ao problema:

Chamado de Produtor e o Consumidor (também conhecido como o problema do buffer limitado), consiste em um conjunto de processos que compartilham um mesmo buffer. Os processos chamados produtores põem informação no buffer. Os processos chamados consumidores retiram informação deste buffer.

Esse é um problema clássico em sistemas operacionais, que busca exemplificar de forma clara, situações de impasses que ocorrem no gerenciamento de processos de um sistema operacional. Para quem está iniciando na programação, esse problema se torna complexo, pois trabalhar com programação concorrente nem sempre é tão simples. Como sabemos, precisamos nos preocupar com acessos ilegais a certos recursos que são compartilhados entre os processos, e manter sincronismo entre os mesmos.

Para controlarmos o acesso a essas variáveis e termos sincronismo nas operações, vamos utilizar semáforos. Em ciência da computação, semáforo é uma variável especial protegida (ou tipo abstrato de dados) que tem como função o controle de acesso a recursos compartilhados (por exemplo, um espaço de armazenamento) num ambiente multitarefa. Com as variáveis do tipo pthread_mutex_t da biblioteca pthreads - Posix, podemos controlar esses dados com toda segurança. Outro controle importante é a demanda de processamento, espera ociosa, que o programa irá gerar, pois quando um processo não está liberado para gravar ou ler, deve entrar em estado de espera para não consumir processamento de graça, e deve ser avisado quando pode voltar a processar.

Problemas:

O produtor insere em posição: Ainda não consumida

O consumidor remove de posição: Já foi consumida

Espera ociosa X Escalonamento do processo X Uso CPU

Solução:

Exclusão mutua (semáforos)

Fim da espera ociosa:
   Dormir (dow) /acordar (up) X Semáforos full/empty
   Mutex (Mutual exclusion)

    Próxima página

Páginas do artigo
   1. O problema, uma breve introdução
   2. A solução, uma breve introdução
   3. Lógica e estruturação da solução - o produtor
   4. Lógica e estruturação da solução - o consumidor
   5. Código comentado na íntegra
   6. Compilação e execução
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Desenvolvendo um plugin de visualização para o XMMS (Parte 1)

Bug afeta todas as distros

Estudando recursividade direta e indireta

Algum humor e C++ Design Patterns (parte 1)

A mágica do polimorfismo e seus conceitos na ótica de C/C++

  
Comentários
[1] Comentário enviado por pink em 29/01/2010 - 12:51h

Ótimo, meus parabéns.... sem comentários....
Aguardo pelo próximo artigo....

[2] Comentário enviado por saitam em 15/05/2010 - 16:54h

Ótimo artigo bem didático. Parabéns
Aguardo pelo próximo artigo [2]

[3] Comentário enviado por Claudinei_Jr em 03/04/2013 - 18:06h

Ótimo Artigo, super didático!
Parabéns!
Contribuiu muito com minhas pesquisas sobre o assunto!!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts