Vous êtes sur la page 1sur 7

Soluo para o Problema do Produtor-Consumidor

Ricardo Mendes do Nascimento Universidade Regional Integrada do Alto Uruguai e das Misses (URI) Santo ngelo RS Brasil

ricna.net@hotmail.com

Resumo. Este artigo tem como objetivo apresentar a soluo implementada para o problema produtor-consumidor. Sero explicados sucintamente, e conforme surgir necessidade, aqueles conceitos essncias para a compreenso da soluo apresentada no artigo.

1. Introduo ao Problema
Produtor Consumidor um problema clssico em Sistemas Operacionais que busca exemplificar de forma clara situaes de impasses que ocorrem no gerenciamento de processos de um SO, e a soluo para estes. Partindo do principio de que cada processo executado em um SO tem a possibilidade de utilizar determinados recursos oferecidos, e que quando um recurso R est sendo utilizado por um processo P nenhum outro processo poder utilizar este mesmo recurso, encontramos um problema no momento em que um processo Z tenta utilizar o recurso R que j est em uso. O sistema operacional dever ter a capacidade de identificar est situao e no permitir que o processo Z tenha permisso de acesso ao recurso R, pois est ao acarretaria em conseqncias indesejveis. Por outro lado o processo Z precisa acessar o recurso R para que possa continuar, este impasse o leva a um estado de espera ociosa. A espera ociosa no desejvel, pois faz com que o processo Z continue em execuo atravs de um lao ocioso, consumindo processamento e sendo escalonado (escolhido) pelo SO, at que consiga utilizar o recurso R e continuar sua execuo normalmente. Cada vez que o processo Z escalonado, ele tenta utilizar o recurso R, e se no consegue consome o tempo e processamento do CPU no seu lao ocioso. O problema do Produtor-Consumidor apresenta justamente de forma exemplificada esta situao como base para estudo de diferentes solues. Neste problema podemos de forma anloga imaginar um armazm, com capacidade para N fardos de alfafa, e dois indivduos: o Produtor, que produz fardos e os coloca no armazm, e o Consumidor que retira os fardos do armazm e em seguida os consome (deve ser um cavalo). Sendo o armazm um recurso, e os indivduos processos que
Trabalho de Sistemas Operacionais I 30/05/2007. Ricardo Mendes do Nascimento 1/7

disputam o mesmo recurso, temos a possibilidade de desenvolver algoritmos para resolver o problema deles, j que eles nunca podero se encontrar dentro do armazm. Existem diversas solues para este problema, algumas eficientes, outras um pouco duvidosas ou instveis, porm todas so interessantes e merecedoras de anlise quando se busca solucionar este problema.

2. Solucionado o Problema com Semforos


Para solucionar o problema do Produtor-Consumidor, optei por utilizar uma soluo semelhante apresentada por Tanenbaum no livro Sistemas Operacionais Modernos. Aps explicar todos os conceitos necessrios, e outras solues para o mesmo problema, Tanembaum apresenta uma soluo utilizando os semforos propostos por Dijkstra. O algoritmo, apresentado em ANSI C, foi a base para a implementao do software e soluo do problema. 2.1. Fim da espera ociosa Nesta soluo eliminado problema de espera ociosa, descrito anteriormente. Atravs do conceito de dormir e acordar garante-se que nunca um processo ficar consumindo processamento toa, ou seja, se quiser utilizar um recurso e no conseguir este processo ir dormir, e s ser acordado quando o recurso que ele deseja utilizar ficar disponvel novamente. Este controle adquirido atravs das operaes down e up, que so executadas pelos processos e alteram o valor do semforo binrio responsvel pelo recurso em questo. No nosso caso precisamos de trs semforos, sendo que dois deles so semforos contadores e o terceiro um semforo binrio.

2.2. Semforos Contadores Semforos so variveis do tipo inteiro que podem assumir valores maiores ou iguais a zero. Um semforo contador representa simplesmente a alocao de determinado recurso, fornecendo a estes uma maneira de conversao que os possibilita sincronizar suas atividades. Os semforos full e empty tm o mesmo propsito, de controlar a sincronizao entre os processos. So eles que garantem que o Produtor no ir produzir quando o buffer estiver cheio e que o Consumidor no ir consumir quando o buffer estiver vazio. Especificamente o semforo full utilizado como um semforo contador que guarda o nmero de caixas ocupadas com fardos no armazm. Alm disso, ele responsvel por colocar o Consumidor para dormir, quando este executar a operao down (tambm proposta por Dijkstra). A operao down consiste somente em decrementar um semforo qualquer (binrio ou contador). O processo que executar esta operao ir verificar o valor do semforo no qual quer aplicar o down. Se o valor do semforo for maior que zero, o processo ir
Trabalho de Sistemas Operacionais I 30/05/2007. Ricardo Mendes do Nascimento 2/7

