En informática , el paso de mensajes es una técnica para invocar comportamientos (es decir, ejecutar un programa ) en un ordenador . El programa que realiza la invocación envía un mensaje a un proceso (que puede ser un actor o un objeto ) y se basa en ese proceso y su infraestructura de soporte para seleccionar y ejecutar el 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 fundamental para algunos modelos de concurrencia y programación orientada a objetos .
El paso de mensajes es omnipresente en el software informático moderno . Se utiliza para que los objetos que componen un programa trabajen entre sí y para que los objetos y sistemas que se ejecutan en diferentes ordenadores (por ejemplo, Internet ) interactúen. El paso de mensajes puede implementarse mediante diversos mecanismos, incluidos los canales .
Descripción general
El paso de mensajes es una técnica para invocar comportamientos (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 realiza la invocación 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.
El paso de mensajes es una técnica fundamental para la comunicación entre procesos, hilos, objetos o nodos, tanto en sistemas concurrentes como distribuidos. Permite que los componentes de software intercambien información sin compartir memoria, a menudo utilizando canales de comunicación, búferes o middleware para transportar mensajes entre emisores y receptores. En algunos modelos, el paso de mensajes puede implementarse de forma síncrona, donde el emisor espera una respuesta, o de forma asíncrona, donde los mensajes se ponen en cola para su posterior procesamiento. [ 1 ]
La encapsulación se basa en la idea de que los objetos de software pueden invocar servicios de otros objetos sin necesidad de conocer ni preocuparse por cómo se implementan dichos 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 usar sentencias condicionales (IF-THEN) para determinar qué subrutina o función llamar, un desarrollador puede simplemente enviar un mensaje al objeto y este seleccionará el código apropiado según su tipo.
Uno de los primeros ejemplos de cómo se puede usar esto fue en el ámbito de los gráficos por computadora. La manipulación de objetos gráficos implica diversas complejidades. Por ejemplo, el simple uso de la fórmula correcta para calcular el área de una figura cerrada variará dependiendo de si la figura es un triángulo, un rectángulo, una elipse o un círculo. En la programación tradicional, esto resultaría en largas sentencias IF-THEN que comprobarían qué tipo de objeto era la figura y llamarían 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 cualquier Shapepidiéndole que calcule su área. Cada Shapeobjeto invocará entonces el método de la subclase con la fórmula apropiada para ese tipo de objeto. [ 2 ]
El paso de mensajes distribuido proporciona a los desarrolladores una capa de la arquitectura que ofrece servicios comunes para construir sistemas compuestos por subsistemas que se ejecutan en ordenadores distintos, 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:
- Localizar el proceso utilizando diferentes sistemas operativos y lenguajes de programación, en diferentes ubicaciones desde donde se originó el mensaje.
- Si el objeto adecuado para procesar el mensaje no está en ejecución, se guarda en una cola y se procesa cuando el objeto esté disponible. Además, se almacena el resultado, si es necesario, hasta que el objeto emisor esté listo para recibirlo.
- Controlar varios requisitos transaccionales para transacciones distribuidas, por ejemplo atomicidad , consistencia , aislamiento , durabilidad ( ACID ) probando los datos. [ 3 ]
Intercambio de mensajes síncrono frente a asíncrono
Transmisión síncrona de mensajes
El paso de mensajes síncrono se produce entre objetos que se ejecutan simultáneamente. 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 quien llama a la función espera a que esta finalice, el proceso emisor espera a que el proceso receptor acepte el mensaje. [ 4 ] Esto puede hacer que la comunicación síncrona no sea viable para algunas aplicaciones. Por ejemplo, los sistemas distribuidos de gran tamaño pueden no tener un rendimiento suficiente para ser utilizables. Dichos sistemas distribuidos de gran tamaño pueden necesitar operar mientras algunos de sus subsistemas están fuera de servicio por mantenimiento, etc.
Imagina una oficina concurrida con 100 ordenadores de sobremesa que se envían correos electrónicos entre sí mediante el protocolo de mensajería síncrona. Si un empleado apaga su ordenador, los otros 99 se bloquean hasta que el empleado vuelva a encender el suyo para procesar un único correo electrónico.
paso de mensajes asíncrono
Los sistemas de paso de mensajes se pueden clasificar en términos generales según cómo interactúan las operaciones de envío y recepción con los procesos en ejecución. En el paso de mensajes síncrono , el proceso emisor puede bloquearse hasta que el receptor haya aceptado el mensaje, lo que garantiza una estrecha coordinación. En los modelos asíncronos , el emisor continúa la ejecución después de enviar un mensaje, y los mensajes se almacenan normalmente en una cola o búfer hasta que el proceso receptor los recupera. [ 5 ]
Con el paso de mensajes asíncrono, el objeto receptor puede estar inactivo o ocupado cuando el objeto solicitante envía el mensaje. Siguiendo con la analogía de la llamada a función, es como una llamada a función que regresa inmediatamente, sin esperar a que la función llamada finalice. 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 el proceso original (o algún proceso siguiente designado) los recoja. [ 6 ]
La mensajería asíncrona requiere capacidades adicionales para almacenar y retransmitir datos en sistemas que pueden no ejecutarse simultáneamente, y generalmente se gestiona mediante un nivel intermedio de software (a menudo llamado middleware ); un tipo común es el middleware orientado a mensajes (MOM).
El búfer necesario en la comunicación asíncrona puede causar problemas cuando se llena. Es necesario decidir si bloquear al remitente o descartar los mensajes futuros. Un remitente bloqueado puede provocar un interbloqueo . Si se pierden mensajes, la comunicación deja de ser fiable.
Híbridos
La comunicación síncrona se puede construir sobre la comunicación asíncrona 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 asíncrona también se puede construir sobre la comunicación síncrona. Por ejemplo, los microkernels modernos generalmente solo proporcionan una primitiva de mensajería síncrona , y la mensajería asíncrona se puede implementar sobre ella mediante el uso de hilos auxiliares .
objetos distribuidos
Los sistemas de paso de mensajes utilizan objetos distribuidos o locales. Con los objetos distribuidos, el emisor y el receptor pueden estar en ordenadores diferentes, ejecutar sistemas operativos distintos, utilizar lenguajes de programación diferentes, etc. En este caso, la capa de bus se encarga de los detalles relacionados con 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 paso de mensajes, no es necesario que ni el emisor ni el receptor utilicen programación orientada a objetos. Los sistemas de lenguajes procedimentales pueden encapsularse y tratarse como objetos de gran tamaño capaces de enviar y recibir mensajes. [ 7 ]
Algunos 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 conocen como sistemas "sin recursos compartidos" 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 asíncrono conlleva una sobrecarga adicional en comparación con la llamada a un procedimiento. En el paso de mensajes, los argumentos deben copiarse al nuevo mensaje. Algunos argumentos pueden contener megabytes de datos, los cuales deben copiarse y transmitirse en su totalidad al objeto receptor.
Las llamadas a procedimientos tradicionales difieren del paso de mensajes en cuanto al uso de memoria, el tiempo de transferencia y la localidad. Los argumentos se pasan al receptor normalmente mediante registros de propósito general que no requieren almacenamiento ni tiempo de transferencia adicionales, 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 estos 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 detalles internos del proceso.
Una llamada a una subrutina o invocación de un método no finalizará hasta que el cálculo invocado haya concluido. En cambio, el paso de mensajes asíncrono puede provocar que la respuesta llegue mucho tiempo después de que se haya enviado el mensaje de solicitud.
Un gestor de mensajes, por lo general, procesa mensajes de más de un remitente. Esto significa que su estado puede cambiar por razones ajenas al 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 las invocaciones de métodos. En otras palabras, el gestor de mensajes se comporta de forma análoga a un objeto volátil .
Modelos matemáticos
Los modelos matemáticos más destacados para el paso de mensajes son el modelo de actor y el cálculo Pi . [ 8 ] [ 9 ] En términos matemáticos, un mensaje es el único medio para transferir el control a un objeto. Si el objeto responde al mensaje, dispone de un método para procesarlo.
Alan Kay ha argumentado que el paso de mensajes es más importante que los objetos en la POO, y que a menudo se sobrevalora la importancia de los objetos mismos. El modelo de programación de objetos distribuidos en tiempo real 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, mediante especificaciones de alto nivel y estilo funcional. [ 10 ]
Ejemplos
Véase también
- Mensaje activo
- computación distribuida
- Bucle de eventos
- Patrón de mensajería
- Transmisión de mensajes en clústeres de computadoras
- Interfaz de paso de mensajes
- Máquina virtual paralela (PVM)
- Lenguajes de programación que incluyen el paso de mensajes como una característica central:
Referencias
- ↑ Personal editorial. "Transmisión de mensajes - Glosario" . DevX . Consultado el 3 de enero de 2026 .
- ↑ Goldberg, Adele; David Robson (1989). Smalltalk-80 The Language . Addison Wesley. págs. 5–16 . ISBN 0-201-13688-0.
- ↑ Orfali, Robert (1996). The Essential Client/Server Survival Guide . Nueva York: Wiley Computer Publishing. págs. 1–22 . ISBN 0-471-15325-7.
- ↑ Gehani, NH (1990). "Paso de mensajes en C concurrente: síncrono versus asíncrono" . Software: Practice and Experience . 20 (6): 571– 592. doi : 10.1002/spe.4380200605 . ISSN 1097-024X .
- ↑ "2.3.3. Paso de mensajes" . d3s.mff.cuni.cz. Consultado el 3 de enero de 2026 .
- ↑ Orfali, Robert (1996). The Essential Client/Server Survival Guide . Nueva York: Wiley Computer Publishing. págs. 95–133 . ISBN 0-471-15325-7.
- ↑ Orfali, Robert (1996). The Essential Client/Server Survival Guide . Nueva York: Wiley Computer Publishing. págs. 375–397 . ISBN 0-471-15325-7.
- ↑ Milner, Robin (enero de 1993). "Elementos de interacción: conferencia del premio Turing" . Communications of the ACM . 36 (1): 78– 89. doi : 10.1145/151233.151240 .
- ↑ Hewitt, Carl; Bishop, Peter; Steiger, Richard (20 de agosto de 1973). "Un formalismo ACTOR modular universal para la inteligencia artificial" . Actas de la 3.ª Conferencia Internacional Conjunta sobre Inteligencia Artificial . IJCAI'73. San Francisco, CA, EE. UU.: Morgan Kaufmann Publishers Inc.: 235–245 .
- ↑ Kay, Alan. "prototipos vs clases fue: Re: HotSpot de Sun" . lists.squeakfoundation.org . Consultado el 2 de enero de 2014 .
- ↑ "Uso del paso de mensajes para transferir datos entre hilos - El lenguaje de programación Rust" . Rust-lang.org .
Lecturas adicionales
- Ramachandran, U.; M. Solomon; M. Vernon (1987). "Soporte de hardware para la comunicación entre procesos" . Actas del 14.º simposio internacional anual sobre arquitectura de computadoras . ACM Press.
- Dally, William. "La máquina de caramelos de goma" . Consultado el 7 de junio de 2013 .
- McQuillan, John M.; David C. Walden (1975). "Algunas consideraciones para un sistema de comunicación entre procesos basado en mensajes de alto rendimiento" . Actas del taller ACM SIGCOMM/SIGOPS de 1975 sobre comunicaciones entre procesos . ACM Press.
- Shimizu, Toshiyuki; Takeshi Horie; Hiroaki Ishihata (1992). "Soporte para comunicación de mensajes de baja latencia para el AP1000" . Actas del 19.º simposio internacional anual sobre arquitectura de computadoras . ACM Press.
Enlaces externos
- Historial de paquetes de paso de mensajes
- Arquitectura de computación distribuida
- Comunicación entre procesos