CN106648928A - 一种进程间通讯的方法及装置 - Google Patents
一种进程间通讯的方法及装置 Download PDFInfo
- Publication number
- CN106648928A CN106648928A CN201611069320.8A CN201611069320A CN106648928A CN 106648928 A CN106648928 A CN 106648928A CN 201611069320 A CN201611069320 A CN 201611069320A CN 106648928 A CN106648928 A CN 106648928A
- Authority
- CN
- China
- Prior art keywords
- request
- message
- response
- session
- client
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/545—Interprogram communication where tasks reside in different layers, e.g. user- and kernel-space
Abstract
本发明涉及嵌入式操作系统进程间通讯领域,针对现有技术存在的问题,提供一种进程间通讯的方法及装置,在使用基于流的UNIX域套接字将各进程组建为星形通讯拓扑的基础上,用远程过程调用的形式实现任意两个进程间的消息传递。本发明设置n个进程,其中一个为SERVER端,其余n‑1个为CLIENT端。始发请求消息的进程为源进程,源进程在发送需要应答的请求消息前做本地会话记录;当源进程为CLIENT端时,请求消息发给SERVER端,SERVER端根据请求消息中的目的进程ID判断SERVER端是本次请求的转发端还是接收端,并进行消息处理;当源进程为SERVER端时,请求消息发给相应的CLIENT端进行处理。
Description
技术领域
本发明涉及嵌入式操作系统进程间通讯领域,尤其是一种进程间通讯的方法及装置。
背景技术
目前的数通设备上运行的操作系统一般是以LINUX内核为核心结合各厂商自己的系统管理和应用程序组建而成的。整个系统在设计上往往会用到多进程的软件架构,如此也就不可避免的有进程间通讯的需求。在整个软件系统当中,如果进程间通讯的需求非常普遍,在系统平台角度就很有必要提供一套通用、便捷、可靠、高效的进程间通讯机制供上层软件开发使用。而不是让上层软件在每当有进程间通讯需求时直接使用LINUX提供的各种丰富的系统调用来实现。
上层软件开发直接使用系统调用实现进程间通讯的缺点是显而易见的:
一、涉及进程间通讯的软件开发需要熟悉操作系统的各种机制,开发上有一定难度,开发人员独立开发,系统整体的质量难以保证;
二、开发人员独立为自己开发的模块开发进程间通讯的机制,从整体上看也是开发工作的重复投入;
三、会增加后期软件维护的难度,因为重复投入之后系统中往往会存在大量功能类似却实现各不相同的的冗余代码。
发明内容
本发明所要解决的技术问题是:针对现有技术存在的问题,提供一种进程间通讯的方法及装置,在使用基于流的UNIX域套接字将各进程组建为星形通讯拓扑的基础上(如图1所示),用远程过程调用的形式(如图2所示)实现任意两个进程间的消息传递。供平台之上的软件开发使用。
本发明采用的技术方案如下:
一种进程间通讯的方法包括:
通讯拓扑建立步骤,设置n个进程,每个进程静态设置唯一标识的进程ID;选择一个进程作为通讯拓扑中SERVER端;其余n-1个进程分别对应作为n-1个CLIENT端;n个进程创建基于流的UNIX域套接字并绑定自身的SOCK PATH标识,SERVER端进入侦听并接受CLIENT端发起的连接,CLIENT端周期性向SERVER端发起连接直到连接建立为止;SERVER端靠接受连接时获取对端的CLIENT端的SOCK PATH标识识别出对端的CLIENT端进程ID;SERVER和CLIENT端都为自己保存已连接进程记录;
其中进程间通讯采用远程过程调用(RPC)的形式:
基于通讯拓扑建立步骤建立的通信拓扑,任意一个进程可以作为源进程发送请求消息,期望应答的目的进程是除源进程以外的任意进程;目的进程接收到请求消息后执行请求回调函数完成本次请求的响应,然后可选的向源进程发送应答消息(根据请求消息中的应答标志位)从而完成一次会话;
上层软件在源进程发送请求时要指定:目的进程ID、操作码、超时参数、发送的消息体、请求类型,若是同步请求还要指定承载应答消息的BUFFER,若是异步请求要可选的给出应答处理回调函数和回调参数;当异步请求不指定应答处理回调函数时,应答属性就是无需应答,否则就是需要应答,所有的同步请求应答属性都是需要应答;上层软件在设计时如果期望某个进程响应某种请求操作码,就要提前在该进程内注册该操作码对应的请求回调函数;请求类型指的是同步请求或者异步请求;
进一步的,请求回调函数的返回值和参数如下:
请求回调函数由上层软件定,用于在一个进程内响应某种操作码对应的请求,在一个进程中,一个操作码对应一个请求回调函数,函数返回值0表示执行成功,非0表示相应的错误;请求回调函数的入参包括:请求源进程ID、操作码、请求消息载荷指针、请求消息载荷长度;出参包括:应答载荷指针、应答载荷长度;根据权利要求1所述的一种进程间通讯的方法,其特征在于进程间传递的消息格式为:
消息格式由消息头和消息载荷两部分组成,如图3所示:消息头包括16bit目的进程ID、16bit源进程ID、32bit序列号、16bit操作码、16bit应答错误码、16bit消息长度、1bit类型标志位、1bit应答标志位、14bit保留位;其中类型标志位为0时表示消息类型是请求,为1时表示消息类型是应答;应答标志位仅当类型标志位为0时有意义,为1表示请求消息需要应答,为0表示请求消息不需要应答;应答错误码仅当类型标志位为1时有意义,当类型标志位为0时,应答错误码取值为0;消息长度表示消息头加载荷的整体消息长度;消息载荷部分长度不定,范围是0到65519字节;
所述应答处理回调函数的返回值和参数如下:
应答处理回调函数由上层软件在异步发送需要应答的请求时指定,用于异步处理应答消息;函数无返回值,入参包括:请求目的进程ID、操作码、应答错误码、应答载荷指针、应答载荷长度、上层软件自定义回调参数;
进一步的,源进程在发送需要应答的请求消息前要生成本地会话记录:
本地会话记录用于记录和描述一次尚未完成的会话,以请求消息的源进程ID加会话序列号为主键存储在请求消息的源进程;本地会话记录的内容包括:目的进程ID、源进程ID、会话序列号、操作码、会话类型(同步或异步)、超时参数、同步会话参数、异步会话参数;会话序列号对源进程而言用于唯一标识一个会话,取值正整数,源进程每发送一次请求,序列号连续递增;同步会话参数仅对同步会话类型有意义,参数包括线程同步信号量(总是被初始化为“满的”)、应答错误码、应答消息BUFFER、应答消息长度;异步会话参数仅对异步会话类型有意义,参数包括应答处理回调函数和回调参数;
进一步的,源进程发送请求消息时,处理的具体过程为:
请求消息发送步骤,对需要应答的请求,发送请求消息前先做本地会话记录,再发送请求消息,否则直接发送请求消息;CLIENT端作为源进程发送请求时,不论请求目的进程ID是多少,借助已连接进程记录,统一将请求消息发送给SERVER端;SERVER端作为源进程发送请求时,根据本次请求的目的进程ID,借助已连接进程记录,将请求消息发送给对应CLIENT;如果本次请求被上层软件定义为同步,请求消息发送的线程在消息发出后通过获取本地会话记录中同步会话参数中的信号量进入睡眠,否则,本次消息发送结束,请求消息发送线程继续执行;
进一步的,当CLIENT端接收到请求消息,进行请求消息处理具体过程是:
CLIENT端接收到请求消息时,该CLIENT一定是本次请求的接收端;CLIENT根据消息中的操作码,在本地查找并执行与之匹配的请求回调函数,如果请求消息中的应答标志位为0,则表示该请求不需要应答,本次处理结束,否则组织应答消息发送给SERVER端,本次处理结束;应答消息格式如图3所示:应答消息的目的进程ID是请求消息的源进程ID,源进程ID是CLIENT自己的进程ID,序列号、操作码与请求消息相同,应答错误码等于请求回调函数的返回值(如果没有找到请求回调函数,应答错误码为“该请求不支持”),消息长度以及消息载荷由请求回调函数的出参决定(如果没有找到请求回调函数,消息就没有载荷);
进一步的,当SERVER端接收到请求消息,进行请求消息处理具体过程是:
SERVER端接收到请求消息时,根据请求消息中的目的进程ID是否等于SERVER进程ID判断自己是本次请求的接收端还是转发端;
如果是接收端,SERVER根据消息中的操作码,在本地查找并执行与之匹配的请求回调函数,如果请求消息中的应答标志位为0,则表示该请求不需要应答,本次处理结束,否则以请求消息中的源进程ID为主键,在本地已连接进程记录中查找对应CLIENT进程,向该CLIENT发送应答消息;应答消息格式如图3所示:目的进程ID是请求消息的源进程ID,源进程ID是SERVER进程ID,序列号、操作码与请求消息中相同,应答错误码等于请求回调函数的返回值(如果没有找到请求回调函数,应答错误码为“该请求不支持”),消息长度以及消息载荷由请求回调函数的出参决定(如果没有找到请求回调函数,消息就没有载荷);
如果是转发端,则以请求消息中的目的进程ID为主键,在本地已连接进程记录中查找对应CLIENT进程;如果查找失败,进一步判断请求消息中的应答标志位,如果请求不需要应答,则本次转发处理结束,如果请求需要应答,SERVER向请求消息的源进程发送失败应答;如果查找成功,进一步判断请求消息中的应答标志位,如果请求不需要应答,则向查找成功的CLIENT转发该请求消息,消息格式保持不变,本次转发处理结束;如果请求需要应答,则以请求消息的源进程ID加会话序列号为主键在SERVER本次生成转发会话记录,然后向找找成功的CLIENT转发该请求消息,消息格式保持不变,本次转发处理结束;
所述的SERVER端接收到需要应答的请求消息时如果做转发端,生成的转发会话记录格式如下:
转发会话记录在SERVER上用于描述一次尚未完成的转发会话,以请求消息的源进程ID加会话序列号为主键存储在SERVER端;转发会话记录的内容包括:目的进程ID、源进程ID、会话序列号、操作码、会话类型(固定为转发);
进一步的,当CLIENT端接收到应答消息,进行应答消息处理具体过程是:
CLIENT端接收到应答消息时,该CLIENT一定是该应答的接收端,CLIENT以应答消息目的进程ID加会话序列号为主键查找本地会话记录,如果查找失败,则本次应答消息处理结束,如果查找成功,则进一步判断该会话是同步还是异步;如果是同步,将应答消息中的应答错误码、应答消息长度以及整个应答消息保存到本地会话记录的同步会话参数中,然后通过释放同步会话参数中的线程同步信号量唤醒被阻塞的请求发送线程;请求发送线程唤醒后从本地会话记录的同步会话参数中得到应答错误码和应答消息后就可以释放该本地会话记录;如果是异步,则从本地会话记录的异步会话参数中得到并执行应答处理回调函数完成对该应答的响应,然后释放该本地会话记录。
进一步的,当SERVER端接收到应答消息,进行应答消息处理具体过程是:
SERVER端接收到应答消息时,根据应答消息中的目的进程ID是否等于SERVER进程ID判断自己是本次应答消息的接收端还是转发端;
如果是接收端,SERVER以应答消息目的进程ID加会话序列号为主键查找本地会话记录,如果查找失败,则本次应答消息处理结束,如果查找成功,则进一步判断该会话是同步还是异步;如果是同步,将应答消息中的应答错误码、应答消息长度以及整个应答消息保存到本地会话记录的同步会话参数中,然后通过释放同步会话参数中的线程同步信号量唤醒被阻塞的请求发送线程,请求发送线程唤醒后从本地会话记录的同步会话参数中得到应答错误码和应答消息后就可以释放该本地会话记录;如果是异步,则从本地会话记录的异步会话参数中得到并执行应答处理回调函数完成对该应答的响应,然后释放该本地会话记录;
如果是转发端,先以应答消息中的目的进程ID加序列号为主键查找转发会话记录,如果找到就释放该记录,如果找不到则直接进入下一步;以应答消息中的目的进程ID在本地已连接进程记录中查找对应CLIENT进程,如果查找失败则执行结束,如果查找成功则向该CLIENT转发应答消息,消息格式保持不变。
进一步的,每个进程都要对本地会话记录做超时处理:
超时处理步骤,每个进程内置1秒定时器,周期性检查本地会话记录中的会话是否已经超时,对超时的会话记录,根据会话的类型(同步或异步)分别做不同处理;
如果是同步会话,将该会话记录的同步会话参数中的错误码设置为超时,然后通过释放同步会话参数中的线程同步信号量唤醒被阻塞的请求发送线程,请求发送线程唤醒后从本地会话记录的同步会话参数中得到应答错误码和应答消息后就可以释放该本地会话记录;如果是异步,则从本地会话记录的异步会话参数中得到并执行应答处理回调函数完成对该应答的响应,然后释放该本地会话记录;
当SERVER检测到与某个CLIENT的连接异常,进行的处理方法是:
SERVER检测到与某个CLIENT的连接异常时,遍历转发会话记录中目的进程ID等于该CLIENT进程ID的会话记录,逐一向会话记录中的源进程发送失败应答消息,并释放会话;应答消息中的目的进程ID为会话记录的源进程ID,源进程ID为会话记录的目的进程ID,序列号、操作码与会话记录中相同,应答错误码等于连接断开,没有消息载荷。
一种进程间通讯的装置包括:
通讯拓扑建立模块,设置n个进程,每个进程静态设置唯一标识的进程ID;选择一个进程作为通讯拓扑中SERVER端;其余n-1个进程分别对应作为n-1个CLIENT端;n个进程创建基于流的UNIX域套接字并绑定自身的SOCK PATH标识,SERVER端进入侦听并接受CLIENT端发起的连接,CLIENT端周期性向SERVER端发起连接直到连接建立为止;SERVER端靠接受连接时获取对端的CLIENT端的SOCK PATH标识识别出对端的CLIENT端进程ID;SERVER和CLIENT端都为自己保存已连接进程记录;
其中进程间通讯采用远程过程调用(RPC)的形式:
基于通讯拓扑建立步骤建立的通信拓扑,任意一个进程可以作为源进程发送请求消息,期望应答的目的进程是除源进程以外的任意进程;目的进程接收到请求消息后执行请求回调函数完成本次请求的响应,然后根据请求消息中的应答标志位,可选的向源进程发送应答消息从而完成一次会话;
上层软件在源进程发送请求时要指定:目的进程ID、操作码、超时参数、发送的消息体、请求类型,若是同步请求还要指定承载应答消息的BUFFER,若是异步请求要可选的给出应答处理回调函数和回调参数;当异步请求不指定应答处理回调函数时,应答属性就是无需应答,否则就是需要应答,所有的同步请求应答属性都是需要应答;上层软件在设计时如果期望某个进程响应某种请求操作码,就要提前在该进程内注册该操作码对应的请求回调函数;请求类型指的是同步请求或者异步请求。
综上所述,由于采用了上述技术方案,本发明的有益效果是:
一、拥有较好的普适性,支持系统内任意两个进程之间双向的同步、异步通讯,并支持通讯超时参数设置,支持进程内上层软件的多线程并发调用,并具备可靠的消息传输能力;
二、使上层软件的进程间通讯开发更加容易,不用熟悉操作系统的各种机制;
三、由于使用平台统一提供的进程间通讯机制,系统整体的开发质量更有保障;
四、将所有进程间通讯抽象、统一为一套公用机制,便于后期的软件维护。
附图说明
本发明将通过例子并参照附图的方式说明,其中:
图1本发明中进程间通讯的星形拓扑图,每个CLIENT端和SERVER端之间用基于流的UNIX域套接字建立唯一的连接;
图2a同步请求交互示意图,源进程中的上层软件线程发送同步请求消息后进入睡眠,目的进程的服务线程通过执行请求回调函数响应本次请求然后发送应答消息,源进程的服务线程收到应答后唤醒上层软件发送请求线程;
图2b异步请求(有应答)交互示意图,源进程中的上层软件线程指定应答处理回调函数并发送异步请求消息,然后继续执行,目的进程的服务线程通过执行请求回调函数响应本次请求然后发送应答消息,源进程的服务线程收到应答后异步执行应答处理回调函数完成应答消息的处理;
图2c异步请求(无应答)交互示意图,源进程中的上层软件线程发送异步请求消息后继续执行,目的进程的服务线程通过执行请求回调函数响应本次请求;
图3为消息格式,由消息头和载荷两部分组成,标志位中的t位(type)为类型标志位,取值0表示请求消息,1表示应答消息,标志位中的r位(response)为应答标志位,仅当t位为0时有意义,r位取值1表示消该请求需要应答,取值0表示请求不需要应答;
图4a为源进程中的上层软件线程发送同步请求消息的处理流程;
图4b为源进程中进入睡眠的上层软件同步请求发送线程被唤醒后的处理流程;
图4c为源进程中的上层软件线程发送异步请求消息的处理流程;
图5为CLIENT进程接收请求消息处理流程;
图6为SERVER进程接收请求消息处理流程;
图7为CLIENT进程接收应答消息处理流程;
图8为SERVER进程接收应答消息处理流程;
图9为每个进程中的会话超时处理流程;
图10为SERVER检测到某CLIENT连接断开时的处理流程。
具体实施方式
本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。
本说明书中公开的任一特征,除非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
本发明相关说明:
1、消息格式由消息头和消息载荷两部分组成,如图3所示:消息头包括16bit目的进程ID、16bit源进程ID、32bit序列号、16bit操作码、16bit应答错误码、16bit消息长度、1bit类型标志位、1bit应答标志位、14bit保留位;其中类型标志位为0时表示消息类型是请求,为1时表示消息类型是应答;应答标志位仅当类型标志位为0时有意义,为1表示请求消息需要应答,为0表示请求消息不需要应答;应答错误码仅当类型标志位为1时有意义,当类型标志位为0时,应答错误码取值为0;消息长度表示消息头加载荷的整体消息长度;消息载荷由上层软件定义,长度范围是0到65519字节;
2、SERVER端的已连接进程记录中记录了所有已连接的CLIENT进程信息;CLIENT端的已连接进程记录只有已连接的SERVER进程信息;已连接进程记录由进程ID(主键)、进程名称、SOCKET连接描述符、连接标志位组成,其中连接标志位标识与该进程的连接是否仍然有效。
3、始发请求消息的进程称为源进程,期望接收并相应该请求的进程称为目的进程。对于需要应答的请求,请求消息从源进程传递至目的进程,目的进程响应请求后再产生应答消息,应答消息再传递回源进程的过程就是一次会话;对于不需要应答的请求,请求消息从源进程传递至目的进程,目的进程响应该请求的过程就是一次会话;
4、对于需要应答的请求,源进程发出消息之前会新增一条本地会话记录,该会话记录用于描述一次源进程发起的、还没有结束的会话信息,这条本地会话记录在源进程收到应答消息或请求超时后删除。这条记录由以下内容组成:目的进程ID、源进程ID、会话序列号、操作码、会话类型(同步或异步)、超时参数、同步会话参数、异步会话参数;其中会话序列号对源进程而言用于唯一标识一个会话,取值正整数,源进程每发送一次请求,序列号连续递增;同步会话参数仅对同步会话类型有意义,参数包括线程同步信号量(总是被初始化为“满的”)、应答错误码、应答消息BUFFER、应答消息长度;异步会话参数仅对异步会话类型有意义,参数包括应答处理回调函数和回调参数;
5、SERVER在两个CLIENT之间的通讯过程中承担转发角色,当SERVER收到需要转发的请求,并且该请求的应答属性为需要应答时,将新增一条转发会话记录,转发会话记录数据结构与本地会话记录相同,其中目的进程ID、源进程ID、会话序列号、操作码均从转发的请求消息中获取,会话类型取值为转发,超时时间、同步会话参数、异步会话参数无意义。SERVER用一条转发会话记录描述一个还没结束的转发会话过程。一条转发会话记录在两种情况下删除:一是收到该会话的应答,做了应答转发;二是SERVER与该会话的目的进程连接断开,这种情况下源进程将无法收到目的进程的应答,所以SERVER将代表目标进程向源进程发送失败应答消息,表明本次请求失败。
6、操作码的定义:因为进程之间采用远程过程调用的通讯形式,源进程始发的消息本质是一次请求,上层软件将请求按类型划分就得到了该请求的操作码,即一个操作码对应一类请求;上层软件要为进程间通讯的消息定义相应的操作码。
7、请求回调函数的注册:每个操作码对应一种请求,每种请求需要相应的处理,请求回调函数就是完成该处理的API。目标进程在收到请求时通过执行对应的请求回调函数完成对请求的处理。请求回调函数的入参包括源进程ID、操作码、请求消息体,输出参数为应答消息体,返回值表示请求的执行结果。如果一个进程在上层软件设计上要响应某种请求,就要在进程内为该请求的操作码注册相应的请求回调函数。
本发明要求:
一、选择基于流的UNIX域套接字用于进程间信息传输,域套接字是为同一台主机内的进程间通讯设计的,能够提供高效可靠的消息传输;
二、使用新星的进程间通讯拓扑(如图1所示)。选择一个核心进程作为SERVER端,其他进程作为CLIENT端。CLIENT与SERVER之间拥有唯一的连接,所有通讯信息均由这些连接传递。CLIENT之间不直接通讯,而是通过SERVER转发,转发采用透传的方式;
三、通讯可由任意进程发起,目标是除自己以外的任意进程。当源进程为CLIENT,目标进程为SERVER时,请求消息由CLIENT直接发送给SERVER,应答消息由SERVER直接发给CLIENT;当源进程为CLIENT A,目标进程为CLIENT B时,请求消息由CLIENT A发给SERVER,SERVER将请求再转发给CLIENT B,应答消息由CLIENT B发给SERVER,SERVER将应答再转发给CLIENT A;当源进程为SERVER,目标进程为CLIENT时,请求消息由SERVER直接发给CLIENT,应答消息由CLIENT直接发给SERVER;
四、通讯的源和目标进程之间采用远程过程调用(RPC)的通讯形式,即由源进程发送请求消息,目标进程接收到消息并响应后,根据请求消息的应答标志位可选的发送应答消息。源进程发送请求时,有同步和异步两种方式,同异步差异只在源进程感知,二者发出的请求消息格式是统一的,接收请求消息的目的进程也不感知同异步差异;
五、同步通讯:同步请求均需要应答。源进程内的上层应用软件线程发出请求消息后进入睡眠,目标进程接收到消息后通过执行请求回调函数完成请求处理并向源进程发送应答消息,源进程接收到应答后唤醒被阻塞的发送线程进行后续处理。如果源进程在上层软件发送请求时指定的超时时间内没有收到应答,则进入睡眠的发送线程直接被唤醒并得到请求超时的错误码;
六、异步通讯:异步请求由上层软件发送时定义是否需要应答。源进程内的上层应用软件线程向目标进程发送消息后继续执行,目标进程接收到消息后通过执行请求回调函数完成请求处理,如果该请求不需要应答,则本次会话结束,否则目的进程发送应答消息,源进程在收到应答消息后在服务线程通过执行应答处理回调函数完成应答处理。如果源进程在超时时间内没有收到应答,服务线程将直接执行应答处理回调函数(应答错误码入参为超时)结束本次会话。
本发明并不局限于前述的具体实施方式。本发明扩展到任何在本说明书中披露的新特征或任何新的组合,以及披露的任一新的方法或过程的步骤或任何新的组合。
Claims (10)
1.一种进程间通讯的方法,其特征在于包括:
通讯拓扑建立步骤,设置n个进程,每个进程静态设置唯一标识的进程ID;选择一个进程作为通讯拓扑中SERVER端;其余n-1个进程分别对应作为n-1个CLIENT端;n个进程创建基于流的UNIX域套接字并绑定自身的SOCK PATH标识,SERVER端进入侦听并接受CLIENT端发起的连接,CLIENT端周期性向SERVER端发起连接直到连接建立为止;SERVER端靠接受连接时获取对端的CLIENT端的SOCK PATH标识识别出对端的CLIENT端进程ID;SERVER和CLIENT端都为自己保存已连接进程记录;
其中进程间通讯采用远程过程调用(RPC)的形式:
基于通讯拓扑建立步骤建立的通信拓扑,任意一个进程可以作为源进程发送请求消息,期望应答的目的进程是除源进程以外的任意进程;目的进程接收到请求消息后执行请求回调函数完成本次请求的响应,然后根据请求消息中的应答标志位,可选的向源进程发送应答消息从而完成一次会话;
上层软件在源进程发送请求时要指定:目的进程ID、操作码、超时参数、发送的消息体、请求类型,若是同步请求还要指定承载应答消息的BUFFER,若是异步请求要可选的给出应答处理回调函数和回调参数;当异步请求不指定应答处理回调函数时,应答属性就是无需应答,否则就是需要应答,所有的同步请求应答属性都是需要应答;上层软件在设计时如果期望某个进程响应某种请求操作码,就要提前在该进程内注册该操作码对应的请求回调函数;请求类型指的是同步请求或者异步请求。
2.根据权利要求1所述的一种进程间通讯的方法,其特征在于请求回调函数和应答处理回调函数返回值和参数如下:
请求回调函数由上层软件定,用于在一个进程内响应某种操作码对应的请求,在一个进程中,一个操作码对应一个请求回调函数,函数返回值0表示执行成功,非0表示相应的错误;请求回调函数的入参包括:请求源进程ID、操作码、请求消息载荷指针、请求消息载荷长度;出参包括:应答载荷指针、应答载荷长度。
应答处理回调函数由上层软件在异步发送需要应答的请求时指定,用于异步处理应答消息;函数无返回值,入参包括:请求目的进程ID、操作码、应答错误码、应答载荷指针、应答载荷长度、上层软件自定义回调参数。
3.根据权利要求1所述的一种进程间通讯的方法,其特征在于进程间传递的消息格式为:消息格式由消息头和消息载荷两部分组成:消息头包括16bit目的进程ID、16bit源进程ID、32bit序列号、16bit操作码、16bit应答错误码、16bit消息长度、1bit类型标志位、1bit应答标志位、14bit保留位;其中类型标志位为0时表示消息类型是请求,为1时表示消息类型是应答;应答标志位仅当类型标志位为0时有意义,为1表示请求消息需要应答,为0表示请求消息不需要应答;应答错误码仅当类型标志位为1时有意义,当类型标志位为0时,应答错误码取值为0;消息长度表示消息头加载荷的整体消息长度;消息载荷部分长度不定,范围是0到65519字节;
源进程在发送需要应答的请求消息前要生成本地会话记录:
本地会话记录用于记录和描述一次尚未完成的会话,以请求消息的源进程ID加会话序列号为主键存储在请求消息发送的源进程;本地会话记录的内容包括:目的进程ID、源进程ID、会话序列号、操作码、会话类型、超时参数、同步会话参数、异步会话参数;会话序列号对源进程而言用于唯一标识一个会话,取值正整数,源进程每发送一次请求,序列号连续递增;同步会话参数仅对同步会话类型有意义,参数包括线程同步信号量、应答错误码、应答消息BUFFER、应答消息长度;异步会话参数仅对异步会话类型有意义,参数包括应答处理回调函数和回调参数。
4.根据权利要求1所述的一种进程间通讯的方法,其特征在于源进程发送请求消息时,处理的具体过程为:
请求消息发送步骤,对需要应答的请求,发送请求消息前先做本地会话记录,再发送请求消息,否则直接发送请求消息;CLIENT端作为源进程发送请求时,不论请求目的进程ID是多少,借助已连接进程记录,统一将请求消息发送给SERVER端;SERVER端作为源进程发送请求时,根据本次请求的目的进程ID,借助已连接进程记录,将请求消息发送给对应CLIENT;如果本次请求被上层软件定义为同步,请求消息发送的线程在消息发出后通过获取本地会话记录中同步会话参数中的信号量进入睡眠,否则,本次消息发送结束,请求消息发送线程继续执行。
5.根据权利要求1所述的一种进程间通讯的方法,其特征在于当CLIENT端接收到请求消息,进行请求消息处理具体过程是:
CLIENT端接收到请求消息时,该CLIENT一定是本次请求的接收端;CLIENT根据消息中的操作码,在本地查找并执行与之匹配的请求回调函数,如果请求消息中的应答标志位为0,则表示该请求不需要应答,本次处理结束,否则组织应答消息发送给SERVER端,本次处理结束;应答消息格式如图3所示:应答消息的目的进程ID是请求消息的源进程ID,源进程ID是CLIENT自己的进程ID,序列号、操作码与请求消息相同,应答错误码等于请求回调函数的返回值,消息长度以及消息载荷由请求回调函数的出参决定;如果没有找到请求回调函数,应答错误码为“该请求不支持”;如果没有找到请求回调函数,消息就没有载荷。
6.根据权利要求1所述的一种进程间通讯的方法,其特征在于当SERVER端接收到请求消息,进行请求消息处理具体过程是:
SERVER端接收到请求消息时,根据请求消息中的目的进程ID是否等于SERVER进程ID判断自己是本次请求的接收端还是转发端;
如果是接收端,SERVER根据消息中的操作码,在本地查找并执行与之匹配的请求回调函数,如果请求消息中的应答标志位为0,则表示该请求不需要应答,本次处理结束,否则以请求消息中的源进程ID为主键,在本地已连接进程记录中查找对应CLIENT进程,向该CLIENT发送应答消息;应答消息格式如图3所示:目的进程ID是请求消息的源进程ID,源进程ID是SERVER进程ID,序列号、操作码与请求消息中相同,应答错误码等于请求回调函数的返回值,消息长度以及消息载荷由请求回调函数的出参决定;
如果是转发端,则以请求消息中的目的进程ID为主键,在本地已连接进程记录中查找对应CLIENT进程;如果查找失败,进一步判断请求消息中的应答标志位,如果请求不需要应答,则本次转发处理结束,如果请求需要应答,SERVER向请求消息的源进程发送失败应答;如果查找成功,进一步判断请求消息中的应答标志位,如果请求不需要应答,则向查找成功的CLIENT转发该请求消息,消息格式保持不变,本次转发处理结束;如果请求需要应答,则以请求消息的源进程ID加会话序列号为主键在SERVER本次生成转发会话记录,然后向找找成功的CLIENT转发该请求消息,消息格式保持不变,本次转发处理结束;
所述的SERVER端接收到需要应答的请求消息时如果做转发端,生成的转发会话记录格式如下:
转发会话记录在SERVER上用于描述一次尚未完成的转发会话,以请求消息的源进程ID加会话序列号为主键存储在SERVER端;转发会话记录的内容包括:目的进程ID、源进程ID、会话序列号、操作码、会话类型;会话类型为转发。
7.根据权利要求1所述的一种进程间通讯的方法,其特征在于当CLIENT端接收到应答消息,进行应答消息处理具体过程是:
CLIENT端接收到应答消息时,该CLIENT一定是该应答的接收端,CLIENT以应答消息目的进程ID加会话序列号为主键查找本地会话记录,如果查找失败,则本次应答消息处理结束,如果查找成功,则进一步判断该会话是同步还是异步;如果是同步,将应答消息中的应答错误码、应答消息长度以及整个应答消息保存到本地会话记录的同步会话参数中,然后通过释放同步会话参数中的线程同步信号量唤醒被阻塞的请求发送线程;请求发送线程唤醒后从本地会话记录的同步会话参数中得到应答错误码和应答消息后就可以释放该本地会话记录;如果是异步,则从本地会话记录的异步会话参数中得到并执行应答处理回调函数完成对该应答的响应,然后释放该本地会话记录。
8.根据权利要求1所述的一种进程间通讯的方法,其特征在于在于当SERVER端接收到应答消息,进行应答消息处理具体过程是:
SERVER端接收到应答消息时,根据应答消息中的目的进程ID是否等于SERVER进程ID判断自己是本次应答消息的接收端还是转发端;
如果是接收端,SERVER以应答消息目的进程ID加会话序列号为主键查找本地会话记录,如果查找失败,则本次应答消息处理结束,如果查找成功,则进一步判断该会话是同步还是异步;如果是同步,将应答消息中的应答错误码、应答消息长度以及整个应答消息保存到本地会话记录的同步会话参数中,然后通过释放同步会话参数中的线程同步信号量唤醒被阻塞的请求发送线程,请求发送线程唤醒后从本地会话记录的同步会话参数中得到应答错误码和应答消息后就可以释放该本地会话记录;如果是异步,则从本地会话记录的异步会话参数中得到并执行应答处理回调函数完成对该应答的响应,然后释放该本地会话记录;
如果是转发端,先以应答消息中的目的进程ID加序列号为主键查找转发会话记录,如果找到就释放该记录,如果找不到则直接进入下一步;以应答消息中的目的进程ID在本地已连接进程记录中查找对应CLIENT进程,如果查找失败则执行结束,如果查找成功则向该CLIENT转发应答消息,消息格式保持不变。
9.根据权利要求1所述的一种进程间通讯的方法,其特征在于每个进程都要对本地会话记录做超时处理:
超时处理步骤,每个进程内置1秒定时器,周期性检查本地会话记录中的会话是否已经超时,对超时的会话记录,根据会话的类型分别做不同处理;
如果是同步会话,将该会话记录的同步会话参数中的错误码设置为超时,然后通过释放同步会话参数中的线程同步信号量唤醒被阻塞的请求发送线程,请求发送线程唤醒后从本地会话记录的同步会话参数中得到应答错误码和应答消息后就可以释放该本地会话记录;如果是异步,则从本地会话记录的异步会话参数中得到并执行应答处理回调函数完成对该应答的响应,然后释放该本地会话记录;
当SERVER检测到与某个CLIENT的连接异常,进行的处理方法是:
SERVER检测到与某个CLIENT的连接异常时,遍历转发会话记录中目的进程ID等于该CLIENT进程ID的会话记录,逐一向会话记录中的源进程发送失败应答消息,并释放会话;应答消息中的目的进程ID为会话记录的源进程ID,源进程ID为会话记录的目的进程ID,序列号、操作码与会话记录中相同,应答错误码等于连接断开,没有消息载荷。
10.一种进程间通讯的装置,其特征在于包括:
通讯拓扑建立模块,设置n个进程,每个进程静态设置唯一标识的进程ID;选择一个进程作为通讯拓扑中SERVER端;其余n-1个进程分别对应作为n-1个CLIENT端;n个进程创建基于流的UNIX域套接字并绑定自身的SOCK PATH标识,SERVER端进入侦听并接受CLIENT端发起的连接,CLIENT端周期性向SERVER端发起连接直到连接建立为止;SERVER端靠接受连接时获取对端的CLIENT端的SOCK PATH标识识别出对端的CLIENT端进程ID;SERVER和CLIENT端都为自己保存已连接进程记录;
其中进程间通讯采用远程过程调用(RPC)的形式:
基于通讯拓扑建立步骤建立的通信拓扑,任意一个进程可以作为源进程发送请求消息,期望应答的目的进程是除源进程以外的任意进程;目的进程接收到请求消息后执行请求回调函数完成本次请求的响应,然后根据请求消息中的应答标志位,可选的向源进程发送应答消息从而完成一次会话;
上层软件在源进程发送请求时要指定:目的进程ID、操作码、超时参数、发送的消息体、请求类型,若是同步请求还要指定承载应答消息的BUFFER,若是异步请求要可选的给出应答处理回调函数和回调参数;当异步请求不指定应答处理回调函数时,应答属性就是无需应答,否则就是需要应答,所有的同步请求应答属性都是需要应答;上层软件在设计时如果期望某个进程响应某种请求操作码,就要提前在该进程内注册该操作码对应的请求回调函数;请求类型指的是同步请求或者异步请求。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611069320.8A CN106648928A (zh) | 2016-11-29 | 2016-11-29 | 一种进程间通讯的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611069320.8A CN106648928A (zh) | 2016-11-29 | 2016-11-29 | 一种进程间通讯的方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106648928A true CN106648928A (zh) | 2017-05-10 |
Family
ID=58813133
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611069320.8A Pending CN106648928A (zh) | 2016-11-29 | 2016-11-29 | 一种进程间通讯的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106648928A (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107133152A (zh) * | 2017-05-31 | 2017-09-05 | 郑州云海信息技术有限公司 | 一种存储服务状态的查询方法及系统 |
CN107133116A (zh) * | 2017-07-04 | 2017-09-05 | 北京像素软件科技股份有限公司 | 消息获取的方法及装置 |
CN107239353A (zh) * | 2017-06-02 | 2017-10-10 | 浪潮金融信息技术有限公司 | 进程间通信方法及系统 |
CN107688502A (zh) * | 2017-08-18 | 2018-02-13 | 苏州科达特种视讯有限公司 | 进程间通信方法及装置 |
CN108509184A (zh) * | 2018-03-28 | 2018-09-07 | 武汉斗鱼网络科技有限公司 | 消息分发方法、计算机可读存储介质及电子设备 |
CN109254855A (zh) * | 2018-08-29 | 2019-01-22 | 北京奇艺世纪科技有限公司 | 一种参数传输协议的注册方法、装置及电子设备 |
CN109522128A (zh) * | 2018-11-21 | 2019-03-26 | 北京像素软件科技股份有限公司 | 分段式多线程任务执行方法及装置 |
CN109933443A (zh) * | 2019-03-07 | 2019-06-25 | 腾讯科技(深圳)有限公司 | 进程间通信方法、装置、计算机设备及可读存储介质 |
CN110083468A (zh) * | 2019-05-05 | 2019-08-02 | Oppo广东移动通信有限公司 | 一种数据传输方法、电子装置和存储介质 |
CN110659139A (zh) * | 2018-06-28 | 2020-01-07 | 武汉斗鱼网络科技有限公司 | 一种远程过程调用方法、计算机设备和存储介质 |
CN114979233A (zh) * | 2022-07-19 | 2022-08-30 | 深圳市亿联无限科技有限公司 | 基于域套接字实现模块间同步和异步调用的方法和系统 |
CN116244099A (zh) * | 2023-05-11 | 2023-06-09 | 深圳比特微电子科技有限公司 | 嵌入式系统内进程通讯方法、装置、电子设备和存储介质 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5774479A (en) * | 1995-03-30 | 1998-06-30 | Motorola, Inc. | Method and system for remote procedure call via an unreliable communication channel using multiple retransmission timers |
US5818448A (en) * | 1996-07-02 | 1998-10-06 | Sun Microsystems, Inc. | Apparatus and method for identifying server computer aggregation topologies |
CN1975680A (zh) * | 2006-11-27 | 2007-06-06 | 浙江大学 | 基于Java的进程间异步通信的实现方法 |
CN101252506A (zh) * | 2007-12-29 | 2008-08-27 | 中国建设银行股份有限公司 | 一种数据传输系统 |
CN102591726A (zh) * | 2011-12-31 | 2012-07-18 | 青岛海信宽带多媒体技术有限公司 | 一种多进程通信方法 |
CN102780613A (zh) * | 2012-06-19 | 2012-11-14 | 瑞斯康达科技发展股份有限公司 | 一种分布式设备板间通信的方法与装置 |
CN102890644A (zh) * | 2011-07-20 | 2013-01-23 | 郑州威科姆科技股份有限公司 | 一种基于字节流的进程间通讯方法 |
CN103051728A (zh) * | 2013-01-10 | 2013-04-17 | 太仓市同维电子有限公司 | 一种远程过程调用方法 |
CN105630652A (zh) * | 2016-02-02 | 2016-06-01 | 中国石油大学(华东) | 一种面向实时大数据平台Storm的运行时三维可视化系统 |
CN105721512A (zh) * | 2016-05-06 | 2016-06-29 | 深圳前海大数点科技有限公司 | 一种远程过程调用系统及其方法 |
CN105763619A (zh) * | 2016-03-31 | 2016-07-13 | 广州华多网络科技有限公司 | 客户端与服务端进行通讯的方法及装置 |
-
2016
- 2016-11-29 CN CN201611069320.8A patent/CN106648928A/zh active Pending
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5774479A (en) * | 1995-03-30 | 1998-06-30 | Motorola, Inc. | Method and system for remote procedure call via an unreliable communication channel using multiple retransmission timers |
US5818448A (en) * | 1996-07-02 | 1998-10-06 | Sun Microsystems, Inc. | Apparatus and method for identifying server computer aggregation topologies |
CN1975680A (zh) * | 2006-11-27 | 2007-06-06 | 浙江大学 | 基于Java的进程间异步通信的实现方法 |
CN101252506A (zh) * | 2007-12-29 | 2008-08-27 | 中国建设银行股份有限公司 | 一种数据传输系统 |
CN102890644A (zh) * | 2011-07-20 | 2013-01-23 | 郑州威科姆科技股份有限公司 | 一种基于字节流的进程间通讯方法 |
CN102591726A (zh) * | 2011-12-31 | 2012-07-18 | 青岛海信宽带多媒体技术有限公司 | 一种多进程通信方法 |
CN102780613A (zh) * | 2012-06-19 | 2012-11-14 | 瑞斯康达科技发展股份有限公司 | 一种分布式设备板间通信的方法与装置 |
CN103051728A (zh) * | 2013-01-10 | 2013-04-17 | 太仓市同维电子有限公司 | 一种远程过程调用方法 |
CN105630652A (zh) * | 2016-02-02 | 2016-06-01 | 中国石油大学(华东) | 一种面向实时大数据平台Storm的运行时三维可视化系统 |
CN105763619A (zh) * | 2016-03-31 | 2016-07-13 | 广州华多网络科技有限公司 | 客户端与服务端进行通讯的方法及装置 |
CN105721512A (zh) * | 2016-05-06 | 2016-06-29 | 深圳前海大数点科技有限公司 | 一种远程过程调用系统及其方法 |
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107133152A (zh) * | 2017-05-31 | 2017-09-05 | 郑州云海信息技术有限公司 | 一种存储服务状态的查询方法及系统 |
CN107239353A (zh) * | 2017-06-02 | 2017-10-10 | 浪潮金融信息技术有限公司 | 进程间通信方法及系统 |
CN107133116B (zh) * | 2017-07-04 | 2020-08-11 | 北京像素软件科技股份有限公司 | 消息获取的方法及装置 |
CN107133116A (zh) * | 2017-07-04 | 2017-09-05 | 北京像素软件科技股份有限公司 | 消息获取的方法及装置 |
CN107688502A (zh) * | 2017-08-18 | 2018-02-13 | 苏州科达特种视讯有限公司 | 进程间通信方法及装置 |
CN107688502B (zh) * | 2017-08-18 | 2021-04-06 | 苏州科达特种视讯有限公司 | 进程间通信方法及装置 |
CN108509184A (zh) * | 2018-03-28 | 2018-09-07 | 武汉斗鱼网络科技有限公司 | 消息分发方法、计算机可读存储介质及电子设备 |
CN110659139A (zh) * | 2018-06-28 | 2020-01-07 | 武汉斗鱼网络科技有限公司 | 一种远程过程调用方法、计算机设备和存储介质 |
CN109254855A (zh) * | 2018-08-29 | 2019-01-22 | 北京奇艺世纪科技有限公司 | 一种参数传输协议的注册方法、装置及电子设备 |
CN109254855B (zh) * | 2018-08-29 | 2022-06-03 | 北京奇艺世纪科技有限公司 | 一种参数传输协议的注册方法、装置及电子设备 |
CN109522128A (zh) * | 2018-11-21 | 2019-03-26 | 北京像素软件科技股份有限公司 | 分段式多线程任务执行方法及装置 |
CN109522128B (zh) * | 2018-11-21 | 2020-11-13 | 北京像素软件科技股份有限公司 | 分段式多线程任务执行方法及装置 |
CN109933443A (zh) * | 2019-03-07 | 2019-06-25 | 腾讯科技(深圳)有限公司 | 进程间通信方法、装置、计算机设备及可读存储介质 |
CN109933443B (zh) * | 2019-03-07 | 2021-06-25 | 腾讯科技(深圳)有限公司 | 进程间通信方法、装置、计算机设备及可读存储介质 |
CN110083468A (zh) * | 2019-05-05 | 2019-08-02 | Oppo广东移动通信有限公司 | 一种数据传输方法、电子装置和存储介质 |
CN114979233A (zh) * | 2022-07-19 | 2022-08-30 | 深圳市亿联无限科技有限公司 | 基于域套接字实现模块间同步和异步调用的方法和系统 |
CN116244099A (zh) * | 2023-05-11 | 2023-06-09 | 深圳比特微电子科技有限公司 | 嵌入式系统内进程通讯方法、装置、电子设备和存储介质 |
CN116244099B (zh) * | 2023-05-11 | 2023-09-08 | 深圳比特微电子科技有限公司 | 嵌入式系统内进程通讯方法、装置、电子设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106648928A (zh) | 一种进程间通讯的方法及装置 | |
CN103544303B (zh) | 一种数据同步方法、系统和设备 | |
CN102609479B (zh) | 一种内存数据库节点复制方法 | |
JPS62239641A (ja) | 同報通信方式 | |
CN104660708A (zh) | 一种基于http的移动应用消息推送方法及系统 | |
EP2323344A1 (en) | Method for preventing thread hanging in a multi-thread communication program | |
CN104954101B (zh) | 基于同步ack的多终端数据同步方法 | |
CN113055539B (zh) | 一种基于VoIP双冗余交换服务器的通信系统 | |
FI125109B (fi) | Menetelmä verkkolaitedatan hallitsemiseksi ja verkonhallintajärjestelmä | |
CN110582998A (zh) | 群组的通信方法及装置、计算机存储介质、计算机设备 | |
Venkatesan | Reliable protocols for distributed termination detection | |
US20210096962A1 (en) | Data backup method, device and system | |
CN114025002A (zh) | 一种基于mqtt信息传输的方法、系统及通信设备 | |
CN108449443B (zh) | 一种全ip无线网络地址配置实现方法 | |
CN111277580A (zh) | 节点数据发送方法、接收方法以及传输方法 | |
WO2023273240A1 (zh) | 微服务调用方法、装置、电子设备和可读存储介质 | |
CN105141687A (zh) | 一种生产消息的方法 | |
US20230126682A1 (en) | Fault tolerance method and apparatus of network device system, computer device, and storage medium | |
CN106714294B (zh) | 应用于智能电网的多通道tcp/ip头压缩的同步方法 | |
CN114885020A (zh) | 数据传输系统以及方法 | |
Kim | Group communication in real-time computing systems: Issues and directions | |
CN104184727B (zh) | 一种消息传输的方法和装置 | |
CN112835728B (zh) | 消息处理方法、装置、计算机设备和存储介质 | |
CN110519343B (zh) | 一种基于日志的事件同步方法 | |
WO2024027682A1 (zh) | 特征信息传输方法、转换信息确定方法、装置和通信设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for 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: 20170510 |