一种进程间通信方法、装置及系统的制作方法

文档序号:6443276阅读:231来源:国知局
专利名称:一种进程间通信方法、装置及系统的制作方法
技术领域
本发明属于计算机技术领域,尤其涉及一种进程间通信(InterProcessCommunications, IPC)方法、装置及系统。
背景技术
进程是计算机资源分配的最小单位,每个进程都拥有自己的独立资源,并与其他进程相互隔离,为了使不同的进程能够互相访问资源并协调工作,操作系统提供了多种IPC机制,例如管道、共享内存、socket等。在当前不断发展的计算机技术的背景之下,多个进程同时与一个主进程进行通信的情况频频涌现,例如采用了多进程、微内核的第三方应用平台,其承载着大量可能分布在各个进程的第三方应用和服务,在各应用与平台之间相互通信时,多个进程与主进程间的通信需求非常大,对IPC模块的性能和灵活性要求很高。然而,在上述应用背景下,对现有技术来说,管道及共享内存机制通常仅适用于两个进程之间的简单通信,不支持多进程通信时连接通道的动态创建和销毁。Socket适用于跨机器进程间通信,但其在同机器的进程间通信的性能比共享内存机制低,不适用于大数据量的传输,且需要占用通信端口和socket连接,数据流容易被捕获。同时,现有技术在进程接收数据时,通常采用一个单独的线程将数据拷贝到本地缓冲区,这要求上层应用循环不断的从本地缓冲区中检查并读取数据,若进程间的数据传输不频繁,则上述循环动作也增加了不必要的CPU空转开销。因此,综上所述,在上述应用背景下,现有技术在处理进程间通信时存在着性能低及灵活性差的缺陷。

发明内容
本发明实施例的目的在于提供一种进程间通信方法,旨在解决现有技术在处理IPC时性能低及灵活性差的问题。本发明实施例是这样实现的,一种进程间通信方法,包括:根据第一进程的标识及第二进程的标识创建第一共享内存和第二共享内存,所述第一共享内存用于接收所述第一进程的发送数据以使所述第二进程能够从所述第一共享内存中读取该发送数据,所述第二共享内存用于接收所述第二进程的发送数据以使所述第一进程能够从所述第二共享内存中读取该发送数据,所述标识用于唯一标识一个进程;通过所述第一共享内存和所述第二共享内存进行所述第一进程与所述第二进程之间的通信。本发明实施例的另一目的在于提供一种进程间通信装置,包括:共享内存建立模块,用于根据第一进程的标识及第二进程的标识创建第一共享内存和第二共享内存,所述第一共享内存用于接收所述第一进程的发送数据以使所述第二进程能够从所述第一共享内存中读取该发送数据,所述第二共享内存用于接收所述第二进程的发送数据以使所述第一进程能够从所述第二共享内存中读取该发送数据,所述标识用于唯一标识一个进程;通信模块,用于通过所述第一共享内存和所述第二共享内存进行所述第一进程与所述第二进程之间的通信。本发明实施例的另一目的在于提供一种进程间通信系统,所述系统包括如上所述的进程间通信装置。本发明实施例的另一目的在于提供一种控件框架,包括一个主程序和至少一个控件,所述主程序包括第一加载模块,用于将所述主程序加载进第二进程;每个控件分别包括第二加载模块,用于将所述控件加载进第一进程;还包括:如上所述的进程间通信装置,用于完成所述第二进程与至少一个所述第一进程间的通信。本发明实施例提供的进程间通信方法基于共享内存机制来实现,通过监听第一进程的连接请求,当有第一进程请求与第二进程进行通信连接时,根据通信双方的进程的标识来建立独立的共享内存以完成进程间的通信,实现进程间的通信连接的动态创建,高性能、高灵活性地实现了进程间通信。


