CN102971723B - 一种分布式多进程通信方法和装置 - Google Patents

一种分布式多进程通信方法和装置 Download PDF

Info

Publication number
CN102971723B
CN102971723B CN201180001507.3A CN201180001507A CN102971723B CN 102971723 B CN102971723 B CN 102971723B CN 201180001507 A CN201180001507 A CN 201180001507A CN 102971723 B CN102971723 B CN 102971723B
Authority
CN
China
Prior art keywords
message
kernel state
shared queue
target
address
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.)
Active
Application number
CN201180001507.3A
Other languages
English (en)
Other versions
CN102971723A (zh
Inventor
王志刚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority claimed from PCT/CN2011/076529 external-priority patent/WO2012159305A1/zh
Publication of CN102971723A publication Critical patent/CN102971723A/zh
Application granted granted Critical
Publication of CN102971723B publication Critical patent/CN102971723B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明实施例公开了一种分布式多进程通信方法和装置,该方法包括:可编程硬件组件接收来自源进程的报文,所述报文中包括源进程地址和目标进程地址;所述可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,使所述目标进程根据所述目标共享队列获取所述报文。采用本发明,可高效的实现各种进程之间的通信。

Description

一种分布式多进程通信方法和装置
技术领域
本发明涉及处理器系统领域,尤其涉及一种分布式多进程通信方法和装置。
背景技术
多内核(multicore chips),或称多核芯片是指在一枚处理器(chip)中集成两个或多个完整的计算引擎(内核)。对应用多核芯片的计算机,其对计算机操作系统的要求也与传统系统不同。多核操作系统最大的特点是将内存、输入输出(Input Output,IO)外设资源共享给多个内核使用。如基于对称多处理(Symmetrical Multi-Processing,SMP)内核的Linux操作系统是一种目前广泛使用的多核操作系统。
基于SMP内核的Linux操作系统也越来越广泛地应用于通信系统中,在通信系统中通常利用Linux操作系统亲和性将进程绑定到特定的硬件核上。但由于Linux进程的用户访问空间是独立的,两个进程互相不能访问对方的用户空间,这就存在进程之间互相通信的问题。例如,在一个Linux操作系统内的多个用户进程之间、一个单板的Linux系统用户进程和其他单板的Linux系统用户进程之间、一个单板的Linux系统用户进程和其他单板其他操作系统(如实时操作系统vxworks等)之间都存在进程间通信的需要求,这也是分布式多进程通信的情况。
在现有的Linux操作系统中,为进程之间的通信提供了包括管道、先进先出(First In First Out,FIFO)、消息队列、信号量、共享内存、信号、套接字(SOCKET)机制等方式。
总的来说上述的进程间通信机制使用简单,不适使用多进程之间多参数的通信,只适用于一个Linux SMP系统中的不同进程之间的通信,无法实现位于不同单板不同操作系统之间进程间通信。
而基于Linux网卡驱动的零拷贝技术也存在诸多问题。在该技术中,用户进程将整个报文物理内存映射到用户进程空间,使用网卡驱动和用户进程之间的共享队列实现报文交互的零拷贝,将网卡接收到所有报文捕获到用户进程。在用户态上运行一个转发进程,用于识别送往各个不同用户进程的报文,再通过位于用户态的共享队列和各个用户进程通信。当用户要发送报文时候,先将报文发送到转发进程,由转发进程发送到网卡驱动最后出网卡硬件。
该技术采用网卡驱动底层报文捕获方法,将所有报文接收到转发进程,由于传输控制协议(Transmission Control Protocol,TCP)通信的报文需要使用Linux的内核协议栈进行处理。这样需要转发进程识别后再下送到Linux协议栈,Linux协议栈处理完成后再由内核协议栈交给用户态进程处理。这种方式实现困难而且效率较低。由于没有SOCKET编程接口,给应用程序带来很多移植性问题。同时,内核态的网卡驱动通过中断方式接收来自网卡的报文,频繁的中断和软中断严重影响了Linux内核性能。另外中断的处理需要绑定到一个核上,浪费了有限的中央处理器(Central Processing Unit,CPU)资源,使得位于内核态的网卡驱动升级更新困难。
发明内容
本发明实施例所要解决的技术问题在于,提供一种用分布式多进程通信方法和装置。可高效的实现各种进程之间的通信。
为了解决上述技术问题,本发明实施例提供了一种分布式多进程通信方法,包括:
可编程硬件组件接收来自源进程的报文,所述报文中包括源进程地址和目标进程地址;
所述可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,使所述目标进程根据所述目标共享队列获取所述报文。
本发明实施例还提供了一种分布式多进程通信方法,包括:
可编程硬件组件从源共享队列中获取报文,所述报文是源进程写入与所述源进程对应的源共享队列的报文,且所述报文包括源进程地址和目标进程地址;
可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发。
相应的,本发明实施例还提供了一种用于分布式多进程通信的装置,包含可编程硬件组件,该可编程硬件组件包括:
接收模块,用于接收来自源进程的报文,其中,所述报文中包括源进程地址和目标进程地址;
写入模块,用于根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,使所述目标进程根据所述目标共享队列获取所述报文。
相应的,本发明实施例还包括一种用于分布式多进程通信的装置,包含可编程硬件组件,该可编程硬件组件包括:
获取模块,用于从所述源共享队列中获取报文,所述报文是源进程写入与所述源进程对应的源共享队列,且所述报文包括源进程地址和目标进程地址;
转发模块,用于根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发。
本发明实施例还提供了一种通信装置,可进行分布式多进程通信,所述装置包括:
可编程硬件组件,用于接收来自源进程的报文,并根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,其中,所述报文中包括源进程地址和目标进程地址;
至少一个进程组件,用于根据所述目标共享队列获取所述报文。
相应的,本发明实施例还提供了一种通信装置,可进行分布式多进程通信,该装置包括:
至少一个进程组件,用于将报文写入与所述进程组件对应的源共享队列,所述报文包括源进程地址和目标进程地址;
可编程硬件组件,用于从所述源共享队列中获取所述报文,并根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发。
在本发明实施例中,新设置一可编程硬件组件,其根据本地路由分发信息进行进程间报文的转发,可以通过灵活的配置路由分发信息来实现对特定进程报文的接收、屏蔽不想要的垃圾报文,同时采用目标共享队列交互报文,实现了内存零拷贝,减少了系统调用,减少了CPU的占有率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例中的分布式多进程通信方法的一个具体流程示意图;
图2是本发明实施例中的三种报文的一个具体格式示意图;
图3是本发明实施例中的分布式多进程通信方法的另一个具体流程示意图;
图4是存储在可编程硬件组件中的路由转发信息的内容示意图;
图5是本发明实施例中的报文发送方向的一个具体处理流程的示意图;
图6是本发明实施例中的接收方向的内核侧一个具体处理流程的示意图;
图7是本发明实施例中的报文接收方向的用户侧的一个具体处理流程示意图;
图8是本发明实施例中的主备进程倒换时的示意图;
图9是本发明实施例中的分布式多进程通信装置的一个具体组成示意图;
图10是本发明实施例中的可编程硬件组件的一个具体组成示意图;
图11是本发明实施例中的分布式多进程通信装置的另一个具体组成示意图;
图12是本发明实施例中的分布式多进程通信装置的另一个具体组成示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明实施例中通过设置运行在操作系统之外的可编程硬件组件,如FPGA逻辑组件)来对报文进行分发处理,可以在增加极低的硬件成本的基础上实现不依赖于操作系统的进程间通讯。同时,为进一步提高效率,可采用用户态驱动接收来自FPGA的用户数据报文(User Internet Protocol,UIP)报文,内核态虚拟网卡驱动接收来自FPGA的TCP报文等,以实现用户报文的零拷贝,且充分利用用户态驱动,具有调试方便,容易升级修改,不易导致内核挂死等优点。同时由内核协议栈进行处理后再交给用户态进程处理,充分发挥操作系统中内核丰富的网络协议栈功能。
同时,本发明实施例可运用在Linux操作系统中,但不限于Linux操作系统,也可以应用于windows/vxworks等操作系统,或者是无操作系统的裸核应用中。
如图1所示,为本发明实施例中的分布式多进程通信方法的一个具体流程示意图,在该实施例中,以可编程硬件组件进行报文接收后对报文进行分发处理为例进行说明,该方法包括如下步骤。
101、可编程硬件组件接收来自源进程的报文,所述报文中包括源进程地址和目标进程地址。所述可编程硬件组件可以是可进行编程的逻辑电路,如,运行在操作系统之外的FPGA逻辑等,只要该逻辑电路可以实现所需的编程功能。
可编程硬件组件通过通讯接口,如每秒万兆以太网连接单元(X EthernetAttachment Unit Interface,XAUI)接口、SPi4接口、serdes接口或者Rgmii接口等,接收来自其他单板的以太网报文,或是通过共享队列获得单板内的某一进程发送给单板内的其他进程的报文。因而,此处描述的源进程可以是与可编程硬件组件运行在同一单板上的进程,也可以是另一单板运行的进程。
上述分布式多进程交互的报文通常有如下几种类型:实现和服务器单板的可靠通信的TCP报文、实现进程之间点对点的通信的进程间通信(Inter-Process Communication,IPC)报文、实现进程之间业务数据传递的UIP报文、还有ARP报文、ICMP报文、Ping报文等。其中,ARP协议和ICMP协议是常用的TCP/IP底层协议,是在对网络故障进行诊断的时候最常用的协议。ARP协议负责将某个IP地址解析成对应的媒体访问控制(MediaAccess Control,MAC)地址。ICMP报文提供针对网络层的错误诊断、拥塞控制、路径控制和查询服务四项大的功能。Ping命令通过向计算机发送ICMP回应报文并且监听回应报文的返回,以校验与远程计算机或本地计算机的连接。
报文的物理传输采用以太网数据帧封装,报文开头为目标进程和源进程的MAC地址,如图2所示,为本发明实施例中的三种报文的一个具体格式示意图,在报文中包括源进程地址、目标进程地址、报文类型和相应通信报文。其中进程全局唯一地址是整个系统中唯一标识进程的标识号。本例中只用了2个字节,将进程地址的内容和MAC地址对应起来。这样进程地址的高2字节就固定不变,同样MAC地址的高4字节固定不变。
其中和服务器单板的可靠通信报文是承载在TCP之上的,用于下载进程的配置数据、进程节点之间的拓扑关系、以及进程接收多播报文需要加入的多播组。该报文由MAC头、IP头、TCP头以及静荷组成,这种类型报文数据较少。
进程之间点对点的通信IPC报文,采用自定义一种以太网帧,MAC头中的帧类型设置为私有类型。该通信报文用于两个进程之间可靠滑动窗口、确认重发方式的通信。该报文由MAC头以及静荷组成,这种类型报文数量较多。
进程之间业务数据UIP报文,承载在IP报文之上,采用一种自定义的IP协议号。该通信报文包括用于两个进程之间的单播业务数据报文和一对多个进程之间的多播业务数据报文。该报文由MAC头、IP头以及静荷组成,这种类型报文数量最多。
102、可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,使所述目标进程根据所述目标共享队列获取所述报文。一般,一个目标进程对应有自己的目标共享队列,其可以从该队列中获取报文。当然,对于其他未配置路由转发表信息的报文将被可编程硬件组件丢弃。
在本步骤中,由于用户态驱动具有容易在线升级等优点,可将报文根据具体类型由用户态驱动和内核态驱动分别处理,当然,也可以不做区分而全部由内核态处理。
若采用分别处理的方案,则将报文分为两种类型:用户态类型和内核态类型,目标共享队列则分为与用户态驱动共享队列(或称用户进程共享队列)和与内核态驱动共享队列(或称内核共享队列)。这样一来,本步骤具体可包括:所述可编程硬件组件识别所述报文类型;所述可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将用户态类型报文写入与所述目标进程对应的用户进程共享队列,将内核态类型报文写入与内核态驱动组件对应的内核共享队列。
在区别哪些报文由用户态驱动处理,哪些报文由内核态驱动处理时,可按如下方式,即用户态类型报文包括进程间通讯报文和/或用户数据报文,内核态类型报文包括TCP(传输控制)报文、ARP报文、ICMP报文中的一种或多种。
同时,在本例中,在将报文写入内核共享队列,由内核态驱动进行报文传递时,可包括:所述可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入与内核态驱动组件对应的内核共享队列;所述内核态驱动组件获取所述内核共享队列的报文,并将所述报文发送至Linux协议栈;所述Linux协议栈将报文写入SOCKET接收缓冲区,以便所述目标进程从所述SOCKET接收缓冲区中获得所述报文。
那么从目标进程侧获取报文的过程来看,相应上述的不同报文的区别处理方式,使目标进程根据所述目标共享队列获取所述报文则可包括:使所述目标进程中的用户态驱动组件从所述用户进程共享队列获取所述用户态类型报文并转发给所述目标进程中的用户态类型报文处理模块进行报文解析处理;所述内核态驱动组件从所述内核共享队列获取所述内核态类型报文,并将所述内核态类型报文发送给所述目标进程(如,对于由内核态虚拟网卡驱动组成的内核态驱动组件来说,可由内核态虚拟网卡驱动将报文转发内核协议栈处理,再通过SOCKET接口交给目标进程),使所述目标进程中的内核态类型报文处理模块接收并进行报文解析处理。
上述步骤中,主要描述了可编程硬件组件接收报文后的处理过程,相应的,可编程硬件组件也可进行报文发送。那么相应于上述流程,假定一个单板具有一个可编程硬件组件(当然,也可以有多个可编程硬件组件,每个可编程硬件组件负责单板中部分进程的通信),若报文是同一单板内进程发送给另一进程时,则处理报文发送的可编程硬件组件和处理报文接收的可编程硬件组件可为同一对象,若报文是另一单板内的进程发送给本单板中的进程时,则报文发送的可编程硬件组件和处理报文接收的可编程硬件组件为不同对象。
如图3所示,为本发明实施例中的分布式多进程通信方法的另一具体流程示意图。在该实施例中,以可编程硬件组件进行源进程报文的发送处理为例进行说明,该方法包括如下步骤。
301、可编程硬件组件从源共享队列中获取报文,所述报文是源进程写入与所述源进程对应的源共享队列的报文,且所述报文包括源进程地址和目标进程地址。
302、可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发。当然,具体的转发根据报文的目的进程所在位置有所区别,若目的进程与源进程处于同一单板,且其报文转发的可编程硬件组件为同一对象,则本步骤中所描述的转发,是指将报文写入相应的目标共享队列中;若目的进程与源进程处于不同单板,则此处的转发是指可编程硬件组件将报文发送至相应的接口,如,前述的XAUI接口、SPi4接口、serdes接口或者Rgmii接口等,通过这些接口转发至目标单板,再由目标单板上的相应的可编程硬件组采取前述图1所描述的方式进行报文处理。
与前述实施例相同的,本例中的报文类型也可以包括多种,如报文类型包括用户态类型和内核态类型,则在步骤301之前还包括:所述源进程将用户态类型报文发送给所述源进程对应的用户进程共享队列;所述源进程将内核态类型报文发送给所述源进程对应的内核态驱动组件,所述内核态驱动组件将所述内核态类型报文写入与源进程对应的内核共享队列。
同时,上述各实施例中的报文也可包括单播报文、多播报文和广播报文,相应的路由分发信息中存储有所述单播报文的目的进程信息和所述多播报文的多个目的进程信息。在接收报文和发送报文时,需要区别报文为单播报文、多播报文还是广播报文。单播是在网络中从源地到目的地转发通信的过程。仅有一个发送者,和一个接受者,如可称为点对点通信;多播是在一个网络上一单个发送者和多个接收者之间的通信,多播技术在很多接收者同时想收听或看相同的源通过递送一单个信息流给很多接收者时被用于减少网络通信;“广播”可以理解为一个人通过广播喇叭对在场的全体说话,这样做的好处是通话效率高,信息一下子就可以传递到全体。
以下以示例说明多播报文和单播报文的格式,以及对应的路由转发信息的内容。
如图2所示,单播通信的MAC帧头地址最后两个字节设置为进程地址的最后两个字节,其他剩余字节内容为固定为00-e0-fc-fc;多播通信的MAC帧头地址最后两个字节设置为进程地址的最后两个字节,最高4字节固定为多播地址01-00-5e-58-58。多播地址根据最后一个字节划分为256个多播组,加入每个多播组的进程能够接收该地址多播报文。
如图4所示,为存储在可编程硬件组件中的路由转发信息(本例中,以路由转发表的形式存储)的内容示意图。
单播地址至少还有一列,另一列应该是进程号(标识入哪个队列)。多播匹配位图就是一列,每个进程占有一位,如果为1表示需要复制到该进程队列中,为不复制。这里定义了最大32个进程。其实可以扩展多于32个进程。当然,该表中也可包括目标进程地址,源进程地址,报文协议类型,掩码匹配等等。FPGA进行转发表掩码与匹配,如果成功匹配则写入指定的进程中。
如图所示,由单播MAC地址匹配表和多播组匹配位图表组成。单播MAC地址匹配表的数目由单板要运行的进程数目决定的,需要大于后者;多播MAC地址的匹配采用位图形式,将通讯的多播MAC地址按最后一个字节划分256个多播组,每个组设置一个匹配位图长字。这样每个要运行的进程对应位图长字中的一位,设置为1表示该进程要接收该多播报文,反之不接收。多播通信的报文是一对多的方式,这样匹配长字的各个位就表示对应的进程是否要接收。
相应于多播报文,在进行报文转发时需要根据情况对报文进行复制,即所述硬件逻辑组件识别所述报文为多播报文,根据所述多播报文的多个目的进程信息对所述多播报文进行复制;将复制获得的多个所述多播报文放入对应的目标共享队列中。
在源进程对应的硬件逻辑组件进行报文转发时也类似,若报文是发往不同的单板,则所述硬件逻辑组件识别所述报文为多播报文后,也要根据所述多播报文的多个目的进程信息对所述多播报文进行复制,并将复制获得的多个所述多播报文通过接口进行对应的转发。
为了更详细的描述上述流程,以下分别从报文发送和报文接收两个方面来详细描述本发明的具体实施例。
如图5所示,本发明实施例中的报文发送方向的处理流程示意图。本例中应用的系统为Linux系统。
501、当Linux用户进程发送IPC和UIP报文时,进程中的IPC和UIP报文处理模块将报文写入用户进程共享队列的进程发送队列中。FPGA逻辑定时查询该队列,如果发现有报文要发送,则检查该报文的目标MAC地址。对于单播报文则转步骤502处理,否则为多播报文转步骤503进行处理。图5中仅示例了,当Linux用户进程发送IPC和UIP报文时的FPGA逻辑组件执行的流程示意图。
当Linux用户进程发送TCP报文时,进程中的TCP报文处理模块通过创建的SOCKET发送到Linux系统内核的Linux协议栈进行处理,Linux协议栈处理完成后通过内核态驱动(如,调用网卡驱动的发送函数)将处理后的报文发送到FPGA逻辑组件(即FPGA芯片)处理。由于Linux协议栈采用SKB方式的内存管理,和网卡驱动使用的硬件共享内存不同,这里由网卡驱动进行一次报文拷贝。(图中未示)
502、对于单播报文,提取其目标MAC地址和单播路由分发表进行匹配,如果匹配成功则将该报文写入路由分发表指示的接收进程的接收共享队列中,如果匹配失败表明目标进程为另一单板中的进程,则将报文发送到XAUI接口出单板。
503、对于多播报文,提取其目标MAC地址获得多播组号,获得路由分发表中的多播组分发位图。如果该多播组分发位图为零则直接将报文发送到XAUI接口出单板。否则循环处理将报文依次写入多播组位图指示的接收进程的接收共享队列中,同时报文引用计数加一,处理完成后还需要将报文发送到XAUI接口出单板。因为多播接收者进程也可能存在于另一单板中。
如图6所示,本发明实施例中的报文接收方向的内核侧(即FPGA逻辑组件和其他内核驱动)的处理流程示意图。本例中应用的系统仍为Linux系统,假定报文来自另一单板。
601、FPGA逻辑组件从XAUI接口接收到报文后,首先分析其MAC头的报文类型域,如果是IPC报文则转步骤602处理,否则继续检查是否为UIP类型报文,如果是UIP报文则转步骤602继续处理,其他的类型报文则转步骤603进行处理。
602、对于IPC和UIP类型报文,其与上述发送报文的用户进程处理的流程类似。FPGA逻辑首先检查报文的目标MAC地址,如果是单播类型报文则转步骤604进行路由分发处理;否则为多播类型报文转步骤605继续处理。
603、对于非IPC、UIP类型的报文,FPGA逻辑写入网卡接收队列中,位于内核态的网卡驱动程序定时查询网卡接收队列,发现存在报文后将其上送Linux协议栈。由于Linux协议栈采用SKB方式的内存管理,和FPGA逻辑处理的硬件共享内存不同,这里需要进行一次报文拷贝。Linux协议栈中TCP协议处理完成后将报文写入SOCKET接收缓冲区,用户进程从SOCKET连接的接收缓冲区中得到通信报文。
604、对于单播类型的报文,提取其目标MAC地址和单播路由分发表进行匹配,如果匹配成功则将该报文写入路由分发表指示的接收进程的接收共享队列中。否则将报文丢弃。
605、对多播类型的报文,提取其目标MAC地址获得多播组号,获得路由分发表中的多播分发位图。如果该多播分发位图为零则将该报文丢弃;否则循环处理将报文依次写入多播位图指示的接收线程的接收共享队列中,同时报文引用计数加一。
如图7所示,本发明实施例中的报文接收方向的用户侧的处理流程示意图。本例为相应于图6中的内核侧处理后的用户侧的处理。
701、Linux用户态驱动组件(程序)定时查询自己的报文接收共享队列。
702、判断是否存在报文,如果存在报文则需要分析报文类型,对于IPC类型报文递交给上层IPC接收函数处理;对于UIP类型报文递交给上层UIP接收函数处理;如果共享队列中没有报文则进行睡眠1ms处理。
所述进程包括主用进程和备用进程,当进行主备进程切换时,将所述路由分发信息中的主用进程地址对应为备用进程地址,或将备用进程地址对应为主用进程地址。如图8所示,为本发明实施例中的主备进程倒换时的示意图。
如图所示,业务处理板H1上运行有进程AH11和进程B H12,业务处理单板H3运行有进程C H31和进程D H32。其中进程B H12和进程D H32是主备配置关系,进程B H12是主,进程D H32是备。主用进程处理业务数据包,而备用进程不处理,主备进程之间进行数据的同步操作。H2为多个业务板之间通信需要进行报文交换的单板,类似于常见的以太网交换机/Hub等。
业务处理单板上的每个进程启动后,通过TCP连接建立和槽位维护单板H4之间的链接,下载进程通信关系的拓扑表。每个进程根据下载的拓扑关系表配置到本单板的路由转发表中。配置的内容有本进程的通讯MAC地址,要加入的多播组位图等。
当进程关系发生主备倒换的时候,主用进程B H12倒换为备用进程,备用进程D H32倒换为主用进程。主备倒换的具体操作步骤为:
D11:操作维护单板H4向主用进程B H12发出倒换命令,主用进程修改路由转发表H13,将本进程的通讯MAC地址修改为备用进程的MAC地址,完成主用进程降为备用进程操作。来自其他进程的业务数据包到达业务处理板H1后,由于FPGA逻辑查询路由转发表H13失败,报文被丢弃,这样进程B H12将接收不到业务数据报文。
D12:操作维护单板H4向备用进程D H32发出倒换命令,备用进程D H32修改路由转发表H33,将本机的通讯MAC地址修改为主用进程的MAC地址,完成备用进程升级为主用进程操作。来自其他进程的业务数据包到达业务处理板H3后,由于FPGA逻辑查询路由转发表H33成功,报文被转发,这样进程DH32就能接收到业务数据包,
位于两块不同单板上的不同进程主备倒换的过程对于发送报文的进程是不可见,无需发送进程的参与,倒换过程比较简单,只需要修改路由转发表就行。
相应的,本发明实施例还提供了一种通信装置,可进行分布式多进程通信,如图9所示,本例中通信装置用于报文的接收,该装置包括:可编程硬件组件80,用于接收来自源进程的报文,并根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,其中,所述报文中包括源进程地址和目标进程地址;至少一个进程组件82,用于根据所述目标共享队列获取所述报文。当然,对于运行有多个进程的系统,则相应的包括多个进程组件。
相应的,若通信装置用于报文的发送时,该装置(未图示)包括:至少一个进程组件,用于将报文写入与所述进程组件对应的源共享队列,所述报文包括源进程地址和目标进程地址;可编程硬件组件,用于从所述源共享队列中获取所述报文,并根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发。
其中,如图10所示,本发明实施例中提供的用于分布式多进程通信的装置,可包括可编程硬件组件80,该可编程硬件组件80可包括:接收模块800,用于接收来自源进程的报文,其中,所述报文中包括源进程地址和目标进程地址;写入模块802,用于根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,使所述目标进程根据所述目标共享队列获取所述报文。
若,将报文分为内核态处理报文和用户态处理报文,则可编程硬件组件80可进一步包括(图10中虚线所示):识别模块804,用于识别所述报文类型,所述报文类型包括用户态类型和内核态类型;相应的,所述写入模块802还用于根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述用户态类型报文写入与所述目标进程对应的用户进程共享队列,将所述内核态类型报文写入与内核态驱动组件对应的内核共享队列。
当然,若所述报文包括单播报文、多播报文和广播报文,所述路由分发信息中存储有所述单播报文的目的进程信息、所述多播报文的多个目的进程信息;则所述识别模块804还用于识别所述报文为多播报文;所述写入模块802还用于根据所述多播报文的多个目的进程信息对所述多播报文进行复制,并将复制获得的多个所述多播报文放入对应的目标共享队列中。
当分布式多进程通信的装置用于源进程的报文转发时,其包括的可编程硬件组件(未图示)可包括获取模块,用于从所述源共享队列中获取报文,所述报文是源进程写入与所述源进程对应的源共享队列,且所述报文包括源进程地址和目标进程地址;转发模块,用于根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发。
当报文类型包括用户态类型和内核态类型,相应的,如图11所示,该进程组件82可包括:用户态驱动组件820,用于从所述用户进程共享队列获取用户态类型报文并转发给用户态类型报文处理模块822;用户态类型报文处理模块822,用于接收所述用户态类型报文,并进行报文解析处理;内核态类型报文处理模块824,用于接收内核态驱动组件84从所述内核共享队列获取后发送来的内核态类型报文,并进行报文解析处理。
相应的,所述装置8还包括内核态驱动组件84,用于从所述内核共享队列获取的所述内核态类型报文,并将所述内核态类型报文发送至所述内核态报文处理模块。
同样的,当可编程硬件组件进行源进程的报文转发时,则所述用户态驱动组件82还用于将用户态类型报文写入与所述可编程硬件组件共享的用户进程共享队列;所述内核态类型报文处理模块824还用于将内核态类型报文发送至所述内核态驱动组件;所述内核态驱动组件84还用于获取并将所述内核态类型报文写入与所述可编程硬件组件共享的内核共享队列;所述可编程硬件组件80还用于从所述用户进程共享队列和所述内核共享队列获取相应的报文,将根据本地存储的路由分发信息对所述报文进行转发。
上述装置中的各术语和功能与前述方法实施例中的类似,此处不做赘述。
如图12所示,为本发明实施例中的通信装置的另一个具体组成示意图。本例中,该装置采用Linux操作系统,FPGA逻辑组件通过XAUI接口收发以太网报文。
该装置由位于Linux内核态的内核态驱动组件G11、位于Linux用户态的用户态驱动组件G15,Linux操作系统协议栈G12以及FPGA逻辑组件G20组成。
运行于Linux系统中的进程通过自己的用户态驱动组件处理IPC和UIP报文,通过Linux协议栈处理TCP报文。每个进程管理自己在用户态的软件共享内存区G18,FPGA逻辑管理自己的硬件共享内存G22。这样,硬件FPGA接收到报文后用自己管理的内存,用户进程发送报文的时候用自己的内存,可以实现各自管理自己的内存,各自管理自己的内存具有简单、交互少、效率高等优点。
用户态驱动组件G15和PGA逻辑组件G20之间通过用户进程共享队列G16接收和发送报文。对应于前述的报文处理流程,本例中的处理步骤如下。
A11:Linux操作系统启动后装入内核态驱动组件(即虚拟网卡驱动)G11,映射用户进程共享队列G16、软件共享内存G18和硬件共享内存G22。同时将FPGA操作的寄存器地址映射到用户态,建立用户态驱动组件G15的程序环境。
这是由于,在Linux下进程采用虚拟内存机制,用户进程要从FPGA中读取报文就需要一个队列,该队列中存储的是报文的地址不是内容。即需要将共享队列G16的地址映射到进程自己的虚拟地址空间中。这里是G18、G22这块内存用来存储报文内容的。为了处理效率分成两个物理内存区。这里需要注意的是所有Linux进程映射这两块空间的虚拟地址是一样的,这样进程之间通信不会产生访问异常。而FPGA使用的是物理地址,用户态进程使用的是虚拟地址,这个工作由用户态驱动来转换。同时,由于Linux内核态与用户态之间是隔离的,只有Linux态运行在特权级别可以访问芯片的物理寄存器。用户态进程没有特权无法访问,但是用户态进程通过把寄存器的地址映射到用户空间使得用户态代码可以直接访问硬件寄存器。
A12:用户进程启动后,初始化映射用户进程共享队列、软件共享内存区和硬件共享内存区的地址空间。用户进程通过TCP通信模块G13连接操作维护中心,下载进程节点配置关系。最后将本进程的地址信息写入路由分发表G21中。
A13:来自XAUI口的以太网报文由FPGA逻辑组件G20接收处理,根据路由分发表G21中配置的信息,分析接收到的以太网报文。如果为IPC或UIP报文则写入用户进程共享队列G16中,由用户态驱动组件G15接收,最后交给UIP处理模块G14和IPC处理模块G17。对于其他类型报文写入网卡接收队列(即内核共享队列)G19中,由网卡驱动G11查询到后交给Linux协议栈G12处理,再通过SOCKET接口交给进程的TCP通信模块G13接收。
A14:用户态进程UIP处理模块G14和IPC处理模块G17需要发送报文时,从共享内存G18申请空间,由用户态驱动G15写入进程发送队列G16中。FPGA逻辑组件G20查询到用户进程报文后从进程发送队列G16中获取报文并发送到XAUI接口。对于TCP发送报文通过TCP通信模块G13建立的SOCKET接口发送到Linux内核协议栈G12,再调用内核态驱动组件G11的发送函数写入网卡发送队列(即内核共享队列)G19,最后由FPGA逻辑组件G20查询到后发送到XAUI接口。
其中,PGA逻辑组件G20需要接收来自XAUI接口的报文时候,从硬件共享内存区G22申请内存;FPGA逻辑组件G20释放内存时候,将内存归还到硬件共享内存区。用户态进程组件G15需要发送报文时候,从软件共享内存区G18分配内存;用户态进程G15释放内存时候,将内存归还到软件共享内存区。
当FPGA逻辑组件需要释放来自用户态进程产生的报文时候,构造一条报文释放消息写入到用户进程共享队列G16中。当用户态驱动组件G15查询到该条释放消息后,将报文内存释放到软件内存共享区G18。当用户进程需要释放来自FPGA逻辑组件接收的报文时候,构造一条报文释放消息写入到用户进程发送队列G16中。当FPGA逻辑查询到该条释放消息后,将报文内存释放到硬件共享内存区G22中。
当内核态驱动G11需要申请FPGA逻辑的硬件内存时候,从网卡缓存队列G19中申请硬件内存。该队列中的硬件内存由FPGA逻辑G20预先申请好放入。当内核态驱动G11需要释放FPGA逻辑的硬件内存时候,构造一条报文释放消息写入到网卡发送队列G16中。当FPGA逻辑查询到该条释放消息后,将报文内存释放到硬件共享内存区G22中。
在本发明实施例中,设置可编程硬件组件根据本地路由分发信息进行进程间报文的转发,可以通过灵活的配置路由分发信息来实现对特定进程报文的接收、屏蔽不想要的垃圾报文,同时采用目标共享队列交互报文,实现了内存零拷贝,减少了系统调用,减少了CPU的占有率。进一步的,将报文分为用户态处理和内核态处理,有效利用了用户态驱动容易进行在线升级、容易管理的优势。
采用可编程硬件组件管理硬件内存,用户态进程管理软件内存(即可编程硬件组件接收后的报文要写入内存,该块内存的申请释放由可编程硬件组件管理,所以这片内存叫硬件内存,同样进程管理的那片内存叫软件内存)。,各自管理自己的内存区,互不影响。有效地解决了用户进程和可编程硬件组件竞争内存资源的互锁问题。使用不同单板的路由转发表的机制可以很容易实现主备进程倒换,N+1备份方式以及进程迁移。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。

