DANIEL CÂNDIDO DE OLIVEIRA IMPLEMENTAÇÃO DE APLICAÇÕES PARALELAS COM O PACOTE JPVM



Documentos relacionados
Entendendo como funciona o NAT

Desenvolvimento de um Cluster de Alto Desempenho com PVM

UNIVERSIDADE. Sistemas Distribuídos

Sistemas Operacionais

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Considerações no Projeto de Sistemas Cliente/Servidor

1

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

SISTEMAS DISTRIBUIDOS

Sistemas Distribuídos Capítulos 3 e 4 - Aula 4

Sistemas Distribuídos

Capítulo 7 CAMADA DE TRANSPORTE

Arquitetura de Rede de Computadores

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064

Arquitetura e Protocolos de Rede TCP/IP. Modelo Arquitetural

Sistemas Operacionais

Márcio Leandro Moraes Rodrigues. Frame Relay

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

Processos e Threads (partes I e II)

Introdução à Linguagem Java

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

SISTEMAS DISTRIBUÍDOS


4 Estrutura do Sistema Operacional Kernel

REDES DE COMPUTADORES Prof. Ricardo Rodrigues Barcelar

Arquitetura de Redes: Camadas de Protocolos (Parte I) Prof. Eduardo

SISTEMAS OPERACIONAIS

Redes de Comunicações Capítulo 6.1

Redes de Computadores II

REDES DE COMPUTADORES

GESTÃO DE SISTEMAS OPERACIONAIS II

Redes de Computadores

APLICAÇÃO REDE APLICAÇÃO APRESENTAÇÃO SESSÃO TRANSPORTE REDE LINK DE DADOS FÍSICA 1/5 PROTOCOLOS DE REDE

Entrar neste site/arquivo e estudar esse aplicativo Prof. Ricardo César de Carvalho

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

Capítulo 9 - Conjunto de Protocolos TCP/IP e Endereçamento. Associação dos Instrutores NetAcademy - Julho de Página

Rede de Computadores

REDE DE COMPUTADORES

Everson Scherrer Borges João Paulo de Brito Gonçalves

Notas da Aula 15 - Fundamentos de Sistemas Operacionais

MÓDULO 8 Modelo de Referência TCP/IP

MÓDULO 7 Modelo OSI. 7.1 Serviços Versus Protocolos

PARANÁ GOVERNO DO ESTADO

ALTERNATIVA PARA CONEXÃO VIA INTERNET DE IP MASCARADO A IP REAL

IMPLEMENTAÇÃO DE SOCKETS E THREADS NO DESENVOLVIMENTO DE SISTEMAS CLIENTE / SERVIDOR: UM ESTUDO EM VB.NET

Introdução ao Modelos de Duas Camadas Cliente Servidor

Capítulo 7 CAMADA DE TRANSPORTE

Redes de Computadores Modelo de referência TCP/IP. Prof. MSc. Hugo Souza

ICORLI. INSTALAÇÃO, CONFIGURAÇÃO e OPERAÇÃO EM REDES LOCAIS e INTERNET

Programação Concorrente Processos e Threads

Sistema Operacional Correção - Exercício de Revisão

PROJETO E IMPLANTAÇÃO DE INTRANETS

Arquiteturas de Rede. Prof. Leonardo Barreto Campos

5 Estudo de caso: utilizando o sistema para requisição de material

Profs. Deja e Andrei

Sistemas Operacionais. Prof. André Y. Kusumoto

Um pouco sobre Pacotes e sobre os protocolos de Transporte

Desenvolvendo para WEB

TRIBUNAL DE CONTAS DO DISTRITO FEDERAL

Processos (Threads,Virtualização e Migração de Código)

O modelo ISO/OSI (Tanenbaum,, 1.4.1)

3 SCS: Sistema de Componentes de Software

Protocolo TCP/IP. Neste caso cada computador da rede precisa de, pelo menos, dois parâmetros configurados:

UNIVERSIDADE FEDERAL DE SANTA CATARINA DEPARTAMENTO DE INFORMÁTICA E ESTÁTISTICA GRADUAÇÃO EM CIÊNCIAS DA COMPUTAÇÃO DISCIPLINA: COMUNICAÇÃO DE DADOS

Bancos de dados distribuídos Prof. Tiago Eugenio de Melo

Relatorio do trabalho pratico 2

FTIN Formação Técnica em Informática Módulo de Administração de Servidores de Rede AULA 02. Prof. Gabriel Silva

3 SERVIÇOS IP. 3.1 Serviços IP e alguns aspectos de segurança

Serviço de datagrama não confiável Endereçamento hierárquico. Facilidade de fragmentação e remontagem de pacotes

Protocolos de Redes Revisão para AV I

MANUAL DE IMPLANTAÇÃO SISTEMA DE INVENTÁRIO CACIC GOVERNO FEDERAL SOFTWARE PÚBLICO

SISTEMAS DISTRIBUÍDOS


Sistemas Operativos. Threads. 3º ano - ESI e IGE (2011/2012) Engenheiro Anilton Silva Fernandes (afernandes@unipiaget.cv)

MODELO CLIENTE SERVIDOR

Curso Tecnológico de Redes de Computadores 5º período Disciplina: Tecnologia WEB Professor: José Maurício S. Pinheiro V

O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware

10 DICAS DE TECNOLOGIA PARA AUMENTAR SUA PRODUTIVIDADE NO TRABALHO

Evolução na Comunicação de

Redes de Computadores. Camada de Transporte

SISTEMAS DISTRIBUÍDOS

Sistemas Operacionais Gerência de Dispositivos

Curso Tecnológico de Redes de Computadores 5º período Disciplina: Tecnologia WEB Professor: José Maurício S. Pinheiro V

Aula 6 Modelo de Divisão em Camadas TCP/IP

Manual SAGe Versão 1.2 (a partir da versão )

Multiplexador. Permitem que vários equipamentos compartilhem um único canal de comunicação

Arquitetura dos Sistemas de Informação Distribuídos

SISTEMAS OPERACIONAIS. Maquinas Virtuais e Emuladores

Redes de Computadores II. Professor Airton Ribeiro de Sousa

Conceitos de Banco de Dados

Automação de Locais Distantes

Sistemas Operacionais Aula 06: Threads. Ezequiel R. Zorzal

Capítulo 4 - Roteamento e Roteadores

Prof.: Roberto Franciscatto. Capítulo 1.2 Aspectos Gerais

Sistemas Distribuídos Processos I. Prof. MSc. Hugo Souza

Transcrição:

DANIEL CÂNDIDO DE OLIVEIRA IMPLEMENTAÇÃO DE APLICAÇÕES PARALELAS COM O PACOTE JPVM Palmas 2005

DANIEL CÂNDIDO DE OLIVEIRA IMPLEMENTAÇÃO DE APLICAÇÕES PARALELAS COM O PACOTE JPVM Trabalho apresentado ao curso de Sistemas de Informação do Centro Universitário Luterano de Palmas como requisito parcial da disciplina de Prática de Sistemas de Informação II, orientado pela professora Madianita Bogo Palmas 2005