decrement-lo, caso contrrio este processo ir dormir at que seja acordado por outro processo que execute a operao up no mesmo semforo. Tendo empty o mesmo propsito essencial do full, obviamente este ser responsvel por contar o nmero de caixas desocupadas no armazm , e conseqentemente colocar o Produtor para dormir at que o Consumidor execute a operao up neste semforo. Na operao up o processo incrementa o semforo e verifica se existe outro processo dormindo neste semforo, se existir ele ser acordado. 2.3. O Semforo Binrio A capacidade do sistema operacional de garantir que somente um processo possa utilizar determinado recurso em determinado instante de tempo denominada excluso mtua. Logo, o correto gerenciamento da excluso mtua garante que nunca dois processos estaro em regies crticas (considerada parte do processo que acessa um recurso, ou o prprio recurso) conflitantes. O mutex (mutual exclusion) simplesmente o semforo responsvel pela gerncia da excluso mtua entre os processos em nesta soluo. Este tipo de semforo conhecido tambm por semforo binrio, que faz nada mais nada menos que avisar para os processos se determinado recurso j est sendo utilizado. Ele dever ser inicializado com o valor 1 (um), informando que nenhum processo esta utilizando o recurso que este semforo esta gerenciando. Quando um processo executar um down neste semforo, o seu valor ser alterado para 0 (zero), informando que existe um processo utilizando o recurso (ou est em sua regio crtica). Quando o processo sair da regio crtica o valor ser novamente incrementado atravs da operao up e o recurso estar disponvel para outro processo.

3. Implementao
A implementao foi feita com a linguagem Java atravs da IDE Netbeans. Buscando utilizar os recursos da orientao a objeto sem descaracterizar a soluo clssica utilizando semforos, foram criados atributos de classes com os mesmos nomes dos semforos clssicos: full, empty e mutex Os semforos contadores foram colocados como atributos de uma classe denominada Armazm e o semforo binrio na classe Sistema, que simboliza o SO, responsvel pela gerncia da excluso mtua e escalonamento. A classe Armazm simboliza o buffer limitado, o recurso que ser utilizado pelos processos representados pelas instncias das classes: Produtor e Consumidor. Tanto Produtor como Consumidor so compostos em determinados instantes de tempo por um objeto Fardo, que tambm compe o Armazm. No diagrama de classes abaixo possvel visualizar de forma clara a estrutura do software, j incluindo a classe responsvel pela visualizao dos atributos da classe Sistema, que simboliza o SO.

Trabalho de Sistemas Operacionais I 30/05/2007. Ricardo Mendes do Nascimento

3/7

Figura 1. Diagrama de Classes Simplificado

3.1. Classe Armazm Optou-se por colocar nesta classe os mtodos que representam as operaes down e up nos semforos contadores que tambm encontram-se nesta classe, como mostra a figura abaixo. No algoritmo ANSI C, a funo down receberia o endereo do semforo em questo, que por sua vez seria uma varivel global. Nesta soluo em Java foi dada a classe Armazm a responsabilidade de controlar estes semforos.

Figura 2. Classe Armazem

Esta figura mostra todos atributos e mtodos da classe armazm, assim podemos ver a relao com a classe Fardo atravs do vetor fardo, e os mtodos down_full, up_full, down_empty e up_empty que garantem a sincronizao entre os processos.
Trabalho de Sistemas Operacionais I 30/05/2007. Ricardo Mendes do Nascimento 4/7

3.2. Classe Sistema Aqui podemos ver a classe principal do software. Nela so escalonados os processos atravs do mtodo escalona e controlada a excluso mtua atravs do atributo (semforo) mutex. O mtodo roda deveria disparar um loop infinito que executaria incessantemente o mtodo interrompe que conforme o resultado dispararia o escalonador, atravs do mtodo escalona. Porm como foi criada uma interface grfica para visualizao dos dados, optou-se por deixar o loop infinito na interface grfica, que chama o mtodo Sistema.roda() aps cada atualizao grfica, conservando desta maneira a independncia da classe Sistema em relao a interface grfica.