Claims (17)

1.一种分布式多进程通信方法,其特征在于,所述方法包括:
可编程硬件组件接收来自源进程的报文,所述报文中包括源进程地址和目标进程地址,所述可编程硬件组件运行在操作系统之外;
所述可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,使所述目标进程根据所述目标共享队列获取所述报文;
所述可编程硬件组件根据路由分发信息将所述报文写入目标共享队列包括:
所述可编程硬件组件识别报文类型,所述报文类型包括用户态类型和内核态类型;
所述可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述用户态类型报文写入与所述目标进程对应的用户进程共享队列,将所述内核态类型报文写入与内核态驱动组件对应的内核共享队列。
2.如权利要求1所述的分布式多进程通信方法,其特征在于,所述可编程硬件组件根据路由分发信息将所述内核态类型报文写入与内核态驱动组件对应的内核共享队列包括:
所述可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入与内核态驱动组件对应的内核共享队列;
所述内核态驱动组件获取所述内核共享队列的报文,并将所述报文发送至Linux协议栈;
所述Linux协议栈将报文写入SOCKET接收缓冲区,以便所述目标进程从所述SOCKET接收缓冲区中获得所述报文。
3.如权利要求1所述的分布式多进程通信方法,其特征在于,使所述目标进程根据所述目标共享队列获取所述报文包括:使所述目标进程中的用户态驱动组件从所述用户进程共享队列获取所述用户态类型报文并转发给所述目标进程中的用户态类型报文处理模块进行报文解析处理;
所述内核态驱动组件从所述内核共享队列获取所述内核态类型报文,并将所述内核态类型报文发送给所述目标进程,使所述目标进程中的内核态类型报文处理模块接收并进行报文解析处理。
4.如权利要求1所述的分布式多进程通信方法,其特征在于,所述用户态类型报文包括进程间通讯报文和/或用户数据报文,所述内核态类型报文包括TCP报文、ARP报文、ICMP报文中的一种或多种。
5.如权利要求1至4中任一项所述的分布式多进程通信方法,其特征在于,所述报文包括单播报文、多播报文和广播报文,所述路由分发信息中存储有所述单播报文的目的进程信息、所述多播报文的多个目的进程信息。
6.如权利要求5所述的分布式多进程通信方法,其特征在于,所述方法还包括:
所述可编程硬件组件识别所述报文为多播报文,根据所述多播报文的多个目的进程信息对所述多播报文进行复制;
将复制获得的多个所述多播报文放入对应的目标共享队列中。
7.如权利要求1至4中任一项所述分布式多进程通信方法,其特征在于,所述目标进程包括主用进程和备用进程,当进行主备进程切换时,将所述路由分发信息中的主用进程地址对应为备用进程地址,或将备用进程地址对应为主用进程地址。
8.一种分布式多进程通信方法,其特征在于,所述方法包括:
可编程硬件组件从源共享队列中获取报文,所述报文是源进程写入与所述源进程对应的源共享队列的报文,且所述报文包括源进程地址和目标进程地址,所述可编程硬件组件运行在操作系统之外,报文类型包括用户态类型和内核态类型;
可编程硬件组件根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发;
所述源进程将用户态类型报文发送给所述源进程对应的用户进程共享队列;
所述源进程将内核态类型报文发送给所述源进程对应的内核态驱动组件,所述内核态驱动组件将所述内核态类型报文写入与源进程对应的内核共享队列。
9.如权利要求8所述的分布式多进程通信方法,其特征在于,所述用户态类型报文包括进程间通讯报文和/或用户数据报文,所述内核态类型报文包括TCP报文、ARP报文、ICMP报文中的一种或多种。
10.一种用于分布式多进程通信的装置,包含可编程硬件组件,其特征在于,所述可编程硬件组件包括:
接收模块,用于接收来自源进程的报文,其中,所述报文中包括源进程地址和目标进程地址;
写入模块,用于根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,使所述目标进程根据所述目标共享队列获取所述报文;
识别模块,用于识别报文类型,所述报文类型包括用户态类型和内核态类型;
所述写入模块还用于根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述用户态类型报文写入与所述目标进程对应的用户进程共享队列,将所述内核态类型报文写入与内核态驱动组件对应的内核共享队列;
其中,所述可编程硬件组件运行在操作系统之外。
11.如权利要求10所述的装置,其特征在于,所述报文包括单播报文、多播报文和广播报文,所述路由分发信息中存储有所述单播报文的目的进程信息、所述多播报文的多个目的进程信息;
所述识别模块还用于识别所述报文为多播报文;
所述写入模块还用于根据所述多播报文的多个目的进程信息对所述多播报文进行复制,并将复制获得的多个所述多播报文放入对应的目标共享队列中。
12.如权利要求10至11中任一项所述的装置,其特征在于,所述可编程硬件组件还包括获取模块,所述获取模块用于从源共享队列中获取报文,并根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发;
其中,所述报文为所述源进程写入的与所述源进程对应的源共享队列的报文,所述报文中包括源进程地址和目标进程地址。
13.如权利要求10所述的装置,其特征在于,所述用户态类型报文包括进程间通讯报文和/或用户数据报文,所述内核态类型报文包括TCP报文、ARP报文、ICMP报文中的一种或多种。
14.一种用于分布式多进程通信的装置,包含可编程硬件组件,其特征在于,所述可编程硬件组件包括:
获取模块,用于从源共享队列中获取报文,所述报文是源进程写入与所述源进程对应的源共享队列中的,且所述报文包括源进程地址和目标进程地址,报文类型包括用户态类型和内核态类型;
转发模块,用于根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发;
用户态驱动组件,用于从用户进程共享队列获取用户态类型报文并转发给用户态类型报文处理模块;
用户态类型报文处理模块,用于接收所述用户态类型报文,并进行报文解析处理;
内核态驱动组件,用于从内核共享队列获取所述内核态类型报文,并将所述内核态类型报文发送至所述内核态报文处理模块;
内核态类型报文处理模块,用于接收内核态驱动组件从所述内核共享队列获取后发送来的内核态类型报文,并进行报文解析处理;
其中,所述可编程硬件组件运行在操作系统之外。
15.一种通信装置,可进行分布式多进程通信,其特征在于,所述装置包括:
可编程硬件组件,用于接收来自源进程的报文,并根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息将所述报文写入目标进程对应的目标共享队列,其中,所述报文中包括源进程地址和目标进程地址,所述可编程硬件组件运行在操作系统之外,报文类型包括用户态类型和内核态类型;
至少一个进程组件,用于根据所述目标共享队列获取所述报文;
所述进程组件包括:
用户态驱动组件,用于从用户进程共享队列获取用户态类型报文并转发给用户态类型报文处理模块;
用户态类型报文处理模块,用于接收所述用户态类型报文,并进行报文解析处理;
内核态类型报文处理模块,用于接收内核态驱动组件从内核共享队列获取后发送来的内核态类型报文,并进行报文解析处理;
相应的,所述装置还包括内核态驱动组件,用于从所述内核共享队列获取的所述内核态类型报文,并将所述内核态类型报文发送至所述内核态报文处理模块。
16.如权利要求15所述的通信装置,其特征在于,
所述用户态驱动组件还用于将用户态类型报文写入与所述可编程硬件组件共享的用户进程共享队列;
所述内核态类型报文处理模块还用于将内核态类型报文发送至所述内核态驱动组件;
所述内核态驱动组件还用于获取并将所述内核态类型报文写入与所述可编程硬件组件共享的内核共享队列;
所述可编程硬件组件还用于从所述用户进程共享队列和所述内核共享队列获取相应的报文,将根据本地存储的路由分发信息对所述报文进行转发。
17.一种通信装置,可进行分布式多进程通信,其特征在于,所述装置包括:
至少一个进程组件,用于将报文写入与所述进程组件对应的源共享队列,所述报文包括源进程地址和目标进程地址,报文类型包括用户态类型和内核态类型;
可编程硬件组件,用于从所述源共享队列中获取所述报文,并根据所述报文中的源进程地址、目标进程地址和本地存储的路由分发信息对所述报文进行转发,所述可编程硬件组件运行在操作系统之外;
所述进程组件将报文写入与所述进程组件对应的源共享队列包括:
所述进程组件将用户态类型报文发送给所述进程组件对应的用户进程共享队列;
所述进程组件将内核态类型报文发送给所述进程组件对应的内核态驱动组件,所述内核态驱动组件将所述内核态类型报文写入与所述进程组件对应的内核共享队列。
CN201180001507.3A 2011-06-28 一种分布式多进程通信方法和装置 Active CN102971723B (zh)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/CN2011/076529 WO2012159305A1 (zh) 2011-06-28 2011-06-28 一种分布式多进程通信方法和装置

