-
2020-08-15 15:31:22
直接消息传递系统 —— 利用OS所提供的发送命令(原语)
-
直接通信原语
1)对称寻址方式 —— 要求发送进程和接收进程都必须以显式方式提供对方的标识符。
系统提供以下两条通信命令:
send(receiver,message);
receive(sender,message);不足:一旦改变进程的名称,则可能需要检查所有其他进程的定义,有关对该进程旧名称的所有引用都必须查找到,以便将其修改为新名称,显然,这样的方式不利于实现进程定义的模块化。
2)非对称寻址方式 —— 接收进程可能需要与多个发送进程通信,无法事先指定发送进程。因此,在接受进程的原语中,不需要命名发送进程,只填写表示源进程的参数,即完成通信后的返回值,而发送进程仍需要命名接收进程。
send(receiver,message);
receive(id,message); 接收来自任何进程的消息,id变量可设置为进行通信的发送方进程id或名字。 -
消息格式
比较短的定长消息格式 —— 减少对消息的处理和存储开销
变长的消息格式 —— 处理、存储方面付出更多的开销,方便用户 -
进程的同步方式
在完成消息的发送或接收后,存在三种情况:
1)发送进程阻塞,接收进程阻塞 —— 这种情况主要用于进程之间紧密同步,发送进程和接收进程之间无缓冲时。
2)发送进程不阻塞,接收进程阻塞 —— 发送进程不阻塞,因而它可以尽快地把一个或多个消息发送给多个目标;而接收进程平时处于阻塞状态,直到发送进程发来消息时才被唤醒
3)发送进程不阻塞,接收进程不阻塞 —— 发送进程和接收进程都在忙于自己的事情,仅当发生某事件使它无法继续运行时,才把自己阻塞起来等待 -
通信链路
通信双方建立链路,两种方式:1)由发送进程在通信之前用显式的“建立连接”命令(原语)请求系统为之建立一条通信链路,在链路使用完成后拆除链路 —— 主要用于计算机网络
2)发送进程无须明确提出建立链路的请求,只须利用系统提供的发送命令(原语),系统会自动地为之建立一条链路 —— 主要用于单机系统中
根据通信方式的不同,把链路分成两种:
1)单向通信链路
2)双向通信链路
间接通信方式 —— 信箱通信
进程之间的通信,需要通过某种中间实体来完成,该实体建立在随机存储器的公用缓冲区上,用来暂存发送进程发送给目标进程的消息;接收进程可以从该实体中取出发送进程发送给自己的消息,通常把这种中间实体称为邮箱,每个邮箱都有唯一的标识符。消息在邮箱中可以安全地保存,只允许核准的目标用户随时读取。既可实现实时通信,又可实现非实时通信。-
信箱的结构 —— 一种数据结构,两个部分
1)信箱头,用以存放有关信箱的描述信息 —— 信箱标识符、信箱的拥有者、信箱口令、信箱的空格数等
2)信箱体 —— 由若干个可以存放消息的信箱格组成,信箱格的数目以及每格的大小是在创建信箱时确定的 -
信箱通信原语
1)邮箱的创建和撤销
进程可利用邮箱创建原语来建立一个新邮箱,创建者进程应给出邮箱名字、邮箱属性(公用、私用或共享);对于共享邮箱,还应给出共享者的名字,当进程不再需要读邮箱时,可用邮箱撤销原语将之撤销。
2)消息的发送和接收。当进程之间要利用邮箱进行通信时,必须使用共享邮箱,并利用系统提供的通信原语进行通信。
Send(mailbox,message);
Receive(mailbox,message); -
信箱的类型
1)私用邮箱。用户进程可为自己建立一个新邮箱,并作为该进程的一部分。邮箱的拥有者有权从邮箱中读取消息,其他用户则只能将自己构成的消息发送到该邮箱中,可采用单向通信链路的邮箱来实现。当拥有该邮箱的进程结束时,邮箱也随之消失。2)公用邮箱。由操作系统创建,并提供给系统种的所有核准进程使用。核准用户既可把消息发到该邮箱,也可从邮箱读取给自己的消息,应采用双向通信链路的邮箱来实现。在系统运行期间始终存在。
3)共享邮箱。由某进程创建,在创建时或创建后指明它是可共享的,同时须指出共享进程的名字。邮箱的拥有者和共享者都有权从邮箱中取走发送给自己的消息。
发送进程和接收进程存在以下四种关系:
1)一对一
2)多对一
3)一对多
4)多对多
更多相关内容 -
-
一些消息传递:一个具有2个微服务的项目,使用消息传递系统进行通信
2021-02-12 23:10:49一些消息 一个具有2个应用程序的项目,使用消息传递系统进行通信 Sprint Boot Spring云流 Spring网 阿帕奇·卡夫卡 码头工人 -
即时消息传递系统编程源代码解析02
2008-03-04 14:17:45本书详细地描述了如何编写即时消息传递补应用程序,包括即时消 息传递的概念、设计方法和源程序代码以及程序代码的详细解释。 全书简要描述了即时消息传递应用的概念、范围及其演变过程;叙 述了应用... -
即时消息传递系统编程源代码解析
2008-03-04 14:06:36<br>本书详细地描述了如何编写即时消息传递补应用程序,包括即时消 息传递的概念、设计方法和源程序代码以及程序代码的详细解释。 全书简要描述了即时消息传递应用的概念、范围及其演变过程;叙 述了... -
分布式系统的现代消息传递
2019-06-13 15:29:27论文《分布式系统的现代消息传递》Modern Messaging for Distributed Sytems L Magnoni 通过IOP出版有限公司出版许可物理学学报:会议系列,608卷,第1会议 作者电子邮件 luca.magnoni@cern.ch 作者隶属...论文 《分布式系统的现代消息传递》Modern Messaging for Distributed Sytems
L Magnoni
通过IOP出版有限公司出版许可物理学学报:会议系列, 608卷, 第1会议
作者电子邮件
作者隶属关系
1欧洲核子研究中心,欧洲粒子物理实验室(CERN),瑞士日内瓦
引文
L Magnoni 2015 J. 物理学:Conf。序列。608 012038
抽象
现代软件应用程序很少孤立存在,而现在通常的做法是依赖服务或使用远程实体提供的信息。
在这种分布式架构中,集成是关键。
十多年来,消息传递是解决分布式性质挑战的参考解决方案,例如网络不可靠性,
生产者和消费者的强烈耦合以及应用的异质性。
由于强大的社区以及对标准和整合的共同努力,消息代理如今已成为许多项目和服务的传输层构建块,
无论是在物理界还是在外面。此外,近年来出现了新一代的消息服务,
重点关注低延迟和高性能用例,突破了消息传递应用程序的界限。
本文将介绍分布式应用程序的消息传递解决方案,概述主要概念,技术和服务。
1.介绍
本文概述了消息传递概念,功能和现代技术。
首先介绍分布式通信和系统集成的消息传递。
然后提供对主要消息传递功能的回顾,然后概述从代理到无代理系统的消息传递的主要技术。
最后,介绍了有关使用消息传递解决分布式应用程序通信问题的成功案例列表。
2.用于松散耦合通信的消息传递
现代分布式系统可以包括数百个(如果不是数千个)应用程序以多层操作,并为彼此提供不同的服务和功能。
在这样的分布式架构,存在诸如网络不可靠性,强耦合等诸多挑战,生产者和消费者以及需要的应用程序的异构性,致力于建立一个坚实可靠的系统。
2.1 面向连接的通信
面向连接的通信是在远程实体之间交换信息的简单解决方案。如图1所示,考虑通过面向连接的协议(如TCP / IP)打开套接字,并通过它传输原始数据流。这将是一种快速而廉价的信息交换方式,但与此同时,紧密耦合的通信将基于许多假设,这些假设需要满足才能进行通信:
图1:紧密耦合的通信。
- 时间依赖:所有组件必须同时可用。
- 位置:每个组件必须知道对方地址。
- 数据结构和表示:在最简单的实现中,所有组件必须就数据格式和二进制表示达成一致。
2.2 用于松散耦合通信的消息传递
耦合可以通过各方在沟通时相互作出的假设数来衡量。
消息传递是松耦合通信解决方案的一个示例,其中消息是信息构建块,其目的在于最小化这些假设。
它不是直接向特定地址发送信息,而是发送到可寻址信道,以解决位置依赖性。
为了消除时间依赖性,可以增强该信道以对信息进行排队,直到远程组件准备好接收它为止。
这样,生产者现在可以将请求发送到通道并继续处理,而不必担心交付。
消息传递不对数据表示做出任何假设,因此标准数据格式(例如,自描述和与JSON或XML无关的平台)可用于消除在所有组件之间共享数据处理逻辑的需要。
2.3消息传递方案
典型的消息传递用例是:
信息发布:实体发布易变信息而没有关于谁感兴趣的先验知识(例如传感器);
信息存储:实体从多个来源(例如日志收集器)收集信息;
远程过程调用:实体向一个或多个远程实体发送请求并期望回复。
2.4消息传递中间件
消息传递是一种松散耦合的通信解决方案,可最大限度地减少生产者和消费者的依赖,删除这些依赖项使整个架构更灵活,更容忍变更,但它带来了额外的复杂性。
因此,多年来已经开发了专用消息中间件以提供消息传递功能而无需处理内部复杂性。
下一节将介绍消息传递系统的主要概念和原理。
3.消息系统
如图2所示,消息传递系统充当想要通信的实体之间的间接层。
通常称为消息代理,它负责将数据作为消息从一个应用程序传输到另一个应用程序,
这样生产者和消费者就可以专注于分享内容,而不是如何分享内容。
与许多其他技术一样,消息传递基于一些基本概念和属性,这些概念和属性在所有不同的风格和实现之间共享。
图2:松散耦合通信的消息传递。
3.1 信息
消息是信息构建块。它由一个主体组成,它是不可变的,包含通信的结构化数据(例如JSON,XML,序列化协议)对象,以及一组头,通常是可由代理处理并用于路由的键值对。
3.2 通信模型:主题和队列
消息传递系统支持不同的通信模型,每个模型定义了生产者和消费者之间如何交换信息。
最常见的通信模型是队列和主题。
队列用于实现点对点通信,其中,如果在生成信息时不存在消费者,则消息将保留在通道中以供以后传递,
如果有多个消费者,则消息仅传送一次。
主题是针对经典发布/订阅方案,
如果不存在消费者,则消息被丢弃,并且在多个消费者的情况下,消息系统将消息传递给每个消费者。
来自队列和主题的部分被广泛支持,更复杂的传递语义存在于协议级别(例如来自AMQP的交换/节点)以及许多其他中间件特定的。3.3 协议
多年来,缺乏与消息代理交互的独特标准方式已成为消息传递技术的已知问题。
AMQP协议由主要的消息传递参与者,公司和软件生产者设计,以克服这一限制。
然而,定义有线通信和传递语义的统一协议的内部复杂性要求消息传递系统的主要开发工作变得完全兼容。
本节概述了主消息系统当前支持的最常见的标准协议。
对于面向消息的体系结构,协议选择是一个关键的设计决策,就其在应用程序中的强耦合而言。3.3.1 AMQP(高级消息队列协议)[1]是标准化工作的结果消息传递领域的主要贡献者(例如思科,微软,红帽,银行)。
它是旨在实现不同消息传递系统之间的互操作性。
它提供了定义二进制线协议和完整的传递语义,理论上允许AMQP消息传递客户端能够与不同的代理实现无缝交互符合AMQP标准。
如今,该协议的最新稳定版本(1.1)的奉献是尚未广泛,但鉴于它已经得到了主要消息代理的支持,预计未来几年将更广泛地实施。3.3.2 STOMP(流式文本定向消息传递协议)[2]是基于文本的协议意味着简单且可广泛互操作。
它主要是一种有线协议,它非常有用基本的消息传递语义内置(例如,不支持通信模型,目的地是只是一个字符串消息头),
需要在消息系统级别进行适当的配置(例如,目的地必须适当地映射到队列或主题)。 多亏了它简单,有许多语言提供的广泛的客户端,它是由支持大多数经纪人。3.3.3 MQTT(Message Queue遥测传输)[3]是轻量级协议设计的最初来自IBM。
它适用于低带宽,高延迟的网络。
它定义了一个紧凑的二进制格式,通信开销非常有限,几十字节,这使得它适用于简单的物联网风格应用(例如移动电话,传感器)生产 - 忘记的情景。3.4功能
如第2节所述,消息传递系统可以被视为中间通道通过排队等附加功能进行增强,以改善通信远程实体的经验。
多年来,虽然没有正式的协议,但不同消息传递系统融合在一组共同的功能上,这些功能已成为事实上的标准用于消息传递中间件。
功能列表包括Persistence,即保存功能永久存储上的消息,例如文件系统或数据库;故障转移,允许客户端经纪人失败时自动重新连接;
保证交付,定义政策用于消息传递(例如,至少一次或完全一次);
订购,发送消息它们的生产顺序;
交易,将多个请求视为一部分的能力分布式事务,具有回滚选项和聚类,这是创建的可能性消息代理网络,用于高可用性和负载平衡。
尽管如此,每个消息系统可以为相同的功能提供不同的解释。许多其他独特的经纪人特定存在功能,但它们的使用意味着将应用程序与特定代理硬连接味道。4.消息传递技术
面向消息的中间件已经发展了十多年,现在已经成为一个丰富而稳固的服务和库生态系统。
消息代理作为为分布式应用程序提供消息传递功能的中间独立服务,是最常见的消息传递系统类型。
多年来,消息代理已广泛用于在分布式系统中实现通信和集成[4],但数据密集型和高性能用例除外,
中间实体的存在不适合的选择。
近年来,出现了新一代消息传递系统,重点关注低延迟和高性能用例,突破了消息传递应用程序的界限。
下一节将介绍主要消息传递技术的概述。
4.1 消息代理
消息代理是消息系统最常见的实现。
消息代理是独立的中间实体,它通过标准或自定义协议提供消息传递功能。
存在许多消息代理,不同的功能,协议,实现语言,平台支持。
本评论的重点是开源解决方案,但许多也作为企业商业软件的一部分存在。
消息代理是功能最丰富的消息传递系统类型,具有协议支持的功能,如第2节所述。
经纪人可以是多语言,允许生产者和消费者使用不同的协议(例如AMQP上的发送者,STOMP上的接收者)
并且它们可以支持消息转换(例如,将消息有效负载从XML转换为JSON)以进一步解耦应用程序。
4.1.1 ActiveMQ是最广泛采用的开源消息代理之一。
它是一个Apache项目,用Java编写,得到了Red Hat的商业支持。
ActiveMQ具有广泛的协议支持(例如AMQP,STOMP,MQTT,Openwire,HTTP和许多其他),
它提供了许多跨语言客户端,并且完全符合JMS标准。
ActiveMQ提供了许多高级功能,例如:丰富的语义传递(例如虚拟队列,复合目标,通配符),
JDBC消息存储(例如,用于在任何JDBC兼容数据库中保留消息)和高级群集配置(例如,主从,经纪人网络)。
ActiveMQ是一种功能完备的消息传递解决方案,可用于实现许多通信和集成模式[4]。
4.1.2 RabbitMQ 是一个用Erlang编写的轻量级开源消息代理,它从下面语言的消息传递功能中获益。
RabbitMQ架构是深度模块化的,它主要支持AMQP和STOMP,但是附加协议可以作为插件加载(例如MQTT,HTTP)。
它支持主要的消息传递功能,例如持久性,群集,高可用性和联合。
RabbitMQ仍然是一种轻量级的消息传递解决方案,由于其简单性和可靠性,可以嵌入到多个项目(例如Logstash)中。
4.1.3性能和可伸缩性 对于消息传递系统,没有详细的上下文化,每秒消息的量化度量(msg / s)几乎没有意义。
使用的协议(例如二进制或文本)起着重要作用,但存在许多其他延迟因素:
持久性消息可以慢几个数量级,放大因子(例如主题消费者的数量)可以通过多个内存中的消息副本影响系统,
对于有效载荷大小也是如此。次优的客户端可能导致大量的开/关连接,行为不端的消费者可能导致低用户问题,
消息传递基础结构最常见的问题之一。
[5]中的比较,其中几个消息代理通过STOMP协议在几个通信模型中进行评估,显示了在实际情况下如何
性能可能在100000 msg / s和1000 msg / s之间变化。
4.2 Apache Kafka
Apache Kafka是一个最初来自LinkedIn的开源项目,现在是Apache基金会的一部分。
它已经被开发用于实时活动流分析,以解决对从生产者向许多潜在消费者移动大量数据(例如,用户指标,计算机农场监控)的有效方式的需求。
规模和数据大小(数十亿条消息和每天数百千兆字节)和时间限制使得用例不适合标准经纪人,如[6]中的比较。
Kafka的创新理念是成为无国籍经纪人,因此不保留任何有关消费者的信息。
消费者必须保留其自己的状态(例如关于最后读取的数据的信息)并在需要时向Kafka轮询新数据。
这允许Kafka独立于消费者的数量来保留单个消息副本(例如,消费时不会删除消息,而是通过保留期或其他策略删除消息),
从而实现读取和写入操作的高吞吐量。
Kafka持久性是作为分布式提交日志实现的,如图3所示,设计为易于扩展的分布式系统(基于Zookeeper),允许自动平衡消费者/生产者/代理。
(a)Kafka集群
(b)Kafka主题分区
图3:Kafka架构。
与标准消息代理相比,Kafka提供有限的消息传递功能(例如主要是主题语义,文件系统作为唯一持久存储,严格保证排序)。
尽管有许多客户端库可用,但它仅支持TCP上的自定义二进制格式。
Kafka是数据移动的最佳解决方案,经常被用作不同处理系统(例如Hadoop,Storm)的管道。
4.3 ZeroMQ
尽管名称如此,ZeroMQ(也称为0MQ或ZMQ)[7]不是标准的消息代理,而是一个提供消息传递功能的轻量级消息传递库。
分布式应用程序可以使用ZeroMQ进行高吞吐量和低延迟通信,
利用其在生产者和消费者之间实现直接联系的能力,
没有涉及中间实体。虽然这可能与消息传递的主要假设之一相矛盾,
ZeroMQ通过创新方法实现松耦合通信,充当网络堆栈的新层。
它使用类似的API扩展了socket的概念,但内置了消息传递模式:
请求/回复,发布/订阅,流水线和独占对,如图4所示。
(a)请求/回复
(b)发布/订阅
图4:ZeroMQ套接字的示例。
与经典套接字相比,每个ZeroMQ套接字都带有一个内部队列,以允许异步通信。
结果是,例如在用于点对点通信的请求/回复场景中,
如果在消费者未运行时生成数据,
ZeroMQ库将负责延迟交付,而生产者方无需额外负载。
ZeroMQ背后的理念是强大的,它允许高性能和低延迟的通信,但在应用程序级别具有额外的复杂性。
ZeroMQ主要支持自己的二进制协议,并提供有限的消息传递功能(例如,故障转移,1-N拓扑的多播支持)。
虽然可以使用ZMQ API轻松实现多个功能(例如确认),
实现高级消息传递功能(例如保证传递,持久性)可能需要相当大的努力,
使其适用于需要简单消息语义的数据广告场景。
5.用例
本节介绍了几种成功采用基于消息传递通信的用例,以解决分布式系统中的交换信息问题。
5.1 CERN Beam Control中间件
CERN实验室的光束控制部门正在为大型强子对撞机(LHC)的高可靠性控制/监控/报警应用使用信息。
自2005年以来,一组ActiveMQ经纪人,在商店和正向配置中,
用于收集安全系统生成的关键数据(例如30个生产者,2MB / s,4.5K msg / s)并将其转发给许多消费者(例如监控工具,仪表板)。
作为安全数据关键任务,存储和转发配置允许将数据生成与消耗完全分离,防止行为不端的客户端进行数据收集和归档[8]。
此外,LHC Control框架最近已从CORBA迁移到ZeroMQ作为通信层[9]。
5.2 DAQ在线监测
消息传递还广泛用于数据采集(DAQ)系统的几个监控工具,
负责从检测器(例如高能物理实验)过滤和收集数据到存储设施。
5.2.1 ATLAS TDAQ移位器助手项目[10]依靠消息传递将业务警报从私有TDAQ网络分发到GPN到许多异构消费者。
ActiveMQ群集用于主/从配置,以最大限度地减少对单个出站连接所需的防火墙配置的影响。
5.2.2 STAR Online框架依赖于基于AMQP的系统,可灵活,松散地耦合检测器元数据,
使用消息传递作为统一传输层进行处理,
存储和监控。 此外,已经进行了调查以重新编写MQTT上的控制框架,从协议的灵活性和互操作性中获益[11]。
5.3 WLCG消息服务
消息传递也已成功用于大规模地理分布式基础设施。
WLCG(全球LHC计算网格)消息服务是用于监控全球WLCG站点和服务的骨干传输层,
拥有超过50000个客户端,平均消息速率为100 KHz。 监视基础结构基于具有JSON有效负载的STOMP。
由于STOMP协议在多种代理风格中的互操作性,
异构消息代理群集(ActiveMQ,Apollo或RabbitMQ)用于客户端应用程序生成任何内容并消费给所有人[12]的场景。
6.总结
消息传递从根本上说是对分布式系统问题的实用反应[4]。
如第2节所述,它允许松散耦合的通信作为生产者和消费者之间的中间层。
它为分布式应用程序的灵活性和可伸缩性带来了许多好处,并对应用程序和基础架构的复
消息系统仍然是不断发展的技术,如第3节所示,AMQP标准化工作指向了良好的方向,
但仍然部分采用。
消息代理是在许多项目和服务中用作传输层构建块的可靠且可靠的技术,
无论是在物理界还是在外面。近年来,
新一代系统正在推动低延迟/高吞吐量/数据密集型通信的消息传递,
如第5节所述,缩小用例和放松假设,但将消息传递应用程序的界限推向新的领域。
参考
[1] AMQP(高级消息队列协议)http://www.amqp.org
[2] STOMP(简单文本导向消息传递协议)http://stomp.gith ub.io [3] MQTT(MQ遥测传输)http://mqtt.org
[4] G Hohpe和B Woolf 2003 企业集成模式 Addison-Wesley Professional [5] Chirino H STOMP基准http://hiramchirino.com/stomp-benchmark
[6] Kreps J,Narkhede N和Rao J Kafka:用于日志处理的分布式消息系统。NetDB研讨会(雅典,希腊)
[7] Hintjens P ZeroMQ:指南http://zeromq.org
[8] Ehm F 为CERN的控制系统运行可靠的消息传递基础设施。 ICALEPCS2011会议录(法国格勒诺布尔)
[9] Dworak A,Ehm F,Sliwinski W和Sobczak M 2011 中间件趋势和市场领导者2011。
ICALEPCS2011会议录(法国格勒诺布尔)
[10] Kazarov A,Miotto GL和Magnoni L 2012 AAL项目:ATLAS数据采集基础设施的自动监测和智能分析。物理学杂志:会议系列,第368卷
[11] Arkhipkin D,Lauret J和Betts W 2011 STARs在线监控和元数据收集的消息排队框架。物理学杂志:会议系列,第331卷
[12] Cons L和Paladin M 2011 WLCG消息服务及其未来。物理学杂志:会议系列,第396卷
-
操作系统----消息传递
2016-09-28 20:37:15消息传递是以消息为单位进行进程之间一种通信的手段,消息是由一组消息组成的集合,包括了消息头和消息尾,消息的传递实现需要两个原语分别是Send()和Seceive(),Send()负责发送消息,Receive()是负责接受消息的,当...消息传递是以消息为单位进行进程之间一种通信的手段,消息是由一组消息组成的集合,包括了消息头和消息尾,消息的传递实现需要两个原语分别是Send()和Seceive(),Send()负责发送消息,Receive()是负责接受消息的,当没有接受到消息的时候,接受进程进入等待的状态,直到有消息到达为止。这样的话不仅起到交换信息的功能,还能使进程同步。
消息传递的方式有两种:直接消息传递,采用信箱传递方式
直接的消息的传递:只需要每个进程知道的消息发向哪和从哪里接受到消息。
格式:
Send(Target,Message);//将消息发送给目标的进程
receive(Soure,&Message);//从源进程中接受一个消息
直接消息传递下,由于没有缓冲机制,该方式假如发送进程先行发送,执行Send()原语,则发送的进程阻塞,直到接受进程执行Receive()原语进行接受,反之也是一样的。所以没有缓冲,所以发送进程和接受进程之间必须交替的进行。
信箱的消息传递方式:
采用消息信箱的方式是一种简介的通信的方式,接受方和发送方需要通过信箱进行交互信息,就像是以前通信一样。那么刚刚的target ,he Soure都是信箱了,就是mailbox.
Send():
Send(MailBox,Message);//
其中MailBox就是信箱,是一种结构体,原语将信息发送到信箱,过程为:首先是检查指定的邮箱是否满,如果满了,则发送信件进程就会被堵塞,进入“等待发送信件”,状态,假如没有满的话,将信件Message存入信箱中,有进程等待取信件,那么将会唤醒正在等待取信件的进程。
Receive():
Receive(MailBox,&Message);
执行的过程:首先还是检查信箱中的文件,如果信箱中有信的话,那么就会取出信件,放入Message,假如这时有进程在等待将信件存入信箱中,则等待的发送的进程将会被唤醒。如果没有信件,那么取信件的进程将会被阻塞。
-
操作系统之进程通信 (八) --- 共享存储、管道通信、消息传递...
2019-08-04 17:33:47进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立,而且为了保证安全,一个进程不能直接访问另外一个进程的地址空间。 但是,在很多情况下,进程之间的信息交换又是必须的,如...进程通信
进程通信的概念与方法
顾名思义,进程通信就是指进程之间的信息交换。
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立,而且为了保证安全,一个进程不能直接访问另外一个进程的地址空间。
但是,在很多情况下,进程之间的信息交换又是必须的,如 某些APP的分享到微信朋友圈功能,在这些APP进程分享时,它们需要和微信进程进行进程通信。所以,为了实现进程间的安全通信,操作系统提供了一些方法,分别是共享存储、管道通信和消息传递。下面对这几种方法进行介绍。
共享存储
进程通信采用共享存储方式时,操作系统会在内存中开辟一块共享空间,允许通信进程对其互斥的访问。
注意:两个进程对共享空间的访问必须是互斥的,即 同一时间只允许一个进程访问该共享空间。(互斥访问可以通过操作系统提供的工具实现)进程用这种方式通信时,操作系统只负责提供共享空间和同步互斥工具。(如 P、V操作)
其实,共享存储方式还分为了两种,分别是基于数据结构的共享、基于存储区的共享。
- 基于数据结构的共享:共享空间的数据形式有所限制,如 共享空间只能放一个长度为10的数组。这种共享方式速度慢、限制多、是一种低级通信方式。
- 基于存储区的共享:数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
管道通信
管道是指用于连接读写进程的一个共享文件,又名pipe文件。
进程通信采用管道通信方式时,操作系统会在内存中开辟的一个大小固定的缓冲区,进程需要按照"管道的规则"进行通信。 ("管道的规则"在此部分的最后会提到)
注意:一条管道只能实现半双工通信,半双工通信即某一时间段内只能实现单向的数据传输。如果要实现双向同时通信,即某一时间段内实现双向的数据传输,则需要设置两条管道。
下面说说管道的规则。
- 一条管道只能实现半双工通信,即 某一时间段内只能实现单向的数据传输。
- 各个进程只能互斥的访问管道,即 当一个进程在写的时候,另外一个进程不能读,反之亦然。
- 数据会以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将会被阻塞,直到读进程将数据取走;当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
- 如果没写满,就不允许读;如果没读空,就不允许写。
个人理解:管道就像一辆单向行驶的车,只有车上坐满人后,车才可以发动,而当车到达目的地,全体人员都要下车。
消息传递
进程通信采用消息传递方式时,进程间的数据交换会以格式化的信息 (Message) 为单位。进程通过操作系统提供的"发送消息/接受消息"两个原语进行数据交换。
拓展:计算机网络中发送的“报文”其实就是一种格式化的消息。其实,消息传递方式也分为两种,分别是直接通信方式和间接通信方式。下面对这两种方式进行介绍。
直接通信方式
进程通信采用消息传递的直接通信方式时,消息会直接挂到接收进程的消息缓冲队列上。
举个例子:假如,进程1给进程2发送了两个消息。那进程2的消息缓冲队列如下。
这种方式类似于寄快递,你写明收件人后,快递公司会把快递送达收件人的手中。在这里,快递就是消息,收件人就是接收进程,快递公司就是操作系统。间接通信方式
进程通信采用消息传递的直接通信方式时,发送进程会把消息发送到一个中间实体(信箱)中,而接收进程通过某些方法可以取得属于自己的消息,因此,这种方式也被称为"信箱通信方式"。
这种方式类似于电子邮件系统,用户A给用户B发送的邮件会暂存于服务器的信箱中,该邮件会等待用户B的取出。
总结
感谢
以上内容大部分来自王道操作系统系列视频教学。
-
Delphi进程间传递消息(发送和接收系统消息)..rar
2019-05-01 13:17:27Delphi进程间传递消息(发送和接收系统消息)..rar -
unity3d 消息传递系统Messaging System
2016-01-21 14:42:39消息传递系统 新的UI设计的系统使用一个消息传递系统来取代SendMessage。 该系统是纯c#和旨在解决与SendMessage存在的一些问题。 使用自定义接口,可以实现系统工作在MonoBehaviour表明组件能够接收一个回调消息传递... -
进程通信方式总结与盘点
2019-11-20 14:25:23 最后,我们对这几种通信方式进行一个总结,其中的某几种通信方式,被别的博主同一成了一个,比如消息传递系统中的直接通信和间接通信,统称为消息队列,这里不做正确性的评价,本文是把所有的通信机制大的方向做... -
Android消息通信之Activity间消息传递
2019-03-09 17:13:17Android消息通信之Activity间消息传递 https://blog.csdn.net/qq_34911465/article/details/79420559 https://www.cnblogs.com/chenjy1225/p/9662510.html 一、消息通信机制 Android 开发之中我们常常需要应用到... -
并行DSP 系统消息传递路由算法
2010-11-27 22:42:18并行DSP 系统消息传递路由算法 并行DSP 系统消息传递路由算法 -
消息传递,生产者消费者
2018-05-01 21:38:00上面提到的其他的方法就是消息传递(message passing)。这种进程间通信的方法使用两条原语send和receive,它们像信号量而不像管程,是系统调用而不是语言成分。因此,可以很容易地将它们加入到库例程中去。例如:... -
消息传递
2016-11-05 09:00:31进程通信的方法包括共享数据结构、消息队列等。消息传递是进程间传递数据的方法。消息队列有发送原语和接收原语。UNIX/Linux消息传递的编程有所不同。 -
杭电操作系统课程设计-线程调度 和 消息传递 课本p156作业答案整理
2010-11-29 22:40:27杭电操作系统课程设计-线程调度 和 消息传递 课本p156作业答案整理 杭电操作系统课程设计-线程调度 和 消息传递 课本p156作业答案整理 -
3、Akka传递消息
2021-01-07 19:33:101 消息传递 Akka 有 4 种核心的 Actor 消息模式: tell 、ask 、forward 和 pipe。 Ask:向 Actor 发送一条消息,返回一个 Future。当 Actor 返回响应时,会返回 Future。不会向消息发送者的邮箱返回任何消息。 ... -
【GNN】MPNN:消息传递神经网络
2020-06-08 16:30:01今天学习的是谷歌大脑的同学 2017 年的工作《Neural Message Passing for Quantum Chemistry》,也就是我们经常提到的消息传递网络(Message Passing Neural Network,MPNN),目前引用数超过 900 次。 严格来说,... -
计算机操作系统——进程间通信(Interprocess Communication)
2022-03-30 20:34:45计算机操作系统——进程间通信(Interprocess Communication) -
大数据知识点之点对点消息传递模式与发布订阅消息传递模式
2020-05-29 14:18:15一个消息系统负责将数据从一个应用程序传递到另外一个应用程序中,应用程序只关注数据,无须关注数据在多个应用之间是如何传递的,分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。... -
windows消息传递机制详解
2018-01-31 18:06:11Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。必须注意的是,消息... -
管道、消息队列和共享内存三者的特点与区别
2019-03-01 23:14:04管道和消息队列的区别 管道(PIPE) 管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中... -
iframe嵌套网页消息传递,传递参数
2019-04-03 10:06:07A页面 中嵌套B页面 并向B页面传递消息 A页面: <iframe name="iframeA" src="http://xxx.B.html"></iframe> <script> //发送消息 window.onload = function(){ var params = {name:'xxx'};... -
2.1.4 进程之间的通信(共享通信、消息传递、管道通信)
2020-03-15 18:01:48消息传递 0.思维导图 1.什么是进程通信? 图中我们可以知道什么是进程通信,以及进程通信的低级和高级方式; 我们还可以知道为什么要引入进程通信方式,以及它的意义 2.共享存储 共享一块大家都可以访问的空间... -
Spring系列学习之Spring Cloud Stream流式消息传递
2018-12-24 15:37:59英文原文:... 目录 Spring Cloud Stream 绑定器实现 快速开始 Apache Kafka客户端兼容性 ...Spring Cloud Stream是一个用于构建与共享消息传递系统相连的高度可扩展的事件驱动微服务的... -
Android 消息通信之Activity间消息传递
2018-03-02 12:21:40消息传递的作用不必多说,主要是在不同的组件之间传播消息或者共享某些状态等,以下是几种常用的消息传递机制: Intent 静态变量 全局变量 及Application Android系统剪切板 本地化存储方式 Andorid组件 EventBus ... -
同步消息和异步消息传递的区别?
2018-10-23 00:26:47同步消息传递涉及到等待服务器响应消息的客户端。消息可以双向地向两个方向流动。本质上,这意味着同步消息传递是双向通信。即发送方向接收方发送消息,接收方接收此消息并回复发送方。发送者在收到接收者的回复... -
嵌入式系统学习——STM32之UCOS-III消息传递
2017-06-01 00:14:39一个任务或者中断服务程序有时候需要和另一个任务交流信息,这个就是消息,传递的过程就叫做任务间通信,任务间的消息传递可以通过2种途径:一是通过全局变量,二是通过发布消息。 使用全局变量的时候每个任务... -
消息传递框架MPNN: Neural Message Passing for Quantum Chemistry
2021-11-29 20:11:29这篇论文本身没有提出什么新东西,基于以往的研究,提出了一个消息传递框架MPNN(Message Passing Neural Networks),然后基于这个框架选择了一个较为高效的变体,应用到了chemical prediction中 1 为什么使用... -
【UCOSIII】UCOSIII的消息传递
2018-07-04 18:12:33一个任务或者中断服务程序有时候需要和另一个任务交流信息,这个就是消息传递的过程就叫做任务间通信,任务间的消息传递可以通过两种途径:一是通过全局变量,二是通过发布消息。 使用全局变量的时候,每个任务或者...