DANIEL CÂNDIDO DE OLIVEIRA IMPLEMENTAÇÃO DE APLICAÇÕES PARALELAS COM O PACOTE JPVM Aprovado em Julho de 2005. Trabalho apresentado ao curso de Sistemas de Informação do Centro Universitário Luterano de Palmas como requisito parcial da disciplina de Prática de Sistemas de Informação II, orientado pela professora Madianita Bogo BANCA EXAMINADORA Profª. M. Sc. Madianita Bogo Centro Universitário Luterano de Palmas Profª. M. Sc. Parcilene Fernandes Brito Centro Universitário Luterano de Palmas Prof. Ricardo Marx Costa Soares de Jesus Centro Universitário Luterano de Palmas Palmas 2005

À Sabrina do Valle, Princesa do Gelo, Soberana do meu coração.

APOSTASIA O que outrora foi santo, puro, verteu-se em profanação. O santo cálice agora é opróbrio, escárnio. Profunda apostasia! O mundo gira sem sentido, Cambaleia como homem de coração alegre pelo vinho: Vinho espremido pela mão da ira; ferve no cálice. O que já foi doce ao paladar, rasga o estômago em puro fel: Vinagre por água; Espinho por coroa... Mundo de infinitas contradições, paradoxos sem fim. Aqueles que tomamos por sábio não passam de hipócritas: Nada fazem se não enganar com belas palavras. Pensamos compreender a razão e, acreditando nisso, Nos declaramos sábios, contudo somos tolos. Quem dera conhecer uma mísera ponta de verdade: Seria tomado por príncipe dos tolos. Nossa vida esvaece como o vapor: Desprezíveis aparições efêmeras. Quem dera ser mais que isso: Viveria o limiar da imortalidade. Seres providos de racionalidade: Em suas mente controlam o mundo. Contudo, se quer controlam a própria vida, Nem ao menos o próximo segundo. Feliz o que consegue viver o presente: Concentrar inteligência e vontade no agora. Apostasia! Declaramos a apostasia. Infames seres que somos: Na incapacidade de viver o presente, Preferimos o passado e futuro. Na incapacidade de viver o certo, Se é que o conhecemos, Criamos nossas próprias leis. Mundo apóstata! Como é mais fácil enganar-se a si mesmo Criando novas regras. Sigamos em frente: Embriaguemo-nos e fujamos dessa realidade, Pois somos COVARDES para vivê-la! Daniel Cândido de Oliveira Por que, pois, se desvia este povo de Jerusalém com uma apostasia tão contínua? Persiste no engano, não quer voltar [Jeremias 8:5].

AGRADECIMENTOS Agradeço, primeiramente a Deus, ao qual eu sirvo e amo, por todo o seu amor e cuidado para comigo. Um Deus onipresente, onipotente e onisciente que, apesar de tanta glória, me amou a ponto de dar seu filho pra morrer em meu lugar. Que apesar de todas as minhas falhas continua fiel a mim. A Ele seja toda a honra para sempre, amém. Agradeço à minha família, cada um deles em particular, que me entenderam e me apoiaram, tornando-se fator fundamental para conclusão desse trabalho. Agradeço a professora Mádia que tanto me apoiou e com esmero me orientou nesse trabalho, tornou possível a realização do mesmo. Agradeço a cada um de meus amigos, fiéis companheiros, que estiveram presentes, mesmo que virtualmente, durante a realização desse trabalho. É impossível nesse momento citar os nomes de cada um, pois com certeza seria injusto com muitos deles. Contudo, cada um conhece o valor que tem pra mim e o carinho que os dedico. Muitas foram as pessoas que me ajudaram e se fizeram presentes durante a realização desse trabalho. Contudo, findo por aqui meus agradecimentos, pois cada um deles, mesmo sem citá-los aqui, bem sabe o quanto é importante pra mim. Agradeço a você que neste momento me prestigia ao ler este trabalho. Grato!

iv SUMÁRIO 1. Introdução...11 2. Revisão de literatura...14 2.1. Processamento Paralelo...14 2.2. Clusters de Computadores...17 2.2.1. Cluster de alta performance de computação...19 2.2.2. Cluster de alta disponibilidade...20 2.2.3. Clusters X Supercomputadores...21 2.3. PVM...22 2.3.1. Características...23 2.3.2. Componentes e Funcionamento Básico...24 2.4. Protocolos de Transporte...26 2.4.1. TCP...26 2.4.2. UDP...28 2.5. JAVA & JPVM...29 2.5.1. Portabilidade...30 2.5.2. Concorrência...31 2.6. JPVM...33 2.6.1. Componentes e Funcionamento...35 2.6.2. Interface de Programação...36 2.6.2.1. Métodos para Criação e Gerência de Tarefas...37 2.6.2.2. Métodos para Troca de Mensagens...39 2.6.2.3. Métodos de configuração e controle...40 2.6.2.4. Exemplo de Implementação...42 3. Material e métodos...48 4. Resultados e discussão...50 4.1. Arquitetura Desenvolvida...50 4.1.1. Configuração...51 4.2. Utilização do JPVM...54 4.3. Programas Paralelos Implementados...55 4.3.1. Programa WaveLet...55 4.3.1.1. Descrição do Funcionamento...56 4.3.1.2. Descrição da Implementação - Paralela...57 4.3.1.3. Resultados dos Testes...59 4.3.2. Programa para Binarização...61 4.3.2.1. Descrição...62 4.3.2.2. Implementação...63 4.3.2.3. Resultados dos Testes...66 4.4. Considerações sobre o JPVM...68 5. CONCLUSÃO...70 6. REFERÊNCIAS BIBLIOGRÁFICAS...72 ANEXOS...74 ANEXO I...75 ANEXO II...77

v LISTA DE FIGURAS Figura 1: memória compartilhada...16 Figura 2: memória distribuída....16 Figura 3: esquema de funcionamento da JVM (LEMAY, 1999)...31 Figura 4: Processos com única thread e com multithreads (SILBERSCHATZ, 2004)....32 Figura 5: Esquema de Comunicação JPVM, retirada de (FERRARI, 1998)...36 Figura 6: Estrutura de retorno do método pmv_config...41 Figura 7: Estrutura de retorno do método pmv_config....41 Figura 8: Registro do processo atual na máquina virtual paralela....43 Figura 9: obtenção do identificador do processo atual Task Id....43 Figura 10: criação de seis instâncias do processo vetor_other. java....44 Figura 11: Recebimento e tratamento de mensagem....44 Figura 12: Impressão do resultado final do cálculo e finalização da aplicação dentro do JPVM....45 Figura 13: registro do processo no JPVM e solicitação do TaskId do processo pai....45 Figura 14: preenchimento do vetor e realização de alguns cálculos sobre o mesmo...46 Figura 15: Criação do buffer, empacotamento e envio de mensagem....46 Figura 16: Arquitetura do cluster desenvolvido....51 Figura 17: Conteúdo do arquivo hosts....52 Figura 18: Conteúdo adicionado ao arquivo /etc/fstab....53 Figura 19: aplicação de transformação Wavelet....56 Figura 20: Esquema de funcionamento seqüencial do algoritmo Wavelet....56 Figura 21: Esquema de paralelização para o algoritmo Wavelet....57 Figura 22: Criação das tarefas a serem executadas....58 Figura 23: WaveClient esperando mensagem....59 Figura 24: Envio de mensagens para as instâncias de WaveClient....59 Figura 25: aplicação de máscara de Binarização....62 Figura 26: Funcionamento do algoritmo de binarização seqüencial....62 Figura 27: Esquema de paralelização para o algoritmo de Binarização....63 Figura 28: Criação das tarefas a serem executadas....64 Figura 29: BinClient esperando mensagem....65 Figura 30: Envio de mensagens para as instâncias de BinClient....65