Publications (2)

Publication Number Publication Date
CN102971723A CN102971723A (zh) 2013-03-13
CN102971723B true CN102971723B (zh) 2016-11-30

Family

ID=

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1949206A (zh) * 2005-10-12 2007-04-18 大唐移动通信设备有限公司 多处理器系统的消息通信方法及装置
CN101127685A (zh) * 2007-09-20 2008-02-20 中兴通讯股份有限公司 一种进程间通讯装置及其进程间通讯方法
CN101448018A (zh) * 2008-12-26 2009-06-03 中兴通讯股份有限公司 进程间通信方法和装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1949206A (zh) * 2005-10-12 2007-04-18 大唐移动通信设备有限公司 多处理器系统的消息通信方法及装置
CN101127685A (zh) * 2007-09-20 2008-02-20 中兴通讯股份有限公司 一种进程间通讯装置及其进程间通讯方法
CN101448018A (zh) * 2008-12-26 2009-06-03 中兴通讯股份有限公司 进程间通信方法和装置

Similar Documents

Publication Publication Date Title
US11757763B2 (en) System and method for facilitating efficient host memory access from a network interface controller (NIC)
EP1892929B1 (en) A method, an apparatus and a system for message transmission
EP2356775B1 (en) Central controller for coordinating multicast message transmissions in distributed virtual network switch environment
US7428598B2 (en) Infiniband multicast operation in an LPAR environment
US9268729B2 (en) Systems and methods for efficient handling of data traffic and processing within a processing device
US20030061402A1 (en) Method and apparatus enabling both legacy and new applications to access an InfiniBand fabric via a socket API
US6370583B1 (en) Method and apparatus for portraying a cluster of computer systems as having a single internet protocol image
CN114024880B (zh) 基于代理ip与流表的网络靶场探针采集方法与系统
CN101990002A (zh) 控制器集成
CN1528069A (zh) 使用故障修复或多播地址的网络节点故障修复
US7269661B2 (en) Method using receive and transmit protocol aware logic modules for confirming checksum values stored in network packet
CN102334112A (zh) 用于虚拟机网络的方法和系统
TW200419358A (en) Integrated circuit and method for exchanging data
CN101335685B (zh) 一种利用重定向技术实现特定报文优先处理的方法
US7009974B1 (en) Method and apparatus for updating addresses in network processing device
US6977924B1 (en) Control and distribution protocol for a portable router framework
WO2004023722A1 (en) Stacking a plurality of data switches
WO2012159305A1 (zh) 一种分布式多进程通信方法和装置
CN101175068A (zh) 多版本组播协议融合方法
CN102971723B (zh) 一种分布式多进程通信方法和装置
CN114138707A (zh) 一种基于fpga的数据传输系统
Dai et al. Design of remote upgrade of equipment monitoring system software
CN103475561B (zh) 虚拟通信链路动态开关方法和装置
CN117812027B (zh) Rdma加速组播方法、装置、设备及存储介质
US20230403229A1 (en) System and method for facilitating efficient host memory access from a network interface controller (nic)

Legal Events

Date Code Title Description
PB01 Publication
SE01 Entry into force of request for substantive examination
GR01 Patent grant