stringtranslate.com

Paso de mensajes

En informática , el paso de mensajes es una técnica para invocar un comportamiento (es decir, ejecutar un programa ) en una computadora . El programa que invoca envía un mensaje a un proceso (que puede ser un actor u objeto ) y confía en ese proceso y su infraestructura de soporte para luego seleccionar y ejecutar algún código apropiado. El paso de mensajes difiere de la programación convencional donde un proceso, subrutina o función se invoca directamente por su nombre. El paso de mensajes es clave para algunos modelos de concurrencia y programación orientada a objetos .

El paso de mensajes es omnipresente en el software informático moderno . [ cita necesaria ] Se utiliza como una forma para que los objetos que componen un programa funcionen entre sí y como un medio para que interactúen los objetos y sistemas que se ejecutan en diferentes computadoras (por ejemplo, Internet ). El paso de mensajes puede implementarse mediante varios mecanismos, incluidos canales .

Descripción general

El paso de mensajes es una técnica para invocar un comportamiento (es decir, ejecutar un programa) en una computadora. En contraste con la técnica tradicional de llamar a un programa por su nombre, el paso de mensajes utiliza un modelo de objetos para distinguir la función general de las implementaciones específicas. El programa que invoca envía un mensaje y confía en el objeto para seleccionar y ejecutar el código apropiado. Las justificaciones para utilizar una capa intermedia se dividen esencialmente en dos categorías: encapsulación y distribución.

La encapsulación es la idea de que los objetos de software deberían poder invocar servicios en otros objetos sin saber ni preocuparse por cómo se implementan esos servicios. La encapsulación puede reducir la cantidad de lógica de codificación y hacer que los sistemas sean más fáciles de mantener. Por ejemplo, en lugar de tener declaraciones IF-THEN que determinen qué subrutina o función llamar, un desarrollador puede simplemente enviar un mensaje al objeto y el objeto seleccionará el código apropiado según su tipo.

Uno de los primeros ejemplos de cómo se puede utilizar esto fue en el ámbito de los gráficos por computadora. Hay varias complejidades involucradas en la manipulación de objetos gráficos. Por ejemplo, simplemente usar la fórmula correcta para calcular el área de una forma cerrada variará dependiendo de si la forma es un triángulo, un rectángulo, una elipse o un círculo. En la programación informática tradicional, esto daría lugar a largas declaraciones SI-ENTONCES que prueban qué tipo de objeto es la forma y llaman al código apropiado. La forma orientada a objetos de manejar esto es definir una clase llamada Shapecon subclases como Rectangley Ellipse(que a su vez tienen subclases Squarey Circle) y luego simplemente enviar un mensaje a cualquiera Shapepidiéndole que calcule su área. Luego, cada Shapeobjeto invocará el método de la subclase con la fórmula apropiada para ese tipo de objeto. [1]

El paso distribuido de mensajes proporciona a los desarrolladores una capa de arquitectura que proporciona servicios comunes para construir sistemas formados por subsistemas que se ejecutan en computadoras dispares en diferentes ubicaciones y en diferentes momentos. Cuando un objeto distribuido envía un mensaje, la capa de mensajería puede encargarse de cuestiones como:

Paso de mensajes sincrónico versus asincrónico

Paso de mensajes sincrónico

El paso de mensajes sincrónico se produce entre objetos que se ejecutan al mismo tiempo. Es utilizado por lenguajes de programación orientados a objetos como Java y Smalltalk .

La mensajería síncrona es análoga a una llamada a función síncrona; Así como la persona que llama a la función espera hasta que se complete la función, el proceso de envío espera hasta que se complete el proceso de recepción. Esto puede hacer que la comunicación sincrónica no funcione para algunas aplicaciones. Por ejemplo, es posible que los sistemas distribuidos de gran tamaño no funcionen lo suficientemente bien como para ser utilizables. Es posible que estos sistemas distribuidos de gran tamaño deban funcionar mientras algunos de sus subsistemas están inactivos por mantenimiento, etc.

Imagine una oficina comercial ocupada con 100 computadoras de escritorio que se envían correos electrónicos entre sí utilizando exclusivamente el paso de mensajes sincrónicos. Un trabajador que apaga su computadora puede hacer que las otras 99 computadoras se congelen hasta que el trabajador vuelva a encenderla para procesar un solo correo electrónico.

Paso de mensajes asincrónicos

Con el paso de mensajes asincrónicos, el objeto receptor puede estar inactivo u ocupado cuando el objeto solicitante envía el mensaje. Continuando con la analogía de la llamada a función, es como una llamada a función que regresa inmediatamente, sin esperar a que se complete la función llamada. Los mensajes se envían a una cola donde se almacenan hasta que el proceso de recepción los solicita. El proceso receptor procesa sus mensajes y envía los resultados a una cola para que el proceso original (o algún proceso siguiente designado) los recoja. [3]

La mensajería asincrónica requiere capacidades adicionales para almacenar y retransmitir datos para sistemas que pueden no ejecutarse simultáneamente y generalmente son manejados por un nivel intermediario de software (a menudo llamado middleware ); un tipo común es el middleware orientado a mensajes (MOM).

El buffer requerido en la comunicación asincrónica puede causar problemas cuando está lleno. Se debe tomar la decisión de bloquear al remitente o descartar mensajes futuros. Un remitente bloqueado puede provocar un punto muerto . Si se pierden los mensajes, la comunicación ya no es confiable.

Híbridos

La comunicación sincrónica se puede construir además de la comunicación asincrónica mediante el uso de un Sincronizador . Por ejemplo, el α-Synchronizer funciona asegurando que el remitente siempre espere un mensaje de confirmación del receptor. El remitente envía el siguiente mensaje sólo después de recibir el acuse de recibo. Por otro lado, la comunicación asincrónica también se puede construir sobre la comunicación síncrona. Por ejemplo, los microkernels modernos generalmente solo proporcionan una primitiva de mensajería sincrónica [ cita requerida ] y la mensajería asincrónica se puede implementar en la parte superior mediante el uso de subprocesos auxiliares .

