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 se basa en ese proceso y su infraestructura de soporte para luego seleccionar y ejecutar un 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 requerida ] Se utiliza como una forma para que los objetos que componen un programa trabajen entre sí y como un medio para que los objetos y sistemas que se ejecutan en diferentes computadoras (por ejemplo, Internet ) interactúen. El paso de mensajes puede implementarse mediante varios mecanismos, incluidos los canales .
El paso de mensajes es una técnica para invocar un comportamiento (es decir, ejecutar un programa) en una computadora. A diferencia de 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 se basa en el objeto para seleccionar y ejecutar el código apropiado. Las justificaciones para usar 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 instrucciones 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 campo de los gráficos de computadora. Existen 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, rectángulo, elipse o círculo. En la programación de computadoras tradicional, esto daría como resultado largas declaraciones IF-THEN que prueban qué tipo de objeto era la forma y llaman al código apropiado. La forma orientada a objetos de manejar esto es definir una clase llamada Shape
con subclases como Rectangle
y Ellipse
(que a su vez tienen subclases Square
y Circle
) y luego simplemente enviar un mensaje a cualquier Shape
pidiéndole que calcule su área. Cada Shape
objeto invocará entonces el método de la subclase con la fórmula apropiada para ese tipo de objeto. [1]
El paso de mensajes distribuidos proporciona a los desarrolladores una capa de la arquitectura que proporciona servicios comunes para crear sistemas compuestos por subsistemas que se ejecutan en distintas computadoras 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:
El paso de mensajes sincrónicos se produce entre objetos que se ejecutan al mismo tiempo. Lo utilizan lenguajes de programación orientados a objetos como Java y Smalltalk .
La mensajería sincrónica es análoga a una llamada a una función sincrónica; así como el que llama a la función espera hasta que la función se complete, 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 sea viable 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 con mucha actividad y 100 computadoras de escritorio que se envían correos electrónicos entre sí mediante el uso exclusivo de mensajes sincrónicos. Si un trabajador apaga su computadora, las otras 99 computadoras se bloquean hasta que el trabajador vuelva a encender la suya para procesar un solo correo electrónico.
En el caso de la transmisión asincrónica de mensajes, el objeto receptor puede estar inactivo u ocupado cuando el objeto solicitante envía el mensaje. Siguiendo con la analogía de la llamada a una función, es como una llamada a una función que retorna inmediatamente, sin esperar a que la función llamada se complete. Los mensajes se envían a una cola donde se almacenan hasta que el proceso receptor los solicita. El proceso receptor procesa sus mensajes y envía los resultados a una cola para que los recoja el proceso original (o algún proceso siguiente designado). [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 intermedio 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 una decisión sobre si bloquear al remitente o si descartar mensajes futuros. Un remitente bloqueado puede provocar un bloqueo . Si se descartan mensajes, la comunicación ya no es confiable.
La comunicación sincrónica se puede construir sobre la comunicación asincrónica mediante el uso de un sincronizador . Por ejemplo, el α-sincronizador funciona asegurando que el remitente siempre espere un mensaje de confirmación del receptor. El remitente solo envía el siguiente mensaje después de haber recibido la confirmación. Por otro lado, la comunicación asincrónica también se puede construir sobre la comunicación sincrónica. 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 sobre la comunicación sincrónica mediante subprocesos auxiliares .
Los sistemas de transmisión de mensajes utilizan objetos distribuidos o locales. Con los objetos distribuidos, el emisor y el receptor pueden estar en diferentes computadoras, ejecutar diferentes sistemas operativos, usar diferentes lenguajes de programación, etc. En este caso, la capa de bus se ocupa 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 de la red, etc. El protocolo de Llamada a Procedimiento Remoto (RPC) en Unix fue un ejemplo temprano de esto. Con este tipo de transmisión de mensajes, no es un requisito que el emisor ni el receptor utilicen programación orientada a objetos. Los sistemas de lenguaje procedimental se pueden encapsular y tratar como objetos de granularidad grande 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 se han denominado sistemas de "nada compartido" porque la abstracción de paso de mensajes oculta los cambios de estado subyacentes que pueden utilizarse 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 la llamada a un procedimiento. En el paso de mensajes, los argumentos deben copiarse en el nuevo mensaje. Algunos argumentos pueden contener megabytes de datos, que deben copiarse y transmitirse al objeto receptor.
Las llamadas a procedimientos tradicionales difieren 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 adicional ni tiempo de transferencia, o en una lista de parámetros que contiene las direcciones de los argumentos (unos pocos bits). El paso de direcciones no es posible en 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 referencia a un recurso sin exponer los elementos internos del proceso.
Una llamada a una subrutina o una invocación de un método no se cerrará hasta que el cálculo invocado haya terminado. Por el contrario, el paso asincrónico de mensajes puede dar como resultado que una respuesta llegue un tiempo considerable después de que se envió el mensaje de solicitud.
En general, un manejador de mensajes procesará [5] mensajes de más de un remitente. Esto significa que su estado puede cambiar por razones no relacionadas con el comportamiento de un único remitente o proceso cliente. Esto contrasta con el comportamiento típico de un objeto sobre el que se invocan métodos: se espera que este último permanezca en el mismo estado entre invocaciones de métodos. En otras palabras, el manejador de mensajes se comporta de manera análoga a un objeto volátil .
Los modelos matemáticos más destacados de transmisión de mensajes son el modelo de 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 sostenido que el paso de mensajes es más importante que los objetos en la programación orientada a objetos, y que a menudo se da demasiada importancia a los objetos en sí. El modelo de programación de objetos distribuidos en vivo se basa en esta observación; utiliza el concepto de un flujo de datos distribuido para caracterizar el comportamiento de un sistema distribuido complejo en términos de patrones de mensajes, utilizando especificaciones de alto nivel y de estilo funcional. [8]
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )