sistema, ou mesmo, se uma funcao ja existente necessitar de uma computacao mais potente, torna-se relativamente facil adicionar novos processadores. Um exemplo dessa categoria de aplicacao de sistemas distribuidos e o Amoeba, um sistema operacional distribuido, que garante um excelente compartilhamento de recursos computacionais, atraves da implementacao de um servico de arquivos, um servico de impressao, um servico de processos, um servico de terminais, etc, Mullender (1990).Finalmente, ha aplicacoes que se caracterizam como inerentemente distribuidas e, assim, a utilizacao de sistemas distribuidos e natural. Por exemplo, uma companhia com multiplos escritorios e fabricas pode necessitar de um sistema distribuido de forma que pessoas e maquinas, em diferentes locais, possam se comunicar.4.5 Suportes para Programacao DistribuidaApos a descricao dos modelos arquitetonicos distribuidos existentes e os principais tipos de aplicacoes para esses sistemas, serao abordadas as diferentes formas como essas aplicacoes podem ser implementadas, Andrews (1991).A programacao distribuida, aqui referenciada como a atividade de implementacao de uma aplicacao em um sistema distribuido, requer pelo menos dois requisitos basicos essenciais, inexistentes na programacao sequencial: distribuicao de diferentes partes de um programa entre os, possivelmente, diferentes processadores e coordenacao dos processos componentes de um programa distribuido.Em qualquer uma das categorias de aplicacoes ja mencionadas, um programa distribuido contera trechos de codigo que deverao ser processados em paralelo, em diferentes processadores. O primeiro e primordial requisito para que a programacao distribuida possa existir e, portanto, a habilidade de se atribuir diferentes partes de um programa a diferentes processadores.O segundo requisito, nao menos importante, diz respeito a coordenacao dos processos que compoem um programa distribuido. A comunicacao e o sincronismo sao fatores indispensaveis para que os processos possam trocar informacoes e resultados intermediarios e sincronizar suas acoes.Um terceiro requisito do suporte para programacao distribuida, que deve ser apontado, particularmente importante para as aplicacoes tolerantes a falhas, e a habilidade de se detectar uma falha em um dos processadores e recupera-la em tempo habil suficiente para se evitar a queda geral do sistema.O suporte para implementacao de aplicacoes distribuidas, que idealmente deveria contemplar a todos os tres requisitos acima aludidos, pode ser provido pelo sistema operacional ou pela linguagem especialmente projetada para programacao distribuida.No primeiro caso, as aplicacoes sao programadas em uma linguagem sequencial tradicional, estendida com rotinas de biblioteca que invocam primitivas do sistema operacional. Uma vez que as estruturas de controle e os tipos de dados de uma linguagem sequencial nao sao adequadas a programacao distribuida, esse enfoque muitas vezes pode gerar situacoes conflitantes, tais como nos dois exemplos considerados a seguir.Acoes triviais, como a criacao de um processo ou mesmo o recebimento de uma mensagem de um remetente especifico, podem ser perfeitamente expressas atraves de chamadas de rotinas de biblioteca, relativamente simples. Problemas surgem, no entanto, em situacoes mais complexas onde, por exemplo, um processo que deseja selecionar o recebimento de mensagens provenientes de alguns processos especificos, onde o criterio de selecao dependa, por exemplo, do estado do receptor e do conteudo da mensagem. Para que o sistema operacional consiga realizar um pedido como esse, provavelmente, um grande numero de chamadas complicadas de biblioteca devera ser