Aluno: Thiago Antnio da Boa Viagem Lima Professor: Joubert Lima Disciplina: Sistemas Distribudos
Ouro Preto, 31 de Outubro de 2013 Introduo O presente trabalho tem como objetivo usar a tcnica de programao do produtor consumidor para calcular strings com um formato pr-definido. O trabalho tambm testado quanto ao numero de threads assim como o consumo de memoria. Os grficos apresentam os resultados.
Desenvolvimento
1. O problema
O problema a ser tratado o calculo de uma string. A String segue o formato abaixo:
Num; Num; Num; Op
Num pode assumir qualquer algarismo entre 1 e 9, e Op uma operao que pode ser de somar, subtrair ou multiplicar. Desta forma os nmeros sero clculos entre se de acordo com o operador Op. Os arquivo de teste foram gerados com string de forma aleatria e automtica, por isso o cdigo dentro do consumidor para tratar as Strings e calcula-las no to complexo, pois tem-se a certeza de que no existe Strings que saiam do formato padro.
2. Soluo
Como soluo foi utilizado o produtor consumidor, o mesmo funciona de forma paralela. A implementao deste, neste trabalho segue 3 linhas: o produtor, o recurso e o consumidor. O recurso disputado pelo produtor que deseja armazenar algo produzido em recurso e pelo consumidor que deseja consumir algo produzido armazenado em recurso. Deste modo, a programao paralela atravs do uso de threads se faz necessria. Pois dependendo do processamento a ser feito o tempo requerido pode ser muito alto, ento se distribuirmos o processamento entre os vrios ncleos da maquina o tempo de processamento pode diminuir drasticamente.
3. Materiais envolvidos
Foi utilizada a linguagem Java, por possuir muitos algoritmos prontos e fceis de serem usados se comparados com a linguagem C++. A seguir uma abordagem top down da soluo.
Main
Um objeto da classe resource criado, pois ele ser o recurso disputado entre consumidor e produtor. Em seguida N objeto da classe producer e M objetos da classe consumer so criados e inicializados. Os objetos da classe producer so inicializados com o recurso e com um arquivo. Em sequencia as threads produtoras e consumidoras so inicializadas uma a uma, para dar inicio ao processo.
Producer Esta classe implementa o mtodo run da interface Runnable. Dentro deste mtodo o produtor busca a prxima linha do arquivo com o qual foi inicializado e coloca-a disponvel dentro de recurso como uma String. Consumer Consumer tambm implementa o mtodo run da interface Runnable. Deste modo o recurso analisado quanto sua disponibilidade, assim, se houver recursos a serem consumidos eles so retirados da lista de recursos e tratados. Outro mtodo disponvel na classe consumer o trataCalcs, este mtodo trata a String, separando os nmeros dos ponto e virgulas e calculando os nmeros de acordo com seus operandos. Resource Esta classe tem um atributo do tipo LinkedList, como este atributo compartilhado pelas threads do consumidor e produtor, as regies onde este atributo tratado so denominadas de criticas. Por este motivo s threads devem ter sincronismo para trabalhar com o mesmo, de forma que quando uma thread esteja alterando ou acessando este atributo, nenhuma outra thread pode ter acesso ao mesmo. Por outro lado se for constatado que no mais recursos a serem consumidos, as threads consumidoras so bloqueadas quanto ao acesso do recurso.
Figura 3.1 Funcionamento do produtor consumidor. 4. Experimentos Os experimentos foram feitos de modo a testar o runtime e o consumo de memoria, a maquina de teste possui 4GB de memoria e processador i5 com 4 ncleos. Tabela 4.1 Resultados experimentais do tempo de execuo e consumo de memoria
0 100000000 200000000 300000000 400000000 500000000 600000000 700000000 800000000 900000000 1E+09 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 RunTime(NanoSeg.) Concluso O grfico mostra um crescimento prximo ao linear, porm um crescimento aparentemente baixo. Isso mostra que apesar de o numero de threads do produtor ter dobrado ao longo do tempo, o runtime no dobrou junto com as mesmas. Porm os resultados so muito instveis, ao ponto que mesmo a maquina de teste ter apenas 4 ncleos, colocando 8 ou 16 threads o runtime no aumentou, pelo contrario, em alguns casos o mesmo diminuiu.