vi LISTA DE ABREVIATURAS JPVM PVM JVM TCP UDP Java Parallel Virtual Machine Parallel Virtual Machine Java Virtual Machine Transmission Control Protocol User Datagram Protocol

vii RESUMO Várias tecnologias têm sido desenvolvidas para suprir a necessidade de alto desempenho para as mais diversas aplicações. Uma alternativa que tem apresentado resultados satisfatórios tem sido a utilização de clusters de computadores, utilizando máquinas comuns interligadas em rede, e mecanismos para a troca de informações, como o JPVM, formando um único recurso computacional. O pacote JPVM é uma API Java que implementa as funcionalidades do PVM e apresenta algumas características adicionais herdadas da linguagem sobre a qual é implementado, como o alto nível de portabilidade e uso uniforme de threads. Porém, existe pouca documentação sobre esse pacote, mesmo diante das vantagens oferecidas para programação de alto desempenho. Com isso, o objetivo desse trabalho é implementar aplicações paralelas, para cálculos com vetores e processamento de imagens, que possam ser executadas em um ambiente híbrido, utilizando o JPVM, verificando situações com diferentes de quantidades de tarefas e computadores, possibilitando uma análise de desempenho do JPVM e conceitos a ele relacionados.

11 1. INTRODUÇÃO Muitas tecnologias têm sido desenvolvidas para suprir a necessidade de alto desempenho para executar as mais diversas aplicações que exigem alto poder computacional. Uma alternativa que tem apresentado resultados satisfatórios em relação a custo/desempenho tem sido a utilização de clusters de computadores, construídos com máquinas comuns interligadas em rede. Além disso, existe uma grande evolução nos sistemas utilizados para se obter alto desempenho através dos clusters, como novos mecanismos de comunicação. Existem vários mecanismos para troca de informações que podem ser utilizados na construção de clusters, alguns deles de distribuição livre como o PVM (Parallel Virtual Machine) ou, ainda, o JPVM que é uma implementação em Java baseada no mesmo, que é um pacote de software que apresenta um conjunto de máquinas trabalhando como um único recurso computacional paralelo (LOURENÇO, 2002). O pacote JPVM é uma API Java que implementa as funcionalidades do PVM e apresenta algumas características adicionais herdadas da linguagem sobre a qual é implementado, principalmente o alto nível de portabilidade. Contudo, ainda existe pouca documentação sobre esse pacote, fato este que estimulou o estudo do mesmo, diante das vantagens que o mesmo oferece para programação de alto desempenho. Desta forma, o objetivo desse trabalho é implementar aplicações paralelas, que possam ser executadas em um ambiente híbrido, utilizando o JPVM, aplicando testes em situações distintas, com diferentes quantidades de tarefas e computadores. Com isso, é possível realizar uma análise de desempenho do JPVM e fazer um levantamento do funcionamento e conceitos a ele relacionados.

12 Para isso, foi construído um cluster de alto desempenho, formado por máquinas Linux e Windows, em que as aplicações implementadas se comunicam com o JPVM, tornando possível analisar o seu desempenho, bem como verificar seu funcionamento, a sua interface de programação e as suas características, como a portabilidade e interoperabilidade. Foram implementadas aplicações paralelas que realizam processamento de imagem para executar no cluster construído, pois normalmente o trabalho com imagens utiliza cálculos complexos e que demandam muito tempo de CPU, o que viabiliza os testes de desempenho. Além disso, o processamento de imagens é relativamente simples para ser paralelizado, podendo ser realizado de duas formas. A primeira divide uma imagem em vários pedaços, sobre os quais o processamento é efetuado simultaneamente. A segunda pode ser utilizada quando existem várias imagens a serem processadas, realizando o processamento em duas ou mais simultaneamente. A apresentação do trabalho foi dividida de forma que a revisão de literatura aborda os assuntos relevantes para o entendimento do JPVM, que são: processamento paralelo, cluster de computadores, PVM, protocolos de transporte, características da linguagem Java que influenciam na paralelização das aplicações e o JPVM. A seção do JPVM apresenta uma relação entre o JPVM e o PVM padrão. Ainda, aborda os principais métodos do JPVM, além de um exemplo para demonstrar a utilização do mesmo, bem como comentários gerais sobre seu funcionamento. É importante ressaltar que as informações sobre clusters de computadores e PVM foram retiradas do trabalho de estágio (OLIVEIRA, 2004), porém o texto sofreu algumas alterações, como reorganização, seleção dos trechos mais importantes e inclusão de novas informações. Na seção de materiais e métodos serão apresentados os equipamentos e programas utilizados na realização desse trabalho, bem como a forma que os mesmos foram trabalhados. Por fim, na seção dos resultados serão apresentadas considerações sobre o pacote analisado, as aplicações paralelas implementadas com o JPVM e os testes realizados para

13 avaliar o desempenho da execução das mesmas, em situações distintas, no que diz respeito à quantidade de máquinas e de tarefas.

14 2. REVISÃO DE LITERATURA 2.1. Processamento Paralelo Processamento paralelo é o modo de execução em que várias instruções são executadas ao mesmo tempo e, normalmente, sobre vários dados (TANENBAUM, 1995). A principal vantagem do processamento paralelo é o desempenho, pois se torna possível processar, ao mesmo tempo, várias partes de uma aplicação que demandaria muito tempo de execução se processadas seqüencialmente ou, ainda, a execução simultânea de várias aplicações pequenas. Existem dois tipos de processamento paralelo: o paralelismo real e o pseudoparalelismo. No primeiro, vários processos executam sobre vários processadores, que podem ter memória própria ou uma memória compartilhada entre eles. No segundo, existem vários processos concorrendo por um único processador. Contudo, mesmo tendo um único processador, a execução de tarefas pode ser vantajosa por permitir que uma tarefa execute sem ter que esperar a primeira terminar a execução, por exemplo, um cliente chat no qual um processo fica responsável por receber mensagens e outro por enviar o que o usuário digita. Em ambos os casos, a quantidade de processadores utilizados é transparente ao usuário final. A maioria das aplicações que necessita de um grande poder computacional pode ser adaptada para executar em um ambiente paralelo, visando obter um funcionamento satisfatório no que diz respeito ao tempo gasto na execução das tarefas. Da mesma forma, adaptações podem ser feitas em aplicações que necessitam estar sempre disponíveis, pois

