CN104102550A - 一种多主机进程间通信的方法 - Google Patents
一种多主机进程间通信的方法 Download PDFInfo
- Publication number
- CN104102550A CN104102550A CN201310128953.1A CN201310128953A CN104102550A CN 104102550 A CN104102550 A CN 104102550A CN 201310128953 A CN201310128953 A CN 201310128953A CN 104102550 A CN104102550 A CN 104102550A
- Authority
- CN
- China
- Prior art keywords
- communication
- message
- shared drive
- function
- main frame
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Abstract
本发明公开一种多主机进程间通信的方法,包括如下内容:若是同一主机内的不同进程间需要通信,使用两级共享内存来收发报文,从而实现数据的零拷贝;若是不同主机内的进程需要通信,将报文组织成二层以太网帧格式,不经过协议栈直接发送给接收方;且前述两种通信方式采用统一的函数接口和统一的通信报文格式。此种通信方法可提高多主机环境下进程间的通信效率,降低应用程序编程接口的复杂度。
Description
技术领域
本发明涉及一种多主机进程间通信的方法。
背景技术
传统的操作系统进程间通信的方法包括套接字、管道、消息队列及共享内存。当采用套接字、管道、消息队列进行进程间通信时,数据的传递模式为:A进程将数据拷贝至内核缓冲区,通知B进程;B进程得到通知后将数据从内核拷贝至进程缓冲区,然后处理数据。这种模式下有效数据需要在进程态和内核态之间拷贝两次,降低了程序运行的效率。当采用共享内存进行进程间通信时,数据的传递模式为:A进程将数据写入共享内存,通知B进程;B进程得到通知后直接从共享内存区读取数据。这种模式下有效数据不需要在进程态和内核态之间进行拷贝,相比前一种模式,提高了效率。但是,A进程通知B进程的这个动作,需要通过一个短消息来实现,这个短消息还是需要从进程地址空间向内核地址空间拷贝数据,降低了系统性能。
当网络上不同主机间的进程需要通信时,必须选择合适的网络协议,使用套接字在不同主机间传递消息。使用套接字接口需要将通信报文压入操作系统协议栈,经过协议栈的层层处理和封装才能把有效通信报文发送出去,降低了进程间通信的实时性。当进行多主机进程间的通信时必须选择两种函数接口,一种用于同一个主机内的不同进程通信,另一种用于不同主机进程间的通信,增加了应用程序编程接口的复杂度。
发明内容
本发明的目的,在于提供一种多主机进程间通信的方法,其可提高多主机环境下进程间的通信效率,降低应用程序编程接口的复杂度。
为了达成上述目的,本发明的解决方案是:
一种多主机进程间通信的方法,包括如下内容:若是同一主机内的不同进程间需要通信,使用两级共享内存来收发报文,从而实现数据的零拷贝;若是不同主机内的进程需要通信,将报文组织成二层以太网帧格式,不经过协议栈直接发送给接收方;且前述两种通信方式采用统一的函数接口和统一的通信报文格式。
上述方法中,对于同一主机内的不同进程间的通信:各进程将第一级共享内存映射到进程自己的地址空间,通信的发起方通过指针直接在第一级共享内存区中组织报文,通信的接收方通过指针直接在第一级共享内存区中访问报文,实现了进程间数据的零拷贝;各进程将第二级共享内存映射到进程自己的地址空间,进程在调用内核模块提供的各种函数时,将函数实参直接写入第二级共享内存,内核模块直接读取进程的第二级共享内存,获取函数实参,实现了进程和内核间数据的零拷贝。
上述方法中,对于不同主机间进程的通信:将报文组织成二层以太网帧格式,不经过协议栈,直接调用系统网络设备的以太网发送函数,将报文发送给接收方主机,缩短了报文发送的时间,提高了通信的实时性。
采用上述方案后,本发明的有益效果是:通过提供一种多主机进程间的通信方法,提高了多主机环境下进程间的通信效率,降低应用程序编程接口的复杂度。对于同一主机内的不同进程,采用两级共享内存的方法,实现进程间数据零拷贝通信,解决了传统操作系统进程间通信需要在进程和内核之间拷贝数据的问题。对于不同主机上的不同进程,通信时采用二层以太网报文,不经过协议栈直接发送给对方的方法,提高了通信的实时性,解决了传统套接字通信需要经过协议栈从而导致实时性下降的问题。以上两种通信方法在实现上采用统一的报文格式和函数接口封装,解决了多主机环境下程序开发时需要为进程通信选择不同的函数接口导致应用程序编程接口复杂的问题。
附图说明
图1是进程间通信报文帧格式定义示意图;
图2是两级共享内存组织方式示意图;
图3是二层以太网帧格式定义示意图。
具体实施方式
下面以一个具体的嵌入式系统来说明本发明的具体实现方法。该嵌入式系统的CPU采用freescale公司的P1020芯片,操作系统采用linux2.6.32操作系统。具体的实施方法包括:(1)在linux操作系统中插入一个内核模块,创建一个虚拟字符设备,通过该设备的设备驱动程序的各种函数接口来实现两级共享内存的管理,进程间报文的收发,以太网报文的收发等功能。(2)编写一个linux下的程序共享库,将对(1)中的虚拟字符设备的操作封装成统一的函数接口,应用程序调用这些函数来完成多主机进程间的通信。
下面以一个两进程(进程A和进程B)通信的例子来说明整个过程。
1、本发明使用一种固定的报文帧格式来进行进程间的通信,这种报文帧格式定义如图1:
对报文帧格式中各个字段的说明如下:
(1)目的进程ID:进程ID用于在一个主机中唯一标识一个进程,目的进程ID用来标识通信双方中接收报文的那个进程。
(2)源进程ID:源进程ID用来标识通信双方中发送报文的那个进程。
(3)目的主机地址:主机地址用于在以太网中唯一标识一个主机,目的主机地址用来标识通信双方中接收报文的那个进程所在的主机。
(4)源主机地址:源主机地址用来标识通信双方中发送报文的那个进程所在的主机。
(5)应用层报文长度:通信发起方进程发送的报文的长度。
(6)应用层报文内容:发送方进程需要发送的报文。
2、在linux操作系统中插入的内核模块提供下面几个函数供应用程序调用。
(1)一级共享内存初始化函数:进程调用本函数将内核中的一级共享内存区映射到进程的地址空间中,映射后进程通过指针可以直接对一级共享内存进行读写。
(2)二级共享内存初始化函数:进程调用本函数获取进程独有的二级共享内存,并且将该二级共享内存区映射到进程的地址空间中,映射后进程通过指针可以直接对该二级共享内存进行读写。
(3)获取缓冲区函数:进程调用本函数从一级共享内存区内获取需要大小的一块缓冲区。
(4)报文发送函数:进程调用本函数将图1所示的一帧报文发送给网络上由目的主机地址和目的进程ID唯一标识的一个进程。
(5)接收函数:进程调用本函数直接获取指向保存在一级共享内存区的通信报文的指针,进程通过该指针直接访问通信报文。
3、使用两级共享内存在同一主机内的不同进程间发送报文的详细步骤说明如下。
(1)本发明采用两级共享内存在同一主机的不同进程间传递通信报文,使得进程间的通信实现了真正意义上的数据零拷贝。采用的两级共享内存模式如图2。图2中的一级共享内存区用于存储进程间通信的报文,进程A和进程B分别调用内核模块提供的一级共享内存初始化函数,将一级共享内存区分别映射至本进程的地址空间中。这样在以后进程A需要向进程B发送通信报文时,进程A通过指针直接在一级共享内存区中组织报文,进程B通过指针直接从一级共享内存区中读取报文,进程间不需要拷贝报文。图2中的二级共享内存区用于进程调用内核模块提供的函数时向内核空间传递函数实参。Linux操作系统下,一个进程如果调用内核模块提供的函数,需要将函数实参从进程空间拷贝到内核空间,这个过程涉及到内存的拷贝,会降低程序的运行效率。本发明使用第二级共享内存来消除这个向内核空间拷贝函数实参的过程。如图2,进程A在初始化阶段,调用内核模块提供的二级共享内存初始化函数,将内核模块为进程A提供的第二级共享内存映射至进程A的地址空间中。以后进程A在调用内核模块提供的各种函数时,将函数实参直接写入第二级共享内存,内核模块直接读取进程A的第二级共享内存,获取函数实参,通过这种方式实现了进程调用内核模块函数时函数实参的数据零拷贝。
(2)进程A向进程B发送通信报文的完整过程如下:
a)进程A通过调用内核模块提供的获取缓冲区函数从一级共享内存区内获取需要大小的一块缓冲区。进程A在调用内核模块提供的获取缓冲区函数时将函数实参直接写入二级共享内存,不需要向内核空间拷贝函数实参。
b)进程A在步骤a)获取到的缓冲区中按照下面的方法组织通信报文:
i)将进程B的进程ID填入目的进程ID字段。
ii)将进程A自己的进程ID填入源进程ID字段。
iii)将进程B所在主机的主机地址填入目的主机地址字段。
iv)将进程A所在主机的主机地址填入源主机地址字段。由于进程A和进程B在同一个主机上,因此本字段和目的主机地址字段相同。
v)将应用层报文长度填入应用层报文长度字段。
vi)写入应用层报文。
c)进程A调用内核模块提供的报文发送函数,报文发送函数检查报文中的目的主机地址字段,发现目的主机地址字段和本主机的主机地址相同,于是将位于一级共享内存中的通信报文的指针发送给进程B,不需要拷贝通信报文;进程A调用内核模块提供的报文发送函数时将函数实参直接写入二级共享内存,不需要向内核空间拷贝函数实参,整个过程实现了数据的零拷贝。
4、对于不同主机上的不同进程,通信时仍然使用图1所示的报文帧格式。下面以一个主机1上的进程A向主机2上的进程B发送通信报文的例子来详细说明本发明是如何在不同主机不同进程间进行通信的。
主机1上的进程A向主机2上的进程B发送通信报文的完整过程如下。
a)进程A通过调用内核模块提供的获取缓冲区函数从一级共享内存区内获取需要大小的一块缓冲区。进程A在调用内核模块提供的获取缓冲区函数时将函数实参直接写入二级共享内存,不需要向内核空间拷贝函数实参。
b)进程A在步骤a)获取到的缓冲区中按照下面的方法组织通信报文:
i)将进程B的进程ID填入目的进程ID字段。
ii)将进程A自己的进程ID填入源进程ID字段。
iii)将进程B所在主机(主机2)的主机地址填入目的主机地址字段。
iv)将进程A所在主机(主机1)的主机地址填入源主机地址字段。
v)将应用层报文长度填入应用层报文长度字段。
vi)写入应用层报文。
c)进程A调用内核模块提供的报文发送函数,报文发送函数检查报文中的目的主机地址字段,发现目的主机地址字段和本主机的主机地址不同,于是在图1所示的报文帧格式前面添加由目的MAC地址,源MAC地址,以太网帧类型三个字段组成的二层以太网报文帧头。不经过协议栈而是直接调用系统网络设备的以太网发送函数,将添加了二层以太网报文帧头后的报文通过以太网设备发送给主机2,提高了通信的实时性。添加了二层以太网报文帧头后的报文格式如图3所示。为了同常用的以太网帧类型(例如以太网上的IP包类型为0x0800)进行区别,本方法将以太网帧类型定义为0x4e52。Linux操作系统内核存在这样一种机制:内核模块可以提供一个回调函数向操作系统内核注册接收指定类型的以太网帧,当操作系统内核从以太网设备上接收到这种类型的以太网帧时,就会调用由内核模块提供的回调函数去处理这些以太网帧。本发明中的内核模块向操作系统内核注册接收类型为0x4e52的以太网帧,收到以太网报文后,去掉由目的MAC地址、源MAC地址、以太网帧类型三个字段组成的二层以太网报文帧头,将报文转换成图1所示的格式,然后将报文存入一级共享内存区,最后根据报文中的目的进程ID字段将报文指针发送给目的进程。
5、应用进程采用异步等待的方式等待接收其他进程发来的通信报文。进程接收通信报文的方法说明如下:
1)进程调用操作系统提供的select函数异步等待接收通信报文,如果没有报文到达,进程进入休眠状态,如果有报文到达,进程被操作系统内核唤醒。
2)进程被操作系统内核唤醒,select函数返回。进程调用内核模块提供的接收函数,直接获取指向保存在一级共享内存区的通信报文的指针,通过该指针直接访问通信报文,不需要将报文拷贝到进程的地址空间。
6、通过3和4的说明可以看出,无论进程A和进程B在同一个主机上还是在不同的主机上,应用进程都使用同样的函数接口以及同一种通信报文格式(图1所示的报文帧格式)来进行通信,实现了本发明提出的统一的函数接口和统一的通信报文格式。
以上实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。
Claims (3)
1.一种多主机进程间通信的方法,其特征在于包括如下内容:若是同一主机内的不同进程间需要通信,使用两级共享内存来收发报文,从而实现数据的零拷贝;若是不同主机内的进程需要通信,将报文组织成二层以太网帧格式,不经过协议栈直接发送给接收方;且前述两种通信方式采用统一的函数接口和统一的通信报文格式。
2.如权利要求1所述的一种多主机进程间通信的方法,其特征在于:所述方法中,对于同一主机内的不同进程间的通信:各进程将第一级共享内存映射到进程自己的地址空间,通信的发起方通过指针直接在第一级共享内存区中组织报文,通信的接收方通过指针直接在第一级共享内存区中访问报文;各进程将第二级共享内存映射到进程自己的地址空间,进程在调用内核模块提供的各种函数时,将函数实参直接写入第二级共享内存,内核模块直接读取进程的第二级共享内存,获取函数实参。
3.如权利要求1所述的一种多主机进程间通信的方法,其特征在于:所述方法中,对于不同主机间进程的通信:将报文组织成二层以太网帧格式,不经过协议栈,直接调用系统网络设备的以太网发送函数,将报文发送给接收方主机。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310128953.1A CN104102550A (zh) | 2013-04-12 | 2013-04-12 | 一种多主机进程间通信的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310128953.1A CN104102550A (zh) | 2013-04-12 | 2013-04-12 | 一种多主机进程间通信的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104102550A true CN104102550A (zh) | 2014-10-15 |
Family
ID=51670721
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310128953.1A Pending CN104102550A (zh) | 2013-04-12 | 2013-04-12 | 一种多主机进程间通信的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104102550A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107491355A (zh) * | 2017-08-17 | 2017-12-19 | 山东浪潮商用系统有限公司 | 一种基于共享内存的进程间功能调用方法及装置 |
WO2019072260A1 (zh) * | 2017-10-13 | 2019-04-18 | 华为技术有限公司 | 一种进程间通信的方法及系统 |
CN111045801A (zh) * | 2019-11-19 | 2020-04-21 | 蓝箭航天空间科技股份有限公司 | 支持多处理器的统一任务间通信方法及火箭通信方法 |
CN112181670A (zh) * | 2019-07-02 | 2021-01-05 | 西安诺瓦星云科技股份有限公司 | 进程间通讯方法及装置和Linux设备 |
CN112416625A (zh) * | 2020-11-30 | 2021-02-26 | 深信服科技股份有限公司 | 免拷贝的进程间通信系统及方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1859327A (zh) * | 2006-02-09 | 2006-11-08 | 华为技术有限公司 | 一种消息传递的方法、装置和系统 |
CN101075201A (zh) * | 2007-06-26 | 2007-11-21 | 北京邮电大学 | 各组件进程之间统一通信的通用消息总线的实现方法 |
CN102662775A (zh) * | 2012-03-29 | 2012-09-12 | 奇智软件(北京)有限公司 | 一种进程通信方法和装置 |
CN102799490A (zh) * | 2011-05-27 | 2012-11-28 | 北京神州泰岳软件股份有限公司 | 一种实现一对多的进程间通信的系统和方法 |
-
2013
- 2013-04-12 CN CN201310128953.1A patent/CN104102550A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1859327A (zh) * | 2006-02-09 | 2006-11-08 | 华为技术有限公司 | 一种消息传递的方法、装置和系统 |
CN101075201A (zh) * | 2007-06-26 | 2007-11-21 | 北京邮电大学 | 各组件进程之间统一通信的通用消息总线的实现方法 |
CN102799490A (zh) * | 2011-05-27 | 2012-11-28 | 北京神州泰岳软件股份有限公司 | 一种实现一对多的进程间通信的系统和方法 |
CN102662775A (zh) * | 2012-03-29 | 2012-09-12 | 奇智软件(北京)有限公司 | 一种进程通信方法和装置 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107491355A (zh) * | 2017-08-17 | 2017-12-19 | 山东浪潮商用系统有限公司 | 一种基于共享内存的进程间功能调用方法及装置 |
WO2019072260A1 (zh) * | 2017-10-13 | 2019-04-18 | 华为技术有限公司 | 一种进程间通信的方法及系统 |
US11892953B2 (en) | 2017-10-13 | 2024-02-06 | Huawei Technologies Co., Ltd. | Interprocess communication method and interprocess communications system |
CN112181670A (zh) * | 2019-07-02 | 2021-01-05 | 西安诺瓦星云科技股份有限公司 | 进程间通讯方法及装置和Linux设备 |
CN112181670B (zh) * | 2019-07-02 | 2023-04-11 | 西安诺瓦星云科技股份有限公司 | 进程间通讯方法及装置和Linux设备 |
CN111045801A (zh) * | 2019-11-19 | 2020-04-21 | 蓝箭航天空间科技股份有限公司 | 支持多处理器的统一任务间通信方法及火箭通信方法 |
CN112416625A (zh) * | 2020-11-30 | 2021-02-26 | 深信服科技股份有限公司 | 免拷贝的进程间通信系统及方法 |
CN112416625B (zh) * | 2020-11-30 | 2024-04-09 | 深信服科技股份有限公司 | 免拷贝的进程间通信系统及方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11929927B2 (en) | Network interface for data transport in heterogeneous computing environments | |
US9672143B2 (en) | Remote memory ring buffers in a cluster of data processing nodes | |
EP3042296B1 (en) | Universal pci express port | |
CN100414908C (zh) | 一种支持虚拟接口的存储网络适配器 | |
US7606933B2 (en) | Shared memory and high performance communication using interconnect tunneling | |
US8615623B2 (en) | Internet connection switch and internet connection system | |
JP4670676B2 (ja) | スイッチ及びネットワークブリッジ装置 | |
CN101304373B (zh) | 一种实现局域网内高效传输大块数据的方法及系统 | |
US7685319B2 (en) | Low latency communication via memory windows | |
CN106301859B (zh) | 一种管理网卡的方法、装置及系统 | |
US8631184B2 (en) | Interconnection method and device, for example for systems-on-chip | |
WO2013136522A1 (ja) | 計算機システム及び計算機間のデータ通信方法 | |
CN105677597A (zh) | 数据写入方法及装置 | |
WO2022001417A1 (zh) | 一种数据传输方法、处理器系统及内存访问系统 | |
CN104102550A (zh) | 一种多主机进程间通信的方法 | |
US9015380B2 (en) | Exchanging message data in a distributed computer system | |
CN101257457A (zh) | 网络处理器复制报文的方法和网络处理器 | |
CN102375789B (zh) | 一种通用网卡非缓存的零拷贝方法及零拷贝系统 | |
WO2010100027A1 (en) | Copy circumvention in a virtual network environment | |
CN102291298B (zh) | 一种高效的面向长消息的计算机网络通信方法 | |
CN105630727A (zh) | 多SoC节点之间的访问方法、装置和系统 | |
US8194670B2 (en) | Upper layer based dynamic hardware transmit descriptor reclaiming | |
JP5110156B2 (ja) | スイッチ及びネットワークブリッジ装置 | |
WO2016095340A1 (zh) | 数据发送成功的确认方法及装置 | |
US9424227B2 (en) | Providing byte enables for peer-to-peer data transfer within a computing environment |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20141015 |