Passagem de mensagens - Message passing

Na ciência da computação , a passagem de mensagens é uma técnica para invocar o comportamento (ou seja, executar um programa ) em um computador . O programa de chamada envia uma mensagem a um processo (que pode ser um ator ou objeto ) e conta com esse processo e sua infraestrutura de suporte para selecionar e executar algum código apropriado. A passagem de mensagens difere da programação convencional, onde um processo, sub-rotina ou função é invocado diretamente pelo nome. A passagem de mensagens é a chave para alguns modelos de concorrência e programação orientada a objetos .

A passagem de mensagens é onipresente nos softwares de computador modernos . Ele é usado como uma forma de os objetos que compõem um programa funcionarem entre si e como um meio de interação entre objetos e sistemas executados em diferentes computadores (por exemplo, a Internet ). A passagem de mensagens pode ser implementada por vários mecanismos, incluindo canais .

Visão geral

A passagem de mensagens é uma técnica para invocar o comportamento (isto é, executar um programa) em um computador. Em contraste com a técnica tradicional de chamar um programa pelo nome, a passagem de mensagens usa um modelo de objeto para distinguir a função geral das implementações específicas. O programa de chamada envia uma mensagem e conta com o objeto para selecionar e executar o código apropriado. As justificativas para o uso de uma camada intermediária se enquadram essencialmente em duas categorias: encapsulamento e distribuição.

Encapsulamento é a ideia de que os objetos de software devem ser capazes de invocar serviços em outros objetos sem saber ou se preocupar com a forma como esses serviços são implementados. O encapsulamento pode reduzir a quantidade de lógica de codificação e tornar os sistemas mais fáceis de manter. Por exemplo, em vez de ter instruções IF-THEN que determinam qual sub-rotina ou função chamar um desenvolvedor, basta enviar uma mensagem para o objeto e o objeto selecionará o código apropriado com base em seu tipo.

Um dos primeiros exemplos de como isso pode ser usado foi no domínio da computação gráfica. Existem várias complexidades envolvidas na manipulação de objetos gráficos. Por exemplo, simplesmente usar a fórmula certa para calcular a área de uma forma fechada irá variar dependendo se a forma é um triângulo, retângulo, elipse ou círculo. Na programação de computador tradicional, isso resultaria em longas instruções IF-THEN testando que tipo de objeto era a forma e chamando o código apropriado. A maneira orientada a objetos de lidar com isso é definir uma classe chamada Shapecom subclasses como Rectanglee Ellipse(que por sua vez têm subclasses Squaree Circle) e, em seguida, simplesmente enviar uma mensagem a qualquer um que Shapesolicite que calcule sua área. Cada Shapeobjeto irá então invocar o método da subclasse com a fórmula apropriada para aquele tipo de objeto.

A passagem distribuída de mensagens fornece aos desenvolvedores uma camada da arquitetura que fornece serviços comuns para construir sistemas compostos de subsistemas que são executados em computadores distintos em locais diferentes e em momentos diferentes. Quando um objeto distribuído está enviando uma mensagem, a camada de mensagens pode cuidar de questões como:

  • Encontrar o processo usando diferentes sistemas operacionais e linguagens de programação, em diferentes locais de onde a mensagem se originou.
  • Salvar a mensagem em uma fila se o objeto apropriado para manipular a mensagem não estiver em execução e, em seguida, chamar a mensagem quando o objeto estiver disponível. Além disso, armazenar o resultado, se necessário, até que o objeto de envio esteja pronto para recebê-lo.
  • Controlar vários requisitos transacionais para transações distribuídas, por exemplo, teste de ACID dos dados.

Passagem de mensagem síncrona versus assíncrona

Passagem de mensagem síncrona

A passagem de mensagens síncronas ocorre entre objetos que estão sendo executados ao mesmo tempo. É usado por linguagens de programação orientadas a objetos, como Java e Smalltalk.

A mensagem síncrona é análoga a uma chamada de função síncrona; assim como o chamador da função espera até que a função seja concluída, o processo de envio espera até que o processo de recebimento seja concluído. Isso pode tornar a comunicação síncrona impraticável para alguns aplicativos. Por exemplo, sistemas grandes e distribuídos podem não funcionar bem o suficiente para serem utilizáveis. Esses sistemas grandes e distribuídos podem precisar operar enquanto alguns de seus subsistemas estão inativos para manutenção, etc.

Imagine um escritório de negócios ocupado com 100 desktops que enviam e-mails uns para os outros usando exclusivamente a transmissão síncrona de mensagens. Um trabalhador desligando seu computador pode fazer com que os outros 99 computadores travem até que o trabalhador ligue o computador novamente para processar um único e-mail.

Passagem de mensagem assíncrona

Com a passagem de mensagem assíncrona, o objeto receptor pode estar inativo ou ocupado quando o objeto solicitante envia a mensagem. Continuando a analogia da chamada de função, é como uma chamada de função que retorna imediatamente, sem esperar que a função chamada seja concluída. As mensagens são enviadas para uma fila onde são armazenadas até que o processo de recebimento as solicite. O processo de recebimento processa suas mensagens e envia os resultados para uma fila para coleta pelo processo original (ou algum próximo processo designado).