15 além da busca do desempenho, os ambientes paralelos podem ser utilizados visando que o serviço continue executando o máximo de tempo possível. Alguns exemplos de aplicações em que a utilização de processamento paralelo pode ser indicada, são: Servidores de Internet no caso de sites muito visitados, pode-se distribuir a carga para aumentar a capacidade de resposta. Sistemas de Computação Gráfica a paralelização da execução pode, por exemplo, diminuir o tempo de renderização de imagens durante a elaboração de um filme. Sistemas de Inteligência Artificial e automação casos como processamento de imagens ou visão por computador que, normalmente, exigem muito processamento. Sistemas para previsão do tempo processar informações para gerar uma previsão através de computadores seqüenciais é um processo lento e impreciso, principalmente por utilizar processamento de imagens recebidas por satélite. Sistemas para controle de segurança de reatores nucleares a análise das condições do reator e a atuação rápida em caso de acidentes exigem cálculos matemáticos complexos que necessitam de muito processamento. Como se pode perceber, existe uma variedade de aplicações que podem ser paralelizadas, permitindo a sua utilização em máquinas paralelas, como cluster e supercomputador. As máquinas paralelas são arquiteturas compostas por vários processadores, os quais são interligados fisicamente através de uma rede interconexão (BOGO, 2002). O principal objetivo dessas arquiteturas é obter maior desempenho por meio da cooperação entre os processadores na execução de tarefas. Os dois tipos de máquinas paralelas são as que utilizam memória compartilhada e as que utilizam memória distribuída (PITANGA, 2004). As máquinas paralelas de memória compartilhada possuem múltiplos processadores, compartilhando um espaço de endereços de memória comum, como pode ser visto na Figura 1. É uma arquitetura pouco escalável e de difícil manutenção. Além disso, esse tipo de arquitetura pode criar situações de conflito entre os processadores, ao acessar a memória

16 comum, na qual a gravidade dessas situações depende de características de hardware e da qualidade dos mecanismos de interligação. Processador Processador Memória Mecanismo de Interligação Figura 1: memória compartilhada. As máquinas paralelas de memória distribuída são formadas por vários processadores, cada um com a sua própria memória, como pode ser observado na figura 2. Nesse modelo a comunicação entre os diferentes processadores do sistema é realizada através de troca de mensagens. Processador Memória Processador Memória Processador Memória Mecanismo de Interligação Figura 2: memória distribuída. Atualmente, as duas formas mais usadas para implementar essas arquiteturas são os supercomputadores, que podem utilizar os dois tipos de memória, e os clusters de computadores, que são exemplos de memória distribuída. As máquinas paralelas com memória compartilhada formam um sistema bastante eficiente no que diz respeito a desempenho. Contudo, são máquinas extremamente caras, com limitações físicas para a quantidade de processadores. Já as máquinas paralelas com memória distribuída apresentam uma certa facilidade de acrescentar novos processadores e necessitam de um

17 mecanismo de troca de mensagens explícitas entre os mesmos para dividir as tarefas executadas. O uso de supercomputadores é uma alternativa disponível para executar aplicações mais complexas. Os mesmos são máquinas desenvolvidas com tecnologias proprietárias e, geralmente, possuem finalidades pré-definidas que acabam gerando desvantagens (PITANGA, 2004), como: utilização de softwares proprietários e caros; hardware com custo elevado; alto custo de manutenção; total dependência de fornecedores; e dificuldade de atualização. Uma alternativa que tem apresentado vantagens na relação custo/desempenho é a utilização dos clusters de computadores, que são máquinas construídas com utilização de dois ou mais microcomputadores comuns interligados por uma rede de interconexão, que trabalham juntos para resolver um problema (ZACHARIAS, 2004). 2.2. Clusters de Computadores Clusters de computadores constituem-se de um conjunto de microcomputadores comuns, interligados por uma rede de interconexão, que trabalham juntos para resolver um problema. Os microcomputadores que compõem o cluster podem ser heterogêneos, tanto em relação a hardware, garantindo a independência em relação a fabricantes, como em relação a sistemas operacionais utilizados (PITANGA, 2004). Além disso, qualquer arquitetura de rede pode ser utilizada para a interligação dos equipamentos, como ethernet, fast ethernet, token ring, entre outros. Nessa arquitetura, cada um dos equipamentos interligados é chamado de nó e, normalmente, existe um nó mestre que é responsável pelo gerenciamento e pela divisão das

18 tarefas entre os demais nós, chamados de escravos, que juntos resolverão um problema comum. Normalmente, o nó mestre também participa do processamento das tarefas, não ficando responsável apenas pelo gerenciamento do cluster. A constante evolução tecnológica dos computadores pessoais, tanto em relação ao aumento de desempenho como em relação à diminuição do custo, é um dos fatores que tem contribuído para fazer dos clusters uma alternativa que atende as necessidades de alto poder de processamento com uma relação custo/desempenho satisfatória. Outra motivação para a construção de clusters é que podem ser utilizados sistemas operacionais abertos e de distribuição livre, como o Linux. Essa é uma solução viável tanto economicamente quanto operacionalmente, pois costumam apresentar um desempenho satisfatório e oferecer código aberto possibilitando alterações em seu funcionamento de acordo com a necessidade das aplicações paralelas a serem executadas, além de não oferecerem custos com a aquisição. Assim, algumas vantagens da utilização dos clusters são (PITANGA, 2004): escalabilidade: é possível aumentar o desempenho do mesmo adicionando ou trocando os microcomputadores que compõem o cluster; tolerância a falhas: o cluster mantém o funcionamento mesmo com a paralisação de alguns nós; baixo custo: utilizam recursos de fácil acesso e de uso comum como, por exemplo, microcomputadores de uso pessoal e mini-hub. independência de fornecedores: por utilizar microcomputadores comuns, que podem ter plataformas heterogêneas, não estão presos a uma tecnologia específica. Para a comunicação entre os nós, foram desenvolvidos vários mecanismos que utilizam a troca de mensagens. Alguns desses mecanismos são de distribuição livre, como o PVM (Parallel Virtual Machine), que é um pacote de software que fornece recursos para a comunicação de um conjunto de máquinas trabalhando como um único recurso computacional paralelo (LOURENÇO, 2002).

19 Um cluster pode possuir configurações e características diferentes, tanto em relação ao hardware quanto ao Sistema Operacional e mecanismos de comunicação, de acordo com a finalidade do mesmo (ZACHARIAS, 2004). Conforme a finalidade os clusters podem ser classificados em: cluster de alta performance de computação e cluster de alta disponibilidade. 2.2.1. Cluster de alta performance de computação Existem situações em que a rapidez na execução das tarefas é mais importante, ou seja, existe a preocupação da diminuição do tempo de resposta da aplicação. Para casos como esse, imagina se um supercomputador dedicado, com custo elevadíssimo e de difícil operação. Contudo, esse desempenho pode ser obtido utilizando clusters de alta performance de computação, que tem como principal função obter processamento de alto desempenho na resolução de problemas através da paralelização da execução das aplicações. Essa classe de cluster tem como foco o desenvolvimento de máquinas paralelas com alto poder computacional, que podem ser utilizadas em situações como estudo de algoritmos de processamento paralelo e construção de aplicações paralelas (PITANGA, 2004). Assim, a utilização desse tipo de arquitetura visa uma maior velocidade na resolução dos problemas, não se preocupando tanto com a implementação de recursos que garantam a confiabilidade das operações. No processamento das aplicações, os computadores trabalham como um único recurso computacional. Cada vez que o cluster recebe uma tarefa grande para executar, como, por exemplo, cálculos matemáticos complexos e processamento de imagens, divide a mesma em partes que serão distribuídas entre os nós, evitando gastar muito processamento com ações voltadas para garantir a confiabilidade, como troca de informações de controle para gerencia do funcionamento dos nós. Nesse caso, normalmente, os erros devem ser detectados e tratados pelas aplicações ou por quem estiver executando as mesmas.

