de comunicacao desses sistemas diminuam de um extremo a outro, todos se ajustam a um modelo basico comum em que processadores autonomos, conectados por algum tipo de rede, comunicam-se por envio de mensagens. Devido a essa similaridade conceitual, as linguagens de programacao utilizadas por esses sistemas nao sao fundamentalmente diferentes e, em principio, qualquer uma dessas linguagens pode ser utilizada na programacao de uma grande variedade de arquiteturas distribuidas. A escolha de uma linguagem mais adequada fica, portanto, muito mais em funcao da natureza da aplicacao a ser implementada.A seguir, serao vistas as principais classes de aplicacoes que tem sido desenvolvidas para sistemas distribuidos, quais os tipos de suportes requeridos e como esses suportes podem ser providos por uma linguagem de programacao distribuida, Coulouris (1994).4.4 Classes de Aplicacao de Sistemas DistribuidosA computacao e uma ciencia em constante e vigorosa evolucao. Suas aplicacoes, que se alastram pelas mais diversificadas areas de atuacao humana, vem incessantemente promovendo a busca por sistemas computacionais capazes de oferecer, cada vez mais, maior desempenho e alta confiabilidade. Um dos resultados efetivos alcancados, fruto dessas investigacoes, e o modelo arquitetonico composto por multiplos elementos processadores, que veio propiciar os sistemas distribuidos. Sistemas dessa natureza tem-se revelado excelente alternativa, proporcionando um grande poder computacional atraves da exploracao de eventos potencialmente paralelos, encontrados em grande parte das mais diversas aplicacoes. Esses sistemas, comparados aos sistemas convencionais, podem apresentar uma melhor relacao custo-desempenho e incrementos consideraveis de confiabilidade.De maneira geral, as razoes que justificam as aplicacoes de sistemas distribuidos podem ser classificadas em quatro principais categorias, ver Bal et al. (1989): reducao do tempo de processamento; aumento da confiabilidade e da disponibilidade; melhoria na estruturacao do sistema e aplicacoes inerentemente distribuidas.Em muitos sistemas computacionais, a velocidade de processamento pode-se tornar um fator determinante. Atraves da exploracao das partes de um programa que, potencialmente, possam ser executadas em processadores diferentes, simultaneamente, pode-se alcancar reducao significativa no tempo de processamento. Um exemplo tipico dessa categoria de aplicacoes e o sistema desenvolvido nesse trabalho, onde um espaco de solucoes possiveis para um determinado problema da producao industrial, deve ser vasculhado por varios processos cooperantes, simultaneamente, almejando uma reducao relevante no tempo gasto na determinacao de uma boa solucao .Sistemas computacionais distribuidos sao potencialmente mais confiaveis do que os tradicionais uma vez que possuem a, assim chamada, propriedade de falha parcial, ou seja, uma vez que os processadores sao autonomos, uma falha em um deles nao afetara o funcionamento normal dos demais processadores. Para aplicacoes envolvidas com situacoes criticas, onde a queda do sistema implica em danos irreparaveis, tais como controle de aeronaves, automatizacao industrial, etc, essa propriedade e altamente desejavel. Dessa forma, confiabilidade pode ser incrementada pela replicacao de funcoes ou dados criticos da aplicacao, em varios processadores.Muitas vezes a implementacao de uma certa aplicacao se torna mais natural se estruturada como uma colecao de servicos especializados. Cada servico podendo utilizar um ou mais processadores dedicados, alcancando com isso maior desempenho e alta confiabilidade. Os servicos podem enviar requisicoes de tarefas a outros atraves de uma rede. Se uma nova funcao necessitar ser incorporada ao