Figura 3. Classe Sistema

3.3. Classes: Produtor e Consumidor A classe Produtor possui atributos para controlar todas aes executadas pela instncia criada durante a execuo do software, entre elas: quantidade de vezes que foi escalonado, que foi interrompido durante a execuo, que produziu fardos para estocar, que estocou fardos no armazm e que teve que ficar dormindo. Alm disso possui uma seqncia de passos definidos pelas constates que assumem valores de 1 a 6. Cada passo que executa atravs do mtodo anda alterado o valor do atributo proximo_passo, que guarda o local onde este dever recomear sua execuo na prxima vez que for escalonado ou continuar caso no seja interrompido pelo SO. Os passos so exatamente os mesmos apresentados no livro de Tanembaum. O passo ENTRAR_NO_ARMAZEM executa o down no mutex e conseqentemente SAIR_DO_ARMAZEM executa o up no mutex. Nesses dois passos o atributo
Trabalho de Sistemas Operacionais I 30/05/2007. Ricardo Mendes do Nascimento 5/7

enter_region do produtor alterado, simbolizando sua entrada na regio crtica e sua sada da mesma. De forma extremamente similar, embora com algumas funcionalidades inversas, foi implementada a classe Consumidor, logo sua apresentao no necessria de forma individual. Ambas possuem tambm um atributo armazm que objetiva o acesso regio crtica dos processos. Todavia no possui o aspecto de agregao e sim de navegao entre estas classes, pois somente um objeto Armazm instanciado pelo objeto sistema instanciado pela classe Interface, e repassado por referncia para o objeto produtor e para o objeto consumidor que so atributos da classe Sistema. Isso agrega realismo ao software no que se refere ao gerenciamento da excluso, j que os dois podem acessar um mesmo objeto alocado na memria fsica em que o software estiver rodando, e se acessarem sem sincronismo o objeto armazm (que compartilhado entre eles) valores inconsistentes seriam gerados e obtidos pelos processos, acarretando numa viso poluda na interface grfica. J o atributo meu_fardo instanciado individualmente por cada um destes objetos. No caso do produtor no passo PRODUZIR_FARDO, e no caso do consumidor no passo PEGAR_FARDO. Este atributo tem o objetivo de simbolizar a existncia ou no de um item (Fardo) com o processo.

Figura 4. Classe Produtor e Classe Consumidor.

3.4. Outras classes

Trabalho de Sistemas Operacionais I 30/05/2007. Ricardo Mendes do Nascimento

6/7

A classe Fardo somente uma maneira de simbolizar um item, sem utilizar tipos de dados existentes. Esta classe no possui nenhum atributo ou mtodo. A classe Interface possu diversos atributos do pacote Swing com objetivo somente de mostrar os atributos do atributo sistema.

Figura 4. Classe Interface e Classe Fardo.

4. Consideraes Finais Atravs da implementao foi possvel verificar e validar a soluo clssica utilizando semforos. Nesta eliminado o problema da espera ociosa e eficientemente gerenciada a excluso mtua, alm de favorecer o desempenho do processamento atravs da sincronizao entre os processos. Durante a implementao surgiu incerteza em relao a qual varivel utilizar para manipulao dos ndices do buffer. Inicialmente foi utilizado o semforo full, mas desta forma no era possvel obter consistncia no processamento, j que os semforos contadores nesta soluo so alterados fora da regio crtica, permitindo que a soma de empty e full possa assumir valores de N-2 a N sendo N o tamanho do buffer. Aparentemente seria um erro na soluo, porm foi verificado que a funo destes semforos somente controlar a sincronizao entre os processos, fazendo-os dormir ou acordar quando preciso. Portanto necessrio utilizar uma outra varivel inteira para determinar qual ndice do buffer dever ser manipulado. Logo, atravs desta implementao foi possvel compreender a real funcionalidade dos semforos, e como, de maneira simples, possvel resolver problemas de extrema importncia computacional. 5. Referncia
Tanembaum, Andrew S. Sistemas operacionais modernos / Andrew S. Tanembaum ; traduo Ronaldo A.L. Gonalves, Lus A. Consularo; reviso tcnica Regina Borges de Arajo. 2 ed. So Paulo : Prentice Hall, 2003. Notas de aula de Sistemas Operacionais I - Prof. Dr. Brulio Mello.

Trabalho de Sistemas Operacionais I 30/05/2007. Ricardo Mendes do Nascimento

7/7

Vous aimerez peut-être aussi