20 2.2.2. Cluster de alta disponibilidade Em muitas aplicações, denominadas críticas, paradas não planejadas podem causar prejuízos na qualidade dos serviços ou até levar a perdas financeiras. Em alguns casos, principalmente para empresas, a disponibilidade de um sistema é vital. A paralisação do sistema pode significar a paralisação da empresa, como por exemplo, o sistema bancário. Para resolver esse problema, podem ser utilizados clusters de alta disponibilidade que tem como principal função evitar essas paradas, mantendo o sistema ativo, mesmo com a paralisação parcial cluster. Logo, quando se constrói um cluster de alta disponibilidade tem-se uma grande preocupação com a garantia de confiabilidade e o tratamento de falhas durante o funcionamento do mesmo. Espera-se que este esteja disponível sempre que se fizer necessário e que as aplicações executem até o fim, sendo que os erros devem ser localizados e corrigidos dinamicamente. Nesse caso, os equipamentos são utilizados em conjunto, com o objetivo de manter os serviços sempre ativos (PITANGA, 2004). Deve-se levar em consideração que garantir a confiabilidade causa a perda de performance e de poder de processamento, pois, além do tempo gasto com o processamento, é necessário dispor de recursos para detectar e contornar as falhas durante o processamento sem interrompê-lo. Por exemplo, uma das formas de garantir a continuidade do processamento é a redundância de equipamentos e/ou serviços, ou seja, são mantidas cópias dos recursos para atender a demanda no caso de falha de algum nó, através da substituição dos mesmos pelas cópias. Com isso, o desempenho fica um pouco comprometido pelo processamento e tempo gasto para manter as cópias dos recursos sempre atualizadas. Normalmente, um servidor de qualidade mantém uma disponibilidade de 99, 5%, enquanto uma solução através de clusters de computadores mantém 99, 99% de disponibilidade (PITANGA, 2004).

21 2.2.3. Clusters X Supercomputadores Os supercomputadores são máquinas construídas para obter alto desempenho a partir de uma arquitetura voltada para busca de resultados específicos a um determinado tipo de tarefa (OMENA, 2004). Ou seja, geralmente, são máquinas construídas sob encomenda para a execução de uma aplicação pré-definida, enquanto que os clusters são construídos com computadores comuns, podendo utilizar máquinas com arquiteturas heterogêneas Os supercomputadores trazem um retorno satisfatório no que diz respeito a desempenho e poder de processamento. Principalmente pelo fato de serem projetados com uma finalidade específica, suas arquiteturas provêem um desempenho otimizado para realização das tarefas. Em contrapartida, os clusters de computadores têm seu desempenho e poder de processamento diretamente ligado à quantidade de nós que o compõem, podendo apresentar um retorno tão satisfatório quanto os supercomputadores. Ainda, cada nó pode ser um sistema completo, permitindo seu reaproveitamento como uma máquina individual (BOGO, 2002). O alto custo de desenvolvimento é o principal fator negativo em relação à utilização de supercomputadores, o que faz com que o acesso aos mesmos seja restrito a poucos. Além disso, o fato de serem construídos, normalmente, sob encomenda acaba gerando uma dependência total de fornecedores e um alto custo de manutenção, além de dificultar a realização de atualizações. Existe, ainda, o problema de que muitas vezes essas máquinas utilizam softwares proprietários e caros e oferecem uma limitação física para a quantidade de processadores. (PITANGA, 2004). Entretanto, os clusters apresentam uma arquitetura bastante flexível, permitindo a alteração da quantidade de nós com muita facilidade, o que permite adicionar novos nós para melhorar o desempenho na existência de uma necessidade de maior poder de processamento ou ainda a remoção de nós, no caso de ociosidade. Essa arquitetura contribui também para a formação de um sistema com uma maior tolerância à falhas, já que um cluster pode continuar funcionando mesmo com a paralisação de alguns dos nós, diferente dos supercomputadores que podem ficar completamente paralisados por pequenas falhas (PITANGA, 2004). Além disso, por utilizar máquinas comuns, produzidas

22 em grande escala, bem como utilização de máquinas antes ociosas, os clusters apresentam um custo total bastante atrativo se comparado aos supercomputadores. 2.3. PVM Com o objetivo de facilitar o campo da computação paralela heterogênea, foi criada a biblioteca de programação paralela por passagem de mensagem PVM (Parallel Virtual Machine) pelo Heterogeneous Network Project, em 1989 (PITANGA, 2004). O PVM foi uma das primeiras bibliotecas, sob o conceito de passagem de mensagem, a permitir um ambiente paralelo heterogêneo, como máquinas com configurações físicas e/ou sistemas operacionais diferentes. O funcionamento de clusters consiste, basicamente, em máquinas interligadas através de uma rede de comunicação com processos trocando mensagens entre si através de um mecanismo próprio para isso, como o PVM. Através da troca de mensagens, o PVM permite o funcionamento conjunto de máquinas mono ou multiprocessadoras, como um único recurso computacional paralelo (LOURENÇO, 2002). O PVM forma um sistema distribuído que, segundo TANENBAUM, 1995, é aquele que roda em um conjunto de máquinas sem memória compartilhada, máquinas estas que mesmo assim aparecem como um único computador para seu usuário. Com isso, tem-se uma forma eficiente e transparente de distribuir tarefas entre máquinas ligadas em rede, conseguindo um bom desempenho na gerência dos recursos computacionais, através da configuração de uma máquina paralela virtual. Além de pequena, a biblioteca PVM está disponível para vários sistemas operacionais como UNIX, seus derivados e Windows NT. A sua instalação é simples e não necessita de privilégios especiais, ou seja, não é necessário acessar a máquina como superusuário para instalar o PVM.

