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)
Código na íntegra para solucionar este problema:
http://www.vivaolinux.com.br/artigo/O-Produtor-e-o-Consumidor/?pagina=5
Leitor x Escritor
Outra situação que ocorre com freqüência em sistemas concorrentes é o problema dos leitores/escritores. Neste caso, um conjunto de processos ou threads acessam de forma concorrente uma área de memória comum (compartilhada), na qual podem fazer leituras ou escritas de valores. As leituras podem ser feitas simultaneamente, pois não interferem umas com as outras, mas as escritas têm de ser feitas com acesso exclusivo à área compartilhada, para evitar condições de disputa. No exemplo da figura abaixo, os leitores e escritores acessam de forma concorrente uma matriz de inteiros M.
O jantar dos filósofos
É um problema clássico de acesso a recursos limitados, inventado em 1971 por Edsger Dijkstra como questão de exame.
O problema consiste em: Cinco filósofos estão sentados à volta de uma mesa. Cada filósofo alterna entre os estados de pensar e comer esparguete. Existe uma grande travessa de esparguete no centro da mesa. Para comer, o filósofo usa dois garfos, colocados nos dois lados (5 pratos, 5 garfos). Cada garfo pode ser usado pelo filósofo vizinho. Quando o filósofo quiser comer, ele tem que emprestar os garfos. O bloqueio ocorre se cada filósofo pegar um garfo e ficar à espera que o vizinho do outro lado liberte o segundo garfo.
Applet com a solução: http://www.inf.ufrgs.br/gppd/disc/inf01008/trabalhos/sem99-1/filosofos/applet.htm
Fontes: http://www.fatecsbc.edu.br/Dowload/sistemasoperacionais/socap04.pdf
http://computacaonaweb.blogspot.com/2008_11_01_archive.html
Links Relacionados:
- http://ces33.wikidot.com/relas:alexandre