O sistema de mensagens assíncronas requer recursos adicionais para armazenamento e retransmissão de dados para sistemas que podem não ser executados simultaneamente e geralmente são gerenciados por um nível intermediário de software (geralmente chamado de middleware ); um tipo comum é o middleware orientado a mensagens (MOM).

O buffer necessário na comunicação assíncrona pode causar problemas quando estiver cheio. É necessário decidir se deve bloquear o remetente ou descartar mensagens futuras. Um remetente bloqueado pode levar a um impasse . Se as mensagens forem eliminadas, a comunicação não é mais confiável.

Híbridos

A comunicação síncrona pode ser construída em cima da comunicação assíncrona usando um Sincronizador . Por exemplo, o α-Sincronizador funciona garantindo que o remetente sempre espere por uma mensagem de confirmação do destinatário. O remetente só envia a próxima mensagem após o recebimento da confirmação. Por outro lado, a comunicação assíncrona também pode ser construída em cima da comunicação síncrona. Por exemplo, os microkernels modernos geralmente fornecem apenas uma primitiva de mensagem síncrona e a mensagem assíncrona pode ser implementada no topo usando encadeamentos auxiliares .

Objetos distribuídos

Os sistemas de passagem de mensagens usam objetos distribuídos ou locais. Com objetos distribuídos, o remetente e o receptor podem estar em computadores diferentes, executando sistemas operacionais diferentes, usando linguagens de programação diferentes, etc. Neste caso, a camada de barramento cuida dos detalhes sobre a conversão de dados de um sistema para outro, envio e recebimento de dados através do rede, etc. O protocolo Remote Procedure Call (RPC) no Unix foi um dos primeiros exemplos disso. Observe que, com esse tipo de passagem de mensagem, não é necessário que o remetente nem o receptor usem a programação orientada a objetos. Os sistemas de linguagem procedural podem ser agrupados e tratados como grandes objetos granulados, capazes de enviar e receber mensagens.

Exemplos de sistemas que suportam objetos distribuídos são: Emerald , ONC RPC , CORBA , Java RMI , DCOM , SOAP , .NET Remoting , CTOS , QNX Neutrino RTOS , OpenBinder e D-Bus . Os sistemas de objetos distribuídos têm sido chamados de sistemas de "nada compartilhado" porque a abstração da passagem de mensagens oculta as mudanças de estado subjacentes que podem ser usadas na implementação do envio de mensagens.


A passagem de mensagens distribuída ou assíncrona tem sobrecarga adicional em comparação com a chamada de um procedimento. Na passagem de mensagens, os argumentos devem ser copiados para a nova mensagem. Alguns argumentos podem conter megabytes de dados, os quais devem ser copiados e transmitidos ao objeto receptor.

As chamadas de procedimento tradicionais diferem da passagem de mensagens em termos de uso de memória, tempo de transferência e localidade. Os argumentos são passados ​​para o receptor normalmente por registradores de propósito geral que não requerem armazenamento adicional nem tempo de transferência, ou em uma lista de parâmetros contendo os endereços dos argumentos (alguns bits). A passagem de endereço não é possível para sistemas distribuídos, pois os sistemas usam espaços de endereço separados.

Web browsers e servidores web são exemplos de processos que se comunicam por passagem de mensagens. Um URL é um exemplo de referência a um recurso sem expor os componentes internos do processo.

Uma chamada de sub-rotina ou invocação de método não sairá até que o cálculo invocado tenha terminado. A passagem de mensagem assíncrona, por outro lado, pode resultar na chegada de uma resposta um tempo significativo após o envio da mensagem de solicitação.

Um manipulador de mensagens irá, em geral, processar mensagens de mais de um remetente. Isso significa que seu estado pode mudar por motivos não relacionados ao comportamento de um único remetente ou processo cliente. Isso contrasta com o comportamento típico de um objeto no qual os métodos estão sendo invocados: espera-se que o último permaneça no mesmo estado entre as invocações do método. Em outras palavras, o manipulador de mensagens se comporta de forma análoga a um objeto volátil .

Modelos matemáticos

Os modelos matemáticos proeminentes de transmissão de mensagens são o modelo do ator e o cálculo do Pi . Em termos matemáticos, uma mensagem é o único meio de passar o controle a um objeto. Se o objeto responder à mensagem, ele terá um método para essa mensagem.

Alan Kay argumentou que a passagem de mensagens é mais importante do que os objetos em OOP e que os próprios objetos costumam ser superestimados. O modelo de programação de objetos distribuídos ao vivo baseia-se nessa observação; ele usa o conceito de um fluxo de dados distribuído para caracterizar o comportamento de um sistema distribuído complexo em termos de padrões de mensagem, usando especificações de alto nível e estilo funcional.

Exemplos

Veja também

Referências

Leitura adicional

links externos