23 2.3.1. Características O PVM fornece um ambiente paralelo utilizando o modelo de Message Passing (Passagem de Mensagem), que é um método de comunicação entre vários computadores com memória própria. Esses computadores se comunicam por troca de mensagens através de uma rede de computadores, respeitando as regras dos protocolos de comunicação. O PVM habilita uma coleção de computadores heterogêneos a se comportar como um único recurso computacional expansível e concorrente, o que contribuiu para torná-lo um padrão de fato (FREITAS, 2004). Junto com a interoperabilidade, outro fator que contribui para tornar o PVM um padrão é a sua alta capacidade de portabilidade. Contudo, uma aplicação PVM ainda fica dependente da portabilidade e interoperabilidade da linguagem em que foi escrita, necessitando alterações para que uma aplicação compilada em uma arquitetura seja reutilizada em uma outra. Além de oferecer vários recursos para computação paralela, a utilização do PVM é simples e de fácil compreensão, sendo que algumas de suas características são (LOURENÇO, 2004): possibilita a atribuição das sub-tarefas de uma aplicação, de forma otimizada, aos nós que compõem o ambiente paralelo; oferece controle de processos, em tempo de execução; apresenta uma interface de programação intuitiva e consistente; oferece suporte para tolerância a falhas, monitoração e profiling; é altamente portável, além de oferecer interoperabilidade; abstração completa, pois pode ser administrado como uma única máquina virtual, mesmo numa rede totalmente heterogênea; fácil de instalar e usar; software de domínio publico; e grande aceitação e utilização no mundo.

24 Com isso, através da agregação de computadores heterogêneos e o compartilhamento dos seus recursos, o PVM possibilita a utilização efetiva de computação paralela com paralelização escalável e dinâmica e a programação em linguagens como C e C++, através do uso de bibliotecas de rotinas, que serão apresentadas com mais detalhes na próxima subseção. Assim, problemas que exigem grande poder computacional podem ser resolvidos sem a necessidade da compra um supercomputador de tecnologia proprietária. Por isso, o PVM é uma forma muito utilizada para aumentar o desempenho, no meio científico e comercial, principalmente pela sua simplicidade e por ter um custo efetivo menor frente a outras soluções. 2.3.2. Componentes e Funcionamento Básico O PVM é composto de duas partes: a primeira é um daemon, chamado pvmd3, que é executado em todos os computadores que vão formar a máquina virtual paralela; a segunda é uma biblioteca de rotinas de interface, na qual se encontra um conjunto completo de primitivas, necessárias para a interação entre as tarefas de uma aplicação (MORETTI, 2004). O pvmd3 executa em segundo plano em cada um dos nós, formando a máquina virtual. Esse processo é responsável pela troca de mensagens, pela coordenação das tarefas em execução e pela inspeção das operações dos processos de aplicações paralelas sobre o PVM. Ao utilizar uma aplicação PVM, o usuário executa o pvmd3 em um dos computadores do cluster, normalmente o nó mestre, que chama os demais processos pvmd3 escravos em cada computador que vai compor a máquina virtual, através de remote shell - rsh, coordenando assim as comunicações entre os processadores e o sistema. Logo, em cada nó, é necessário ter o pvmd3 instalado, sendo que existem versões disponíveis para vários sistemas operacionais. Contudo, no caso de transmissão entre arquiteturas diferentes existe certa dificuldade, pois é necessária uma padronização dos dados transmitidos, normalmente através da conversão dos dados pelo formato XDR

25 (External Data Representation), conforme RFC 1832. Dependendo do caso, isso pode ser extremamente complexo (FERRARI, 1998) A biblioteca de rotinas de interface, segunda parte do PVM, possui as rotinas responsáveis pela comunicação entre os computadores interligados, gerência de processos, coordenação das tarefas, além da verificação e manutenção de estado da máquina virtual (MORETTI, 2004). As tarefas executadas através do PVM utilizam um número inteiro como identificador, o task identifier (TID), que é utilizado nas mensagens que são trocadas entre os computadores que formam a máquina virtual paralela (MORETTI, 2004). Como esse identificador deve ser único na máquina virtual, o mesmo é definido pelo daemon local e não pelo usuário. A identificação das tarefas pela aplicação do usuário é possível através de diversas rotinas que o PVM oferece, que retornam valores de TID, possibilitando a identificação das tarefas pela aplicação do usuário. Os programas paralelos que utilizam o PVM fazem uso das rotinas disponibilizadas na biblioteca de interface do PVM. Para programação, essas bibliotecas são distribuídas em linguagens como Python, Perl, além das linguagens tradicionais como C, C++ e Fortran, nas quais o usuário, entre outras coisas, pode escolher o protocolo de camada de transporte (TCP ou UDP) que vai utilizar na troca de mensagens. Normalmente, essas bibliotecas disponibilizadas para linguagens como Perl, Python, e outras, fazem apenas um mascaramento das bibliotecas do PVM padrão, em C/C++, possibilitando o uso das mesmas nas linguagens citadas (FERRARI, 1998). Com isso, além do compilador e/ou interpretador da linguagem que se deseja utilizar, é necessário também a instalação e configuração do PVM padrão. É importante citar que existem muitos meios de melhorar o desempenho de máquinas paralelas que utilizem o PVM, mas não existe um modelo ou método padrão, pois o funcionamento do cluster depende de fatores como a arquitetura, velocidade da rede, sistemas auxiliares, entre outros que devem ser avaliados conforme a necessidade. Ou seja, a definição da solução depende do tipo de problema.

26 2.4. Protocolos de Transporte Os protocolos de transporte são responsáveis pela troca de dados entre duas aplicações que se comunicam em uma rede, permitindo que vários aplicativos distintos executados em determinado computador enviem e recebam seus dados isoladamente (COMER, 1998). No modelo TCP/IP existem dois protocolos com essa função: o TCP (Transmission Control Protocol) e o UDP (User Datagram Protocol). O PVM padrão implementa um sistema constituído de uma biblioteca em C/C++, disponível também em Fortran, na qual o usuário pode escolher qual protocolo de transporte utilizar, TCP ou UDP, na troca de mensagens (PITANGA, 2004). Contudo, o JPVM é implementado de forma que a troca de mensagens é realizada com o TCP (COMER, 1998). 2.4.1. TCP O protocolo TCP proporciona um serviço confiável, com controle de fluxo fim-a-fim entre duas máquinas de velocidades de processamento arbitrárias, que usem o mecanismo IP não-confiável para comunicação (COMER, 1999). O TCP foi construído para funcionar corretamente mesmo que haja problemas durante a transmissão dos dados, já que o protocolo responsável pela transferência na rede não se preocupa com isso. Para garantir essa confiabilidade, o TCP acrescenta recursos para a transmissão de dados sobre o IP, como, por exemplo, a utilização de timeout com retransmissão. O TCP oferece um serviço orientado a conexão, em que os pontos finais da comunicação, as aplicações que estão trocando dados, são identificados pela combinação do endereço IP origem mais porta origem endereço IP destino mais porta destino (ALBUQUERQUE, 2001). Como é orientado à conexão o TCP oferece recursos para identificar e corrigir perdas de segmentos, segmentos fora de ordem e segmentos com informações incorretas. Uma conexão TCP pode ser aberta de dois modos: ativo, quando o processo deseja conectar com outro, ou no modo passivo, quando o processo deseja aguardar uma conexão de um outro (ALBUQUERQUE, 2001). Os dados são transferidos em segmentos, através de uma conexão e enviados como dados nos datagramas IP. Cada segmento é composto

