Escolar Documentos
Profissional Documentos
Cultura Documentos
Cristianne Rodrigues Santos Dutra1 Fernanda de Ftima Pereira2 PUC Minas So Gabriel Engenharia de Computao Sistemas Distribudos 1 {cristianne.dutra@yahoo.com.br} 2 {nanda.fatima@gmail.com}
1. Introduo
Um sistema distribudo um sistema que interliga vrios ns de processamento de maneira que um processo de grande consumo seja executado no n "mais disponvel" ou subdividido por vrios ns. Conseguindose, portanto, ganhos elevados, pois uma tarefa qualquer, se dividida em vrias subtarefas, pode ser realizada em paralelo.
time_fim = (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; onde: tv_sec retorna o tempo em segundos; tv_usec retorna o tempo em milissegundos.
2. Objetivo
O objetivo deste trabalho implementar a aproximao do clculo do pelo mtodo de Monte Carlo utilizando a linguagem C. Tambm ser realizada uma comparao e uma anlise crtica do tempo de execuo utilizando um algoritmo seqencial e um algoritmo distribudo.
O clculo do tempo de execuo obtido a partir da diferena entre time_fim e time_incio. A implementao do clculo do mostrada a seguir: for (i = 0; i < PontosTotal; i++) { x = (double)rand()/RAND_MAX; y = (double)rand()/RAND_MAX; double result = (x*x)+(y*y); if (result < 1) { PontosDentro++; } } double resultado = PontosDentro/PontosTotal; pi = resultado * 4.0;
(double)
A varivel PontosDentro guarda a quantidade de pontos dentro do crculo de raio unitrio. Os nmeros aleatrios entre 0 e 1 foram gerados a partir da funo rand(). O tipo escolhido para representar o nmero de pontos foi o long int. Segundo o padro ANSI C, esse tipo de dados possui 4 bytes de tamanho e seu limite mximo de valores 231 . Em nossa simulao foram utilizados valores em potncia de 10, assim conseguimos simular o calculo do com at 109 pontos, pois a partir desse no mais possvel representar a quantidade de pontos utilizando o tipo long int.
O programa foi implementado no sistema operacional Ubuntu verso 9.10. Para sua execuo necessrio seguir os passos abaixo: Para compilao do programa: gcc Pi_Sequencial.c -o Pi_Sequencial Para execuo do programa: ./Pi_Sequencial
Analisando o grfico 01 podemos perceber que o tempo de execuo aumenta medida que a quantidade de pontos cresce. Esse resultado esperado, pois quanto maior a quantidade de pontos, mais valores aleatrios so gerados, mais clculos e mais comparaes so realizadas.
O algoritmo do clculo do distribudo foi implementado atravs de um processo servidor e processos clientes. Ao executar o programa necessrio informar para o processo servidor a quantidade de pontos que sero utilizados para o clculo do e a quantidade de processos clientes que iro efetuar o clculo. O processo servidor define a quantidade de pontos que cada processo cliente ir calcular de acordo com a quantidade de processos clientes selecionados. Para cada processo cliente, o processo servidor abre uma conexo. A conexo foi realizada de acordo com o algoritmo visto em sala de aula. A nica diferena foi a criao de um vetor de inteiros (new_socket[])para armzenar o retorno da funo accept, pois foi necessrio criar uma conexo para cada cliente, como pode ser visto abaixo. for (i=0; i< num_clientes; i++) { new_socket[i] = accept(create_socket, sockaddr*) & addrserver, &addrlen); if(new_socket[i] < 0) { printf("ERRO no accept... \n"); exit(0); } else { //Cria as threads PontosDentro_Cliente[i] = i; pthread_create(&p_threads[i], NULL, Conectar_Cliente, (void *) &PontosDentro_Cliente[i]); } } Aps a criao da conexo o processo servidor fica esperando que os clientes se conectem a ele. Para cada cliente conectado, o servidor cria uma thread.
(struct
pthread_create(&p_threads[i], NULL, Conectar_Cliente, (void *) &PontosDentro_Cliente[i]); Cada thread criada vai executar Conectar_Cliente( ) mostrada a seguir: void *Conectar_Cliente (void *s) { idcliente = (int *) s; cliente = *idcliente; // Envia a mensagem (Numero de pontos) para o cliente send(new_socket[cliente], buffer_send, buffersize, 0); // Recebe a mensagem (Numero de pontos dentro) do cliente recv(new_socket[cliente], buffer_recv, buffersize, 0); // Imprime a mensagem que foi recebida pelo cliente printf("Mensagem recebida do cliente: %s\n", buffer_recv ); a funo
O clculo do tempo de execuo do programa idntico ao clculo do programa seqencial. Vale ressaltar que para no haver atrasos no clculo do tempo, cada cliente cria sua conexo (antes do servidor criar a conexo dele) e verifica se a conexo com o servidor possvel. Quando a conexo com o servidor estabelecida, o cliente recebe a quantidade de pontos, calcula os pontos que esto dentro do crculo unitrio e envia a resposta para o servidor.
sscanf(buffer_recv, "%d", &Resposta_Cliente[cliente]); // converte a string para inteiro // Soma a quantidade de pontos calculada PontosDentro +=Resposta_Cliente[cliente]; // Fecha o socket close(new_socket[cliente]); close(create_socket); pthread_exit(0); } Nesta funo, o servidor atravs do comando send envia para o cliente a quantidade de pontos que ele ir processar, armazenado na varivel buffer_send. Cada processo cliente ir calcular a quantidade de pontos dentro do crculo de raio unitrio e retornar o valor para o processo servidor. O servidor ir receber o resultado de cada cliente conectado (armazenado em buffer_recv do comando recv), e armazenar a soma do valor de cada cliente na varivel PontosDentro. Cada thread, que responsvel por uma conexo, fechar a conexo e ser destruda pelo servidor atravs do comando pthread_join(p_threads[i], NULL); e em seguida, o servidor realizar o clculo do exibindo a resposta.
Grfico 03 Algoritmo Sequencial versus Processo distribudo com apenas um processo cliente.
O Grfico 02 mostra que a quantidade de ns clientes concetados ao servidor altera o tempo de execuo do programa. Quanto maior a quantidade de processos clientes, menor o tempo para o clculo do valor do .
5. Dificuldades Encontradas
De maneira geral, a implementao do trabalho ocorreu de forma tranqila. A dificuldade encontrada foi na conexo com os trs clientes, pois a princpio no sabamos que era necessrio realizar trs accept, criando para isso um vetor que armazena o resultado dos trs accept. Nos testes, mantivemos a porta 7007, utilizada como exemplo em sala de aula, como padro para todas as conexes com os clientes. Outra dificuldade foi sincronizao do valor retornado por cada cliente com o clculo do finalizado pelo processo servidor, pois o servidor realizava o clculo antes que as threads retornassem o valor, assim o resultado ficava incorreto, pois ele era feito com a quantidade de pontos encontrados apenas por alguns dos clientes.
Logo, atravs dos experimentos conclumos que a abordagem distribuda uma ferramenta valiosa para aumentar o desempenho do tempo de execuo de programas.
7. Bibliografia
CRUZ, Adriano J. O; Tipos de Dados, Constantes e Variavis. Disponvel em: < http://equipe.nce.ufrj.br/adriano/c/apostila/tipos.htm> Acesso em 21 de set. 2011 C Plus Plus - Documentao C/C++. Disponvel em: < http://www.cplusplus.com/ > Acesso em 20 de set. 2011.