消息传递
在计算机科学中,消息传递是一种在计算机上调用行为(即运行程序)的技术。调用程序将消息发送到过程(可能是演员或对象),并依靠该过程及其支持基础结构来选择并运行一些适当的代码。消息传递与传统编程不同,在该编程中,该过程,子例程或函数被直接通过名称调用。消息传递是某些并发模型和面向对象的编程的关键。
消息传递在现代计算机软件中无处不在。它被用作组成程序相互配合的对象的一种方式,并用作在不同计算机(例如, Internet )上运行的对象和系统进行交互的方法。消息传递可以通过包括渠道在内的各种机制来实现。
概述
消息传递是一种在计算机上调用行为(即运行程序)的技术。与按名称调用程序调用程序的传统技术相反,消息传递使用对像模型将一般函数与特定实现区分开。调用程序发送消息并依赖对象选择和执行适当的代码。使用中间层的理由本质上分为两类:封装和分布。
封装是一种想法,即软件对象应该能够在其他对像上调用服务,而无需知道或关心如何实施这些服务。封装可以减少编码逻辑的数量,并使系统更可维护。例如,而不是具有确定要调用哪个子例程或函数的语句,可以将消息发送给对象,而对象将根据其类型选择适当的代码。
如何使用它的第一个示例之一是在计算机图形的领域中。操纵图形对像有各种复杂性。例如,只需使用正确的公式计算封闭形状的面积就会根据形状是三角形,矩形,椭圆或圆而变化。在传统的计算机编程中,这将导致长时间的语句测试该形状是什么样的对象并调用适当的代码。处理此操作的面向对象的方法是定义一个名为Shape
的类,该类别具有子类,例如Rectangle
和Ellipse
(又有子类Square
和Circle
),然后简单地将消息发送到任何Shape
,要求其计算其区域。然后,每个Shape
对象将使用适合该对象的公式调用子类的方法。
分布式消息传递为开发人员提供了一层体系结构,该架构提供了通用服务,以构建由在不同位置和不同时间在不同位置的计算机上运行的子系统组成的系统。当分布式对象发送消息时,消息传递层可以解决以下问题:
- 在消息起源的不同位置,使用不同的操作系统和编程语言找到过程。
- 如果适当的对象处理消息当前未运行,则将消息保存在队列上,然后在对象可用时调用消息。另外,如果需要,存储结果,直到发送对像已准备好接收它为止。
- 控制分布式交易的各种交易要求,例如原子,一致性,隔离,耐用性(酸)测试数据。
同步和异步消息传递
同步消息传递
同步消息传递发生在同时运行的对象之间。它由面向对象的编程语言(例如Java和SmallTalk)使用。
同步消息类似于同步函数调用。就像功能呼叫者等待函数完成一样,发送过程等待直到接收过程完成。这可以使某些应用程序无法正常运行。例如,大型分布式系统的性能可能不够好,无法使用。如此大的分布式系统可能需要运行,而某些子系统则无法进行维护等。
想像一个忙碌的商务办公室,其中有100台台式计算机,可以使用同步消息专门通过同步消息将电子邮件互相发送。一个关闭计算机的工人会导致其他99台计算机冻结,直到工人重新打开计算机来处理一封电子邮件。
异步消息传递
通过异步消息传递接收对象时,请求对象发送消息时可能会下降或忙碌。继续函数调用类比,就像一个函数调用,它立即返回,而无需等待调用函数完成。消息将发送到排队存储的队列,直到接收过程请求它们为止。接收过程过程中其消息并将结果发送到原始过程(或某些指定下一步过程)的队列以进行拾取。
异步消息传递需要其他功能来存储和重新传输可能不会同时运行的系统,并且通常由中间的软件级别处理(通常称为中间件);一种常见的类型是以消息为导向的中间件(MOM)。
同步通信中所需的缓冲区可能会导致问题。必须做出决定是否阻止发件人或是否丢弃未来的消息。封锁的发件人可能导致僵局。如果删除消息,则通信将不再可靠。
杂种
同步通信可以通过使用同步器在异步通信之上构建。例如,通过确保发件人始终等待接收器的确认消息来起作用。在收到确认后,发件人仅发送下一条消息。另一方面,异步通信也可以在同步通信之上构建。例如,现代微核电通常仅提供同步消息传递原始和异步消息传递,可以通过使用辅助螺纹在顶部实现。
分布式对象
消息通话系统使用分布式或本地对象。使用分布式对象,发件人和接收器可能在不同的计算机上,运行不同的操作系统,使用不同的编程语言等。在这种情况下,总线层会处理有关将数据从一个系统转换为另一个系统的详细信息,并在整个系统上发送和接收数据网络等。UNIX中的远程过程调用(RPC)协议是一个早期的示例。请注意,通过这种类型的消息传递,发件人或接收方使用面向对象的编程并不需要。程序语言系统可以被包装和处理为能够发送和接收消息的大粒子对象。
支持分布式对象的系统的示例是:翡翠, ONC RPC , Corba , Java RMI , DCOM , SOAP , .NET远程, CTO , QNX NETINPRINO RTOS ,OPENBIND, OPENBIND和D-BUS 。分布式对象系统被称为“共享”系统,因为消息传递的抽象隐藏了可能用于实现发送消息的状态变化。
与调用程序相比,分布式或异步消息传递的消息具有额外的开销。在消息通话中,必须将参数复制到新消息中。一些参数可以包含大量数据,所有这些都必须复制并传输到接收对象。
传统的过程调用不同于记忆使用,传输时间和局部性方面的消息。参数通常通过通用寄存器传递给接收器,不需要额外的存储时间或传输时间,或者在包含参数地址的参数列表中(几个位)。由于系统使用单独的地址空间,因此无法进行地址通话。
Web浏览器和Web服务器是通过消息通信的过程的示例。 URL是引用资源而不曝光过程内部的一个示例。
在调用计算终止之前,子例程呼叫或方法调用将不会退出。相比之下,异步消息传递可能会导致响应在发送请求消息后到达。
一般而言,消息处理程序将来自多个发件人的处理消息。这意味着其状态可以改变,原因与单个发件人或客户端流程的行为无关。这与所调用方法的对象的典型行为相反:后者有望保持在方法调用之间的相同状态。换句话说,消息处理程序的行为与挥发性对象相似。
数学模型
消息传递的突出数学模型是Actor模型和Pi演算。用数学术语,消息是传递控制对象的单一手段。如果对象响应该消息,则它具有该消息的方法。
艾伦·凯(Alan Kay)认为,信息传递比OOP中的对象更为重要,而且对象本身通常会过分强调。实时分布式对象编程模型基于此观察结果;它使用分布式数据流的概念来表征复杂分布式系统的行为,并使用高级,功能风格的规范来表征消息模式。