Modelo de Processo Todos os computadores modernos sao capazes de realizar varias coisas ao mesmo tempo. Enquanto executa um programa, pode ler dados do disco, mostrar texto na tela e enviar dados para a impressora. Em sistemas multiprogramados, a CPU fica saltando de um programa para o outro, a todo o momento, dando a impressao que varios programas estao sendo executados ao mesmo tempo, ou seja, um paralelismo de processamento. Ao longo dos anos, os projetista de SO vem desenvolvendo um conceito de sequenciamento de processos. Onde varios processos sao executados sequencialmente. Um processo pode ser um programa em execucao, acompanhado sempre de valores atuais do contador de programa, de valores dos registradores e das suas variaveis. Paca cada processo, pode-se dizer que possui uma CPU virtual. E claro, que na realidade isto nao acontece. O que acontece e a alternancia rapida da CPU que neste caso e chamado de Multiprogramacao. Deste modo nao existe um tempo predefinido que um processo ira ser executado pela CPU, devido a alternancia. Muitas pessoas confundem os conceitos de processos e programas. Tendo em vista que o programa e como uma receita de bolo, um algoritmo. E o processo e a atividade realizada pelo programa. Codificacao Este problema, chamado de Produtor-Consumidor (tambem conhecido como o problema do buffer limitado), consiste em um conjunto de processos que compartilham um mesmo buffer. Os processos chamados produtores poem informacao no buffer. Os processos chamados consumidores retiram informacao deste buffer. O mecanismo de comunicacao entre processos utilizado foi a criacao de uma pipe, a qual permite que um ou mais processos troquem informacoes entre si. O comando utilizado para a criacao de novos processos foi fork(), que cria um processo filho retornado 0 e um processo pai retornando seu PID (Process ID).O codigo do programa implementado pode ser visto abaixo.#include <stdio.h>#include <string.h>#include <unistd.h>#include <math.h> #define CONSUMIR 0#define ESCREVER 1 char* phrase="a"; //caracter a ser colocado no buffer void main(){ int fd[2], bytesRead, prod, consum, i, j, tipo, int_rand, cont;float rand; char message[100]; printf("Entre com o numero de produtores:\n");scanf("%d",&prod); printf("Entre com o numero de consumidores:\n");scanf("%d",&consum); pipe(fd); do{ for(i=0; i<prod; i++){ if(fork()==0){ close(fd[CONSUMIR]); // Fecha a ponta nao usada //Processo produtor produz 50 itens for(j=0; j<50; j++){ write(fd[ESCREVER],phrase,strlen(phrase)); printf("Item produzido por %d (%d produzido pelo processo).\n",getpid(),j+1); sleep(1); //Dorme ao fim de cada producao por 1 segundo } break; //Ao termino da producao, pula pra fora do laco que de criacao de produtores close(fd[ESCREVER]); } } if(i!=prod) break; //Se nao for o primeiro pai, pula pro fim do programa for(i=0; i<consum; i++){ if(fork()==0){ close(fd[ESCREVER]); // Fecha a ponta nao usada cont=1; // Contador de itens consumidos pelo processo //Processo consome itens while(1){ bytesRead=read(fd[CONSUMIR], message, 1); if(bytesRead>0){ printf("Lido %d item por %d (%d lido pelo processo): %s\n",bytesRead, getpid(), cont, message); cont++; }else printf("Nao ha nada para ler."); rand=0.0001*random(); int_rand=rand; usleep(int_rand); //Processo dorme por um tempo aleatorio ao fim de um consumo } break; close(fd[CONSUMIR]); } } //Processo pai produz algo antes de terminar write(fd[ESCREVER],phrase,strlen(phrase)); printf("Item produzido por pai com pid %d.\n",getpid()); }while(0); } O programa inicia perguntando ao usuario o numero de produtores e