图1是本发明第一实施例提供的进程间通信方法的应用场景示意图;图2是本发明第二实施例提供的进程间通信方法的实现流程图;图3是本发明第三实施例提供的进程间通信方法的实现流程图;图4是本发明第四实施例提供的进程间通信方法的实现流程图;图5是本发明第五实施例提供的进程间通信装置的结构框图;图6是本发明第六实施例提供的控件框架的结构框图。
具体实施例方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。本发明实施例提供的进程间通信方法基于共享内存机制来实现,通过监听第一进程的连接请求,当有第一进程请求与第二进程进行通信连接时,根据通信双方的进程的标识来建立独立的共享内存以完成进程间的通信,实现进程间的通信连接的动态创建,高性能、高灵活性地实现了进程间通信。图1示出了本发明第一实施例提供的进程间通信方法的应用场景示意图,为了便于说明,仅示出了与本实施例相关的部分。该进程间通信方法的应用场景包括但不限于windows、Iinux等操作系统或者分布式系统,其还可应用于第三方应用平台中,实现多个客户端进程同时与一个服务端进程之间的通信。以应用于第三方应用平台为例,在此应用场景下,主进程可以理解为承载了大量第三方应用和服务的平台本身,而多个与主进程进行通信的进程可以理解为第三方应用在运行时所涉及的进程。如图1所示,本实施例及后续相关实施例均基于连接的客户端/服务器模式(C/S)来阐述,将多个进程同时与一个主进程之间进行通信的方式描述为多个第一进程11与第二进程12进行通信的方式。当实际操作仅涉及到两个进程之间的通信时,可以将相关实施例简化为一个第一进程11与一个第二进程12、或者两个第一进程11之间的通信。图2示出了本发明第二实施例提供的进程间通信方法的实现流程,详述如下:在步骤S201中,第二进程启动,监听是否有第一进程请求连接。在本实施例中,第二进程作为可以同时与多个第一进程进行通信的主进程,其首先要打开监听(Listen)通道(即调用listen进程),用于监听是否有第一进程向其发起连接请求,在此,监听通道的打开也标示着该第二进程愿意与第一进程进行通信连接。具体地,在第二进程启动时,将专门创建一个共享内存用于接收并处理其他第一进程的连接请求,例如,将OxFFFFFFFF保留为一个无效的进程标识,则该创建的共享内存可以命名为0xl00A_0xFFFFFFFF,该进程在内部被listen进程使用,用于接收第一进程的连接请求,其中,OxlOOA为第二进程的标识。作为本发明的一个实施例,在第二进程打开监听通道的时候,可以设置同时与第二进程进行通信的第一进程的数量上限,以使进程间通信连接情况符合当前系统运行状况。作为本发明的另一个实施例,在第二进程打开监听通道的时候,也可以设置每个第一进程在与第二进程进行通信时所占用的共享内存大小上限,包括每个通信通道占用的共享内存大小上限及同时存在的通信通道所占用的共享内存总和的大小上限,以使进程间通信连接情况符合当前系统运行状况。在步骤S202中,根据第一进程的标识及第二进程的标识创建第一共享内存和第二共享内存,所述第一共享内存用于接收所述第一进程的发送数据以使所述第二进程能够从所述第一共享内存中读取该发送数据,所述第二共享内存用于接收所述第二进程的发送数据以使所述第一进程能够从所述第二共享内存中读取该发送数据,所述标识用于唯一标识一个进程。其中,创建的共享内存包括了第一进程向第二进程发送数据时所使用的第一共享内存及第二进程向第一进程发送数据时所使用的第二共享内存。在本实施例中,为了实现多个第一进程与第二进程进行通信,需要保证单一进程的任何通信故障都不影响到其他进程的通信,因此,需要对每个通信通道都创建独立的共享内存。为了将每个通信通道使用的共享内存区别于其他共享内存,需要根据进程的标识(ProcessID)来命名相应的共享内存空间,其中,每个标识用于唯一标识一个进程。例如,假设第二进程的标识为OxlOOA,某个第一进程的标识为OxlOOB,则根据上述标识,当第二进程与该第一进程进行通信时,可以命名第二进程的接收共享内存(即第一共享内存)为0χ100Α_0χ100Β,发送共享内存(即第二共享内存)为0χ100Β_0χ100Α,则相应的,该第一进程的接收共享内存对应第二进程的发送共享内存,为OxlOOBJbdOOA,发送共享内存对应第二进程的接收共享内存,为Ox 100A_0x 100B。通过进程标识来命名相应的共享内存,能够实现对进程间通信可靠性的保障。具体地,在进行共享内存创建时,作为接收方的进程首先通过Cr eat eFi I eMapping建立一个内存映射文件对象,若建立成功则通过MapViewOfFile将该文件映射对象的视图映射进地址空间,同时得到此映射视图的首地址,同样地,作为发送方的进程首先通过OpenFileMapping打开上述创建的内存映射文件对象,若打开成功则通过MapViewOfFile将此文件映射对象的视图映射进地址空间,同时得到此映射视图的首地址。上述接收方的建立过程及发送方的打开过程被称为一个共享内存的创建过程,在此过程中,收发双方均获取到了用于进行通信的共享内存地址,因此,在进行数据传送时,发送方的进程实际上是根据该首地址将数据写到创建的共享内存中;在进行数据接收时,接收方的进程实际上即是根据该首地址从创建的共享内存中读取数据。在本实施例中,根据上述过程创建出第一共享内存及第二共享内存,即可以建立起第一进程与第二进程的双向通信通道,完成数据的双向发送与接收。作为本实施例的一个具体实现方式,通过3次握手来完成第一共享内存及第二共享内存的创建,关于步骤S202的具体实施方式
将在后续实施例中进行详细说明,在此不再赘述。在步骤S203中,通过所述第一共享内存和所述第二共享内存进行所述第一进程与所述第二进程之间的通信。在本实施例中,根据创建的第一共享内存及第二共享内存,即可以建立起第一进程与第二进程的双向通信通道,完成数据的双向发送与接收。具体地,在本实施例中,系统内部通过建立两个线程(发送线程和接收线程)来分别发送和接收数据。发送线程用于发送数据,其在发送方进程有数据要发送时才激活,以通知接收方进程有数据需要接收;接收线程用于接收数据,当有数据需要接收时才被激活。在本实施例中,可以通过复用windows的message机制,米用hook系统函数GetMessage,可以将数据以自定义消息的形式推送到相应的接收线程,并使用回调函数处理。由于windows窗口程序都会有一个消息循环,因此将数据接收由原先的拉数据风格变成了推数据风格,从而避免了上层应用循环不断地从本地缓冲区中检查、读取数据,减轻了系统负担,降低了CPU的空转开销。同时,为了进一步保障两个进程间通信的可靠性,作为本发明的一个实施例,在步骤S203中第一进程与第二进程进行通信的同时,针对每个条通信通道,还可以通过建立检测线程,用于检测该通信通道两端的第一进程及第二进程的状态,当一端进程发生故障时,可以由检测线程通知对方进程以使通信连接能够及时被终止,所占用的共享内存资源能够及时被释放。作为本发明的一个实施例,由于共享内存的大小在其整个生命期内是固定的,为了容量有限的共享内存能够被长时间地反复读写,将该共享内存设计成循环队列,并在队列的头部分别建立头部标记、尾部标记及折返位置标记,以同步发送进程和接收进程的访问。在具体的通信过程中,发送进程调用SendPacket时移动尾部标记,接收端调用RecvPacket时移动头部标记,当头部标记和尾部标记重叠在一个位置时即表明当前队列为空,用折返位置标记记录该位置之后,即可重新读写共享内存,由此反复读写,很大程度地节约了系统资源。在本实施例中,基于共享内存的IPC通信机制,通过监听第一进程的连接请求,当有第一进程请求与第二进程进行通信时,根据通信双方的进程标识来建立独立的共享内存以完成进程间的通信,实现了对进程间通信的动态连接,高性能、高灵活性地实现了多进程间通O图3示出了本发明第三实施例提供的进程间通信方法的实现流程,本实施例是对本发明第一实施例步骤S202的细化,其描述了两个进程间共享内存创建的具体实现流程,详述如下:在步骤S301中,所述第一进程创建所述第一共享内存后向所述第二进程发送所述连接请求。在步骤S302中,所述第二进程接收到所述连接请求后创建所述第二共享内存,并打开所述第一共享内存后向所述第一进程返回第一应答信号。在步骤S303中,所述第一进程在接收到所述第一应答信号后打开所述第二共享内存,并向所述第二进程返回第二应答信号。在本实施例中,第二进程和第一进程都拥有自己独立的用于接收数据的共享内存,且会通过打开对方创建的共享内存,作为对应的自己用于发送数据的共享内存。通过上述三次握手,即可以确认共享内存建立成功,由此可以正式建立起第一进程与第二进程之间的双向通信连接,可以开始双向发送、接收数据,完成进程间通信。图4示出了本发明第四实施例提供的进程间通信方法的实现流程,其是在步骤S203之后的后续实现流程,如图4所示,其步骤S401至步骤S403分别对应本发明第二实施例的步骤S201至步骤S203,其后续实现流程详述如下:在步骤S404中,所述第一进程向所述第二进程发送通信结束指令,并关闭所述第一共享内存和所述第二共享内存。在本实施例中,针对第二进程与每个第一进程之间的每条通信通道,一旦某个第一进程与第二进程的此次通信完毕,即可以通知第二进程关闭所涉及的共享内存,及时释放共享内存资源,达到动态销毁IPC连接的目的。在本发明实施例中,只要第二进程所开启的监听通道未关闭,第二进程即随时处理等待新的第一进程进行通信连接的状态,直到该第二进程也被关闭。图5示出了本发明第五实施例提供的进程间通信装置的结构,为了便于说明,仅不出了与本实施例相关的部分。参照图5,该进程间通信装置可运行于如本发明第一实施例所述的系统中,应用于多个第一进程分别与第二进程之间通信,包括:共享内存建立模块51,根据第一进程的标识及第二进程的标识创建第一共享内存和第二共享内存,所述第一共享内存用于接收所述第一进程的发送数据以使所述第二进程能够从所述第一共享内存中读取该发送数据,所述第二共享内存用于接收所述第二进程的发送数据以使所述第一进程能够从所述第二共享内存中读取该发送数据,所述标识用于唯一标识一个进程。。作为本发明的一个实施例,共享内存建立模块51还用于创建第三共享内存,以使所述服务端接收第一进程的连接请求。通信模块52,通过所述第一共享内存和所述第二共享内存进行所述第一进程与所述第二进程之间的通信。具体地,共享内存建立模块51包括:共享内存创建子模块511,用于所述第一进程创建所述第一共享内存及所述第二进程创建所述第二共享内存;共享内存打开子模块512,用于所述第二进程打开所述第一共享内存及所述第一进程打开所述第二共享内存;握手子模块513,用于所述第一进程向所述第二进程发送所述连接请求,以及所述第一进程与所述第二进程之间发送握手信号。通信模块52包括:发送线程建立子模块521,建立发送线程来发送数据,所述发送线程仅在有数据要发送时被激活。接收线程建立子模块522,建立接收线程来接收数据,所述接收线程仅在有数据需要接收时被激活。检测线程建立子模块523,建立检测线程,以检测所述第一进程或者所述第二进程是否出现故障。当所述第一进程或者所述第二进程出现故障时,所述装置还包括:故障处理模块53,用于由所述检测线程通知对方进程终止通信连接并释放所述第一共享内存和所述第二共享内存。所述装置还包括:通信终止模块54,用于所述第一进程向所述第二进程发送通信结束指令,并关闭所述第一共享内存和所述第二共享内存。本发明实施例一至五提供的进程间通信方法及装置基于共享内存机制来实现,通过监听第一进程的连接请求,当有第一进程请求与第二进程进行通信连接时,根据通信双方的进程的标识来建立独立的共享内存以完成进程间的通信,实现进程间的通信连接的动态创建,高性能、高灵活性地实现了进程间通信。基于本发明实施例一至五所提供的进程间通信方法及装置,进一步地,在下述实施例中阐述一种基于进程间通信方法及装置实现的控件框架:通常,为了提高软件的可移植性和可重用性,会将一些需要重复使用的用户界面(User Interface,UI)逻辑封装成可视化控件,以在不同的应用程序中重复使用,且这些控件都是以进程内加载的方式来使用的,例如微软的浏览器控件。然而,随着图形渲染技术的发展,对Π的绚丽度要求越来越高,为了加速图形的渲染,越来越多的程序会把渲染相关的计算交给图形处理单元(Graphics Processing Unit, GPU)来进行硬件加速。在上述背景之下,会出现一个应用程序加载了一个或者多个可视化控件,却由于运行在一台不支持硬件加速的机器上,只能将图形渲染放到CPU中去计算,导致该应用程序运行速度缓慢甚至运行崩溃的情况。图6示出了本发明第六实施例提供的控件框架的结构框图,在本实施例中,在进程加载上将应用程序中的控件与后台运行的主程序分离开来,将需要跟用户频繁交互或者有复杂动画效果显示的控件放到其他进程内来运行,那么每个控件与主程序就分别是两个独立的进程,每个控件的任何异常状况都不会影响到主程序的执行。在本实施例中,当控件需要与主程序交互时,则采用了本发明实施例一至五所提供的进程间通信方法及装置,高性能、高灵活性地完成控件与主程序之间的通信。为了便于说明,图6仅示出了与本实施例相关的部分。
如图6所示,该控件框架包括了一个主程序61及至少一个控件62,主程序61和每一个控件62均通过不同的进程来进行加载,因此,主程序61和控件62的交互需要通过进程间通信来实现,在本实施例中,主程序61对应的进程即可以理解为上述的第二进程,而每个控件62对应的进程即可以理解为上述的第一进程。为了达到这一目的,在主程序61内包括了:第一加载模块611,其将主程序61加载进第二进程。在控件62内包括了:第二加载模块621,其将控件62加载进第一进程。在本实施例中,第一加载模块611和第二加载模块621作为主程序或者控件与进程的接口,将主程序或者控件加载进不同的进程以进行交互,因此,相比于微软的D-COM控件框架,其封装了繁琐的通信过程,只需要较低的技术门槛就可实现跨进程的控件框架,用户可以像使用本地进程控件的方式一样操纵远程控件,也方便了程序代码的移植。在主程序61及每个控件62均被加载进不同的进程之后,该控件框架还包括了如图5所示的进程间通信装置63,其用于完成所述第一进程与第二进程之间的进程间通信。在本实施例中,上述控件框架由于分离了控件62与主程序61,避免了因为一个应用程序本身加载了一个或者多个控件时应用程序运行缓慢甚至导致应用程序崩溃的情况发生,且即使一个控件崩溃,也不会影响到主程序的正常运行,提高了控件框架的稳定性。同时,本实施例的控件框架封装了繁琐的通信过程,只需要较低的技术门槛就可实现跨进程的控件框架,增加了控件框架的易用性和可移植性。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种进程间通信方法,其特征在于,包括: 根据第一进程的标识及第二进程的标识创建第一共享内存和第二共享内存,所述第一共享内存用于接收所述第一进程的发送数据以使所述第二进程能够从所述第一共享内存中读取该发送数据,所述第二共享内存用于接收所述第二进程的发送数据以使所述第一进程能够从所述第二共享内存中读取该发送数据,所述标识用于唯一标识一个进程; 通过所述第一共享内存和所述第二共享内存进行所述第一进程与所述第二进程之间的通信。
2.如权利要求1所述的方法,其特征在于,在所述根据第一进程的标识及第二进程的标识创建第一共享内存和第二共享内存的步骤之前,还包括: 创建第三共享内存,用于所述第二进程接收所述第一进程的连接请求。
3.如权利要求1所述的方法,其特征在于,所述创建第一共享内存和第二共享内存的步骤包括: 所述第一进程创建所述第一共享内存后向所述第二进程发送所述连接请求; 所述第二进程接收到所述连接请求后创建所述第二共享内存,并打开所述第一共享内存后向所述第一进程返回第一应答信号。
所述第一进程在接收到所述第一应答信号后打开所述第二共享内存,并向所述第二进程返回第二应答信号。
4.如权利要求1所述的方法,其特征在于,所述通过第一共享内存和第二共享内存进行所述第一进程与所述第二进程之间的通信的步骤包括: 分别建立发送线程、接收线程来发送、接收数据,所述发送线程仅在有数据要发送时被激活,所述接收线程仅在有数据需要接收时被激活。
5.如权利要求1所述的方法,其特征在于,所述通过第一共享内存和第二共享内存进行所述第一进程与所述第二进程之间的通信的步骤包括: 建立检测线程,用于检测所述第一进程或者所述第一进程是否出现故障; 当所述第一进程或者所述第二进程出现故障时,所述检测线程通知对方进程终止通信连接并释放所述第一共享内存和所述第二共享内存。
6.如权利要求1所述的方法,其特征在于,还包括: 所述第一进程向所述第二进程发送通信结束指令,并关闭所述第一共享内存和所述第二共享内存。
7.如权利要求1所述的方法,其特征在于,应用于多个所述第一进程与一个所述第二进程之间同时通信。
8.—种进程间通信装置,其特征在于,包括: 共享内存建立模块,用于根据第一进程的标识及第二进程的标识创建第一共享内存和第二共享内存,所述第一共享内存用于接收所述第一进程的发送数据以使所述第二进程能够从所述第一共享内存中读取该发送数据,所述第二共享内存用于接收所述第二进程的发送数据以使所述第一进程能够从所述第二共享内存中读取该发送数据,所述标识用于唯一标识一个进程; 通信模块,用于通过所述第一共享内存和所述第二共享内存进行所述第一进程与所述第二进程之间的通信。
9.如权利要求8所述的装置,其特征在于,所述共享内存建立模块还用于创建第三共享内存,以使所述服务端接收所述第一进程的连接请求。
10.如权利要求8所述的装置,其特征在于,所述共享内存建立模块包括: 共享内存创建子模块,用于所述第一进程创建所述第一共享内存及所述第二进程创建所述第二共享内存; 共享内存打开子模块,用于所述第二进程打开所述第一共享内存及所述第一进程打开所述第二共享内存; 握手子模块,用于所述第一进程向所述第二进程发送所述连接请求,以及所述第一进程与所述第二进程之间发送握手信号。
11.如权利要求8所述的装置,其特征在于,所述通信模块包括: 发送线程建立子模块,用于建立发送线程来发送数据,所述发送线程仅在有数据要发送时被激活; 接收线程建立子模块,用于建立接收线程来接收数据,所述接收线程仅在有数据需要接收时被激活。
12.如权利要求8所述的装置,其特征在于,所述通信模块还包括: 检测线程建立子模块,用于建立检测线程,以检测所述第一进程或者所述第二进程是否出现故障; 所述装置还包括: 故障处理模块,用于当所述第一进程或者所述第二进程出现故障时,由所述检测线程通知对方进程终止通信连接并释放所述第一共享内存和所述第二共享内存。
13.如权利要求8所述的装置,其特征在于,还包括: 通信终止模块,用于所述第一进程向所述第二进程发送通信结束指令,并关闭所述第一共享内存和所述第二共享内存。
14.一种进程间通信系统,其特征在于,所述系统包括如权利要求8至13任一项所述的进程间通信装置。
15.一种控件框架,包括一个主程序和至少一个控件,其特征在于, 所述主程序包括第一加载模块,用于将所述主程序加载进第二进程; 每个控件分别包括第二加载模块,用于将所述控件加载进第一进程; 还包括: 如权利要求8至13任一项所述的进程间通信装置,用于完成所述第二进程与至少一个所述第一进程间的通信。
全文摘要
本发明适用于属于计算机技术领域,提供了一种进程间通信方法、装置及系统,包括根据第一进程的标识及第二进程的标识创建第一共享内存和第二共享内存,所述标识用于唯一标识一个进程;通过第一共享内存和第二共享内存进行第一进程与第二进程之间的通信。本发明提供的进程间通信方法基于共享内存机制来实现,通过监听第一进程的连接请求,当有第一进程请求与第二进程进行通信连接时,根据通信双方的进程的标识来建立独立的共享内存以完成进程间的通信,实现进程间的通信连接的动态创建,高性能、高灵活性地实现了进程间通信。
文档编号G06F9/54GK103176854SQ20111044176
公开日2013年6月26日 申请日期2011年12月26日 优先权日2011年12月26日
发明者游晶, 彭勇, 黄奎, 谢昕虬, 李临, 孟昭俊, 姬鹏, 李玉宽 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1