Objetos distribuidos

Los sistemas de paso de mensajes utilizan objetos distribuidos o locales. Con objetos distribuidos, el remitente y el receptor pueden estar en diferentes computadoras, ejecutando diferentes sistemas operativos, usando diferentes lenguajes de programación, etc. En este caso, la capa de bus se encarga de los detalles sobre la conversión de datos de un sistema a otro, el envío y la recepción de datos a través del red, etc. El protocolo de llamada a procedimiento remoto (RPC) en Unix fue un ejemplo temprano de esto. Tenga en cuenta que con este tipo de transmisión de mensajes no es necesario que ni el remitente ni el receptor utilicen programación orientada a objetos. Los sistemas de lenguaje procedimental pueden encapsularse y tratarse como grandes objetos granulados capaces de enviar y recibir mensajes. [4]

Ejemplos de sistemas que admiten objetos distribuidos son: Emerald , ONC RPC , CORBA , Java RMI , DCOM , SOAP , .NET Remoting , CTOS , QNX Neutrino RTOS , OpenBinder y D-Bus . Los sistemas de objetos distribuidos han sido llamados sistemas de "nada compartido" porque la abstracción de paso de mensajes oculta cambios de estado subyacentes que pueden usarse en la implementación del envío de mensajes.

El paso de mensajes distribuido o asincrónico tiene una sobrecarga adicional en comparación con llamar a un procedimiento. Al pasar mensajes, los argumentos se deben copiar al nuevo mensaje. Algunos argumentos pueden contener megabytes de datos, todos los cuales deben copiarse y transmitirse al objeto receptor.

Las llamadas a procedimientos tradicionales se diferencian del paso de mensajes en términos de uso de memoria, tiempo de transferencia y localidad. Los argumentos se pasan al receptor normalmente mediante registros de propósito general que no requieren almacenamiento ni tiempo de transferencia adicional, o en una lista de parámetros que contiene las direcciones de los argumentos (unos pocos bits). El paso de direcciones no es posible para los sistemas distribuidos ya que los sistemas utilizan espacios de direcciones separados.

Los navegadores web y los servidores web son ejemplos de procesos que se comunican mediante el paso de mensajes. Una URL es un ejemplo de cómo hacer referencia a un recurso sin exponer los aspectos internos del proceso.

Una llamada a una subrutina o a un método no finalizará hasta que el cálculo invocado haya terminado. Por el contrario, el paso de mensajes asincrónico puede dar como resultado que una respuesta llegue un tiempo significativo después de que se envió el mensaje de solicitud.

Un controlador de mensajes, en general, procesará [5] mensajes de más de un remitente. Esto significa que su estado puede cambiar por motivos no relacionados con el comportamiento de un único proceso remitente o cliente. Esto contrasta con el comportamiento típico de un objeto sobre el cual se invocan métodos: se espera que este último permanezca en el mismo estado entre invocaciones de métodos. En otras palabras, el controlador de mensajes se comporta de manera análoga a un objeto volátil .

Modelos matemáticos

Los modelos matemáticos destacados de transmisión de mensajes son el modelo Actor y el cálculo Pi . [6] [7] En términos matemáticos, un mensaje es el único medio para pasar el control a un objeto. Si el objeto responde al mensaje, tiene un método para ese mensaje.

Alan Kay ha argumentado que el paso de mensajes es más importante que los objetos en la programación orientada a objetos, y que a menudo se sobreenfatiza los objetos mismos. El modelo de programación de objetos distribuidos en vivo se basa en esta observación; Utiliza el concepto de flujo de datos distribuido para caracterizar el comportamiento de un sistema distribuido complejo en términos de patrones de mensajes, utilizando especificaciones de estilo funcional de alto nivel. [8]

Ejemplos

Ver también

Referencias

  1. ^ Goldberg, Adela; David Robson (1989). Smalltalk-80 El idioma . Addison Wesley. págs. 5-16. ISBN 0-201-13688-0.
  2. ^ Orfali, Robert (1996). La guía esencial de supervivencia cliente/servidor. Nueva York: Wiley Computer Publishing. págs. 1–22. ISBN 0-471-15325-7.
  3. ^ Orfali, Robert (1996). La guía esencial de supervivencia cliente/servidor. Nueva York: Wiley Computer Publishing. págs. 95-133. ISBN 0-471-15325-7.
  4. ^ Orfali, Robert (1996). La guía esencial de supervivencia cliente/servidor. Nueva York: Wiley Computer Publishing. págs. 375–397. ISBN 0-471-15325-7.
  5. ^ "Proceso de ocultar mensajes". Mensaje . 2022-04-13 . Consultado el 12 de abril de 2022 .
  6. ^ Milner, Robin (enero de 1993). "Elementos de interacción: conferencia del premio Turing". Comunicaciones de la ACM . 36 (1): 78–89. doi : 10.1145/151233.151240 .
  7. ^ Carl Hewitt; Pedro Obispo; Richard Steiger (1973). "Un formalismo de actor modular universal para la inteligencia artificial". IJCAI. {{cite journal}}: Citar diario requiere |journal=( ayuda )
  8. ^ Kay, Alan. "prototipos versus clases fue: Re: Sun's HotSpot". listas.squeakfoundation.org . Consultado el 2 de enero de 2014 .
  9. ^ "Uso del paso de mensajes para transferir datos entre subprocesos: el lenguaje de programación Rust". Rust-lang.org .

Otras lecturas

enlaces externos