ao padrao original de comunicacao entre processos, destacam-se os modelos baseados em chamada remota de procedimento e em dados compartilhados, Finkel (1980). Este ultimo, aparentemente paradoxal, ja que em um sistema distribuido nao existem memorias compartilhadas, merece algumas consideracoes. Assim como o hardware de um sistema pode ser fisicamente distribuido ou nao distribuido, o software tambem possui uma distincao similar. No caso de sistemas de software, a distincao concerne na distribuicao logica dos dados utilizados, ao inves da distribuicao fisica das memorias. Define-se um sistema de software logicamente distribuido como aquele consistindo de multiplos processos que se comunicam atraves de passagem de mensagens explicitas. Um sistema de software logicamente nao distribuido seria, portanto, aquele no qual os processos se comunicam por meio de dados compartilhados. Considerando isoladamente os sistemas de hardware e software, quatro combinacoes viaveis diferentes podem ocorrer, gerando as classes de sistemas abaixo, ver Bal et al. (1989): software logicamente distribuido, rodando em hardware fisicamente distribuido; software logicamente distribuido, rodando em hardware fisicamente nao distribuido; software logicamente nao distribuido, rodando em hardware fisicamente distribuido e software logicamente nao distribuido, rodando em hardware fisicamente nao distribuido.A primeira classe e a normal, uma colecao de processos, cada um rodando em um processador diferente e se comunicando atraves das primitivas SEND e RECEIVE, que enviam mensagens, por exemplo, utilizando uma rede. A segunda com a mesma estrutura logica de multiprocessos da anterior, simula a passagem fisica de mensagens atraves de passagem logica de mensagens, utilizando memoria compartilhada. A terceira classe esconde a distribuicao fisica do sistema de hardware, simulando memoria compartilhada. A ultima tambem utiliza comunicacao por dados compartilhados, porem nesse caso a existencia de memoria fisicamente compartilhada facilita a implementacao.Finalmente, o terceiro aspecto importante que deve ser considerado nos modelos das linguagens de programacao distribuida, alem do paralelismo e da comunicacao, e o tratamento de falhas de processadores. O problema crucial nessa questao e conseguir trazer, apos a deteccao de uma falha atraves de algum mecanismo utilizado, o sistema de volta a um estado consistente. Esta recuperacao normalmente pode ser realizada se as quedas de processadores forem previstas e as devidas precaucoes forem tomadas durante a computacao normal do sistema. Por exemplo, cada processador, em intervalos regulares, deve descarregar seu estado interno em uma memoria secundaria. Modelos alternativos estao sendo propostos para oferecer, ao programador, mecanismo de alto nivel que permita expressar, especificamente, quais processos e dados sao importantes e como eles devem ser recuperados apos uma falha.A seguir, serao inspecionadas as principais e as mais representativas primitivas de linguagens de programacao distribuidas, que sao propostas de solucoes diferentes para o tratamento do paralelismo e da comunicacao entre processos.4.6.1 ParalelismoEsta secao inicia fazendo uma importante distincao entre o paralelismo real e pseudo paralelismo, Trew e Wilson (1991). A execucao de um programa em um ambiente paralelo real se caracteriza pela existencia de processadores em numero igual ou superior ao numero de processos que compoem o programa. Na execucao de um programa em um ambiente pseudo paralelo, por sua vez, o numero de processadores pode ser menor que o numero de processos existentes,