27 por cabeçalho e dados, sendo que o cabeçalho do protocolo TCP, além dos dados que identificam a conexão, existe um número de seqüência, o tamanho do segmento, entre outros. O TCP oferece transmissão orientada a bytes fluxo de bytes (COMER, 1999). A mensagem é remontada através do número de seqüência e entregue de forma transparente ao usuário, mesmo havendo segmentação da mesma. Contudo, os dados são transmitidos independentemente da forma que foram agrupados pelo programa. O TCP decide o momento de parar de agrupar e conseqüentemente transmitir os dados. Em contrapartida, datagramas não garantem a ordem na entrega das mensagens. O protocolo TCP espera uma confirmação pela máquina de destino do recebimento dos segmentos, garantindo assim a entrega dos dados (ALBUQUERQUE, 2001). Uma cópia do segmento enviado é mantida na máquina origem e, se em um determinado tempo a recepção não for confirmada, o segmento é retransmitido. Esse tempo de espera é calculado dinamicamente pelo TCP e ajustado às condições da conexão. Normalmente, o valor desse tempo é duas vezes o RTT (Round Trip Time), tempo estimado de ida e volta do segmento, O TCP oferece também a confirmação de Piggbacking (COMER, 1999), pois como a comunicação em uma conexão TCP é do tipo full-duplex, os segmentos foram concebidos de forma que possa carregar dados em um sentido da comunicação e uma confirmação no sentido inverso (mesmo segmento), por exemplo, um segmento que está enviando dados de uma aplicação A para uma aplicação B pode levar junto, no seu cabeçalho, uma confirmação de recebimento de uma mensagem que veio de B para A. Isso fornece um ganho de tempo e gera economia de segmentos. Esse mecanismo gera ganho substancial de performance na comunicação via TCP e viabiliza a comunicação entre pontos finais distantes. Para melhorar o desempenho na transmissão, evitando que seja necessário encaminhar uma confirmação para cada segmento recebido, o TCP usa o conceito de janelas deslizantes (sliding windows), em que múltiplos segmentos podem ser enviados antes da confirmação do primeiro (COMER, 1998). A confirmação é feita pelo número de reconhecimento,

28 sendo que ao informar que deseja receber um determinado byte a aplicação confirma o recebimento de todos os anteriores. Esta otimização é implementada pelo protocolo TCP, viabilizando um aumento do desempenho da transmissão, limitado apenas pelas características da rede. O número máximo de blocos a serem enviados sem confirmação imediata é denominado tamanho da janela window e à medida que os segmentos enviados são confirmados, novos segmentos podem ser enviados, daí vem o nome janela deslizante.. O tamanho da janela é móvel e é negociado durante a fase de conexão pelos pontos finais e pode ser renegociado, se necessário, durante a transmissão, de acordo com o estado dos buffers (ALBUQUERQUE, 2001). O TCP, mesmo com as medidas para melhorar o desempenho na troca de mensagem, ainda apresenta um custo adicional na transmissão dos dados. Esse custo se deve ao fato da complexidade do TCP sendo que, para transmissão, é necessário estabelecer conexões, os dados a serem enviados precisam ser dispostos em segmentos para serem enviados, e reorganizados ao serem recebidos. Além disso, existe da necessidade de respostas com confirmação de recebimentos e a retransmissão dos dados na falta da mesma. Contudo, as características do TCP fazem dele um protocolo apropriado para ambientes em que a confiabilidade na transmissão é mais importante que a rapidez. 2.4.2. UDP O UDP é um protocolo de transporte que, ao contrário do TCP, oferece um serviço de comunicação não orientado a conexão e sem garantia de entrega (ALBUQUERQUE, 2001). Oferece uma transmissão orientada a mensagens, no qual todas as mensagens recebidas para uma porta são colocadas em uma mesma fila, independentemente da sua origem. Possíveis perdas de dados ou, ainda, a organização dos mesmos devem ser tratadas pelas aplicações que utilizam o UDP. O UDP é um protocolo de transporte mais simples que o TCP e pode ser considerado como uma extensão do protocolo IP, acrescentando ao mesmo a capacidade de multiplexação e demultiplexação (COMER, 1999). Isso é, através do conceito de portas, o UDP possibilita

29 que várias aplicações, em uma mesma máquina, se comuniquem ao mesmo tempo. Para isso, cada mensagem contém um número de porta de origem e um de destino, permitindo que esta seja entregue ao destinatário certo. O UDP oferece uma comunicação rápida, devido a sua simplicidade, e pode ser utilizado tanto em comunicações por difusão (broadcast) ou comunicações ponto a ponto (ALBUQUERQUE, 2001). Seu funcionamento básico consiste na estação origem recebendo dos processos de aplicação pedidos de transmissão de mensagens, o UDP multiplexa a mensagem encaminha ao IP que é o responsável pela transmissão. Na estação destino ocorre o processo inverso: O IP entrega as mensagens recebidas ao UDP que, por sua vez, demultiplexa a mensagem e repassa ao processo de aplicação destino. Os datagramas UDP são enviados como dados nos datagramas IP e podem ser fragmentados na camada IP, o que pode gerar problemas, pois o UDP não fornece ordenamento dos dados. Quando possível, isso deve ser tratado pela aplicação, evitando a fragmentação. Isso pode ser feito controlando o tamanho dos datagramas, evitando que o seu tamanho exceda o tamanho máximo de dados do datagrama IP. As características do UDP não garantem a confiabilidade na troca de mensagens. Contudo, por não realizar conexões e não utilizar mensagens de controle, o uso do UDP é viável em trocas de mensagens pequenas, que não excedam o MTU, e para aplicações em que a rapidez é mais importante que a garantia de entrega como, por exemplo, teleconferências. Além disso, em ambientes de redes locais e seguros pode ser interessante utilizar o UDP, pois suas falhas podem ser tratadas em nível de aplicação. 2.5. JAVA & JPVM Como o objetivo desse trabalho é realizar uma análise do processamento paralelo utilizando o JPVM e este é um pacote Java, antes de abordar especificamente esse pacote, é importante ressaltar algumas características da linguagem que servem de motivação para utilizá-la na implementação de ambientes de processamento paralelo, tais como portabilidade e modelo de threads (concorrência).

30 Quanto ao desempenho, apesar do C/C++ apresentar uma performance melhor que a do Java, pois é totalmente compilado, enquanto o Java em parte é interpretado, o que demanda processamento adicional em tempo de execução, o Java ainda apresenta um desempenho considerável (NEWMAN, 1997). Em testes realizados pela Sun Microsystems, o desempenho de códigos de bytes transformados em código de máquina foi praticamente o mesmo do C/C++, isso sem levar em conta o tempo de compilação em run-time. Além disso, várias outras características poderiam ser citadas como, por exemplo, o sistema coletor de lixo do Java que recupera a memória alocada dinamicamente que o programa não precise mais ou, ainda, o uso de arrays, diferente do C/C++ que usa listas de ponteiros vinculadas. Ainda, o modelo de ponteiros do Java elimina a possibilidade de sobrescrever a memória, corrompendo dados. Contudo, para esse estudo, não se faz necessário o aprofundamento nas mesmas. 2.5.1. Portabilidade A linguagem Java foi projetada de forma que seu compilador gerasse um código de bytes neutro, independente da arquitetura sobre a qual será executado. Contudo, esses códigos têm que ser interpretados por um ambiente run-time, este sim, designado para uma plataforma específica. Esse ambiente lê os programas Java compilados Bytecode e converte suas instruções em comandos que um sistema operacional possa manipular e é conhecido como JVM (Java Virtual Machine Máquina Virtual Java) (LEMAY, 1999), como pode ser observado no esquema apresentado na Figura 3.

31 Código Fonte Compilador Java Bytecode Java (independente de plataforma) JVM (Pentium) JVM (PowerPC) JVM (SPARC) Figura 3: esquema de funcionamento da JVM (LEMAY, 1999). Além disso, existe uma padronização de tipos de dados utilizados no Java, isto é, os mesmos têm tamanhos especificados, bem como o comportamento da aritmética neles, por exemplo, o tipo int sempre significa um inteiro de 32 bits (NEWMAN, 1997). Esses pontos fazem do Java uma linguagem com alto nível de portabilidade. Assim, depois que os programas Java estiverem compilados, as classes poderão executar em qualquer máquina que tenha a JVM instalada, mesmo que este for compilado em uma arquitetura diferente da qual vai ser executado, por exemplo, um programa Java compilado em uma máquina Linux pode ser executado em uma máquina Windows, com o JVM previamente instalado. Além disso, a linguagem Java foi projetada para suportar aplicativos em rede. Contudo, em uma rede pode ser necessária a comunicação entre aplicativos Java que estejam executando em máquinas com arquiteturas diferentes. Para resolver esse problema, o Java foi projetado para, além da portabilidade, oferecer interoperabilidade, permitindo a interação entre aplicativos que estejam rodando em arquiteturas diferentes. 2.5.2. Concorrência Uma thread é uma unidade básica de utilização da CPU (SILBERSCHATZ, 2004). Esta, também conhecida como processos peso leve, é formada por um ID, um contador de programa, um conjunto de registradores e uma pilha. Ainda, compartilham sua seção de dados e outros recursos do sistema operacional, como arquivos abertos e sinais, com outras

32 threads que façam parte ao mesmo processo. Um processo tradicional, também chamado de processo peso pesado, tem uma única thread de controle. Já processos com múltiplas threads de controle multithreads podem realizar mais do que uma tarefa a cada momento. A diferença entre um processo tradicional, única thread, e um processo com múltiplas threads pode ser observada na Figura 4. Código Dados Arquivos Código Dados Arquivos Registradores Pilha Registradores Registradores Pilha Pilha thread Única thread multithreads Figura 4: Processos com única thread e com multithreads (SILBERSCHATZ, 2004). A programação com multithreads traz alguns benefícios que podem ser classificados em quatro categorias principais (SILBERSCHATZ, 2004): - Capacidade de resposta um programa pode continuar executando, mesmo se parte dele estiver bloqueado ou realizando uma operação demorada. Por exemplo, um navegador de web multithreads pode, em uma thread, manter uma interação com o usuário, enquanto uma segunda faz o armazenamento de uma imagem. - Compartilhamento de recursos por padrão, as threads compartilham a memória e os recursos do processo ao qual pertencem. Isso permite que uma aplicação tenha diversas threads dentro do mesmo espaço de endereçamento.

33 - Economia como as threads compartilham recursos do processo ao qual pertencem, é mais econômico criar threads e comutar seus contextos. Por outro lado, a alocação de memória e de recursos para a criação de processos é custosa. - Utilização de arquiteturas de multiprocessadores cada thread pode ser executada em paralelo em um processador diferente, melhorando o desempenho. Já um processo com uma única thread pode executar somente em um processador, independente de quantos estejam disponíveis. Entre as linguagens de programação de uso geral e popular, Java é a única que torna as primitivas de simultaneidade disponíveis para o programador de aplicativos, pois, normalmente, os computadores realizam uma simultaneidade implementada com primitivas de sistemas operacionais, disponíveis somente para programadores altamente experientes (DEITEL, 2003). Em Java, o programador especifica que os aplicativos contêm threads (fluxos de execução). Cada uma dessas threads assinala uma parte de um programa que pode ser executada simultaneamente com outras threads. Esse recurso, chamado multithreading, oferece ferramentas poderosas para implementação de simultaneidade. O Java inclui primitivas de multithreading na própria linguagem através de bibliotecas, mais especificamente nas classes Thread, ThreadGroup, ThreadLocal e ThreadDeath do pacote java. lang (DEITEL, 2003). Isso aumenta a portabilidade dos programas Java, diferentemente das linguagens que não tem multithreading predefinido, como C/C++, que dependem de bibliotecas especificas para o sistema operacional, que implementam multithreading ao nível de kernel. 2.6. JPVM Resultados obtidos com a utilização de sistemas paralelos, executando sobre redes de computadores, encorajam o uso dos mesmos por apresentar uma boa relação custo/desempenho. Entretanto, pode se tornar trabalhoso configurar e manter a idéia de um único recurso computacional quando se utiliza uma arquitetura heterogênea, tanto de hardware quanto de software.

34 Como foi apresentado anteriormente, o PVM oferece recursos que permitem implementar um ambiente paralelo, mesmo em arquiteturas heterogêneas, máquinas com configurações físicas e/ou sistemas operacionais diferentes. Contudo, esse mecanismo pode apresentar sérios problemas na execução de uma aplicação paralela quando os computadores utilizam sistemas operacionais diferentes (FERRARI, 1998). Numa tentativa de resolver ou minimizar este problema, foi criada a JPVM, uma API relativamente pequena e implementada inteiramente em Java que segue a estrutura básica do PVM, em que a comunicação segue o modelo de Message Passing (Passagem de Mensagem). Este método permite a comunicação entre vários computadores com memória própria, formando um único recurso computacional. Esses computadores se comunicam por troca de mensagens através de uma rede de computadores, respeitando as regras dos protocolos de comunicação. Contudo, o JPVM apresenta um nível de portabilidade e interoperabilidade superior ao do PVM padrão e também oferece recursos favoráveis à implementação de programas concorrentes, devido a características próprias da linguagem Java (FERRARI, 1998). Isso ocorre pelo fato da linguagem Java oferecer características que estimulam o seu uso na construção de ambientes paralelos heterogêneos como, por exemplo, a interface uniforme para as threads. Essas características possibilitam a utilização dos recursos, atualmente pouco utilizados na computação paralela, como estações de trabalho Macintosh e Windows. A API fornece uma interface semelhante à oferecida em C/C++ e Fortran pelo PVM, mas com a sintaxe e semântica utilizada pela linguagem Java. Essa similaridade facilita o uso da API para os usuários já familiarizados com o PVM, diminuindo custos em uma possível migração para o JPVM. A instalação da API é simples e não necessita de privilégios especiais, ou seja, não é necessário acessar a máquina como superusuário para instalar o JPVM. Para a utilização do JPVM, não é necessária a prévia instalação do PVM, como acontece em algumas distribuições do PVM para outras linguagens. Esses fatores fazem do JPVM um sistema acessível, além de tornar a migração dos sistemas paralelos para a plataforma Java fácil e de baixo custo.