首页> 中国专利> 一种进程间通讯装置及其进程间通讯方法

一种进程间通讯装置及其进程间通讯方法

摘要

一种进程间通讯装置和方法,用于在发送进程的发送线程和接收进程的接收线程之间进行数据通讯。该装置包含:共享存储单元,共享消息队列,分发存储单元,分发单元;其中,共享存储单元用于为发送线程提供存储需发送到接收进程的接收线程的数据的存储空间;共享消息队列用于在发送线程和分发单元之间传送数据通知消息;分发存储单元处于接收进程的地址空间,用于存储需发送到接收进程的接收线程的数据;分发单元用于从共享消息队列中读取数据通知消息,根据该消息中包含的数据地址信息将数据从共享存储单元拷贝到分发存储单元中;并将该数据在分发存储单元中的地址信息发送到数据通知消息中包含的接收线程标识对应的接收线程中。

著录项

  • 公开/公告号CN101127685A

    专利类型发明专利

  • 公开/公告日2008-02-20

    原文格式PDF

  • 申请/专利权人 中兴通讯股份有限公司;

    申请/专利号CN200710153044.8

  • 发明设计人 卢勤元;

    申请日2007-09-20

  • 分类号H04L12/54(20060101);H04M3/42(20060101);H04Q3/00(20060101);

  • 代理机构11262 北京安信方达知识产权代理有限公司;

  • 代理人龙洪;霍育栋

  • 地址 518057 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦法律部

  • 入库时间 2023-12-17 19:41:21

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-11-03

    未缴年费专利权终止 IPC(主分类):H04L12/54 授权公告日:20110525 终止日期:20160920 申请日:20070920

    专利权的终止

  • 2011-05-25

    授权

    授权

  • 2008-04-16

    实质审查的生效

    实质审查的生效

  • 2008-02-20

    公开

    公开

说明书

技术领域

本发明涉及一种进程间通讯装置及其进程间通讯方法。

背景技术

随着智能网业务控制点SCP(Service Control Point,业务控制点)功能越来越复杂,业务控制点需要根据功能的不同划分为不同的模块,如业务状态控制模块、业务流程控制模块、业务管理模块、计费模块和话单处理模块等。为了便于管理和维护,将这些模块分解为独立的进程,各进程内部再进一步细分成不同的线程来完成模块的相关功能,典型的多进程多线程系统架构如图1所示。

为了完成智能网业务呼叫流程,各模块内部和各模块之间需要进行大量的消息交互,既有进程内的消息,也有进程间的消息。进程内各线程之间的消息发送相对比较简单,由于发送线程和接收线程在一个进程的地址空间中,发送线程只需要通过消息队列将消息体的指针发送给接收线程,接收线程就可以直接处理消息体指针。但对于进程间的通讯,如果将整个消息体的内容(数据)直接放入消息队列来进行发送,对操作系统的消息队列会形成很大的冲击,大量的消息可能导致操作系统消息队列阻塞,导致整个业务处理机的异常。因此,对于进程间的通讯,必需采用其它更加有效的方法来解决。

除了智能网络系统外,存在多个进程、且多个进程间有通讯需求的其它系统也有类似的情况。

解决以上问题的传统方法是采用如图2所示的进程间通讯模式,该进程间通讯模式结合使用消息队列和共享内存来进行进程间的通讯:发送进程将需要发送的消息体的内容(即数据)拷贝到接收进程对应的共享内存区域中,同时将消息体的内容在共享内存中的偏移地址(数据起始地址)和数据长度通过消息队列发送到接收进程。

图2所示的进程间通讯模式解决了由于消息数过多,消息体内容所包含数据量过大而导致的消息队列阻塞的问题;但引发了一个新问题,即:当多个发送进程/线程同时向一个接收进程发送消息时,发送进程/线程同时向接收进程的共享内存区域写入消息体的内容,容易导致写冲突,即该共享内存区域中的同一个地址被多个发送进程同时写入数据,造成数据冲突;在多个发送进程存在大量并发消息的情况下,写冲突出现的概率很大。因此,在发送进程/线程将消息内容拷贝到接收进程的共享内存区域前,必需先获取进程间的互斥锁,才能保证数据的完整性。但是在写操作前增加互斥操作无疑降低了系统的并发度,导致系统整体性能的下降;并且互斥锁过多也会消耗大量的系统资源。

发明内容

本发明所要解决的技术问题是,克服现有技术中进程间通讯方法的不足,提供一种不使用互斥操作即可实现正确的进程间通讯装置及其进程间通讯方法。

为了解决上述问题,本发明提供一种进程间通讯装置,用于在发送进程的发送线程和接收进程的接收线程之间进行数据通讯,其特征在于,该装置包含:共享存储单元,共享消息队列,分发存储单元,分发单元;其中,

共享存储单元用于为所述发送线程提供存储需发送到所述接收进程的接收线程的数据的存储空间;

共享消息队列用于在所述发送线程和分发单元之间传送数据通知消息;

分发存储单元处于所述接收进程的地址空间,用于存储所述需发送到所述接收进程的接收线程的数据;

分发单元用于从共享消息队列中读取数据通知消息,根据该消息中包含的数据地址信息将数据从共享存储单元拷贝到分发存储单元中;并将该数据在分发存储单元中的地址信息发送到数据通知消息中包含的接收线程标识对应的所述接收线程中。

此外,所述分发单元为所述接收进程的线程。

此外,该装置还包含分发消息队列,用于将保存在所述分发存储单元中的所述数据的地址信息发送到所述接收线程标识信息对应的接收线程中。

此外,所述共享存储单元中包含为所述发送线程分配的存储区域;所述发送线程将所述需发送到所述接收线程的数据存储在该存储区域的可用地址段中。

此外,所述分发存储单元是预先分配的所述接收进程地址空间中的堆内存池;或者是所述分发单元根据需要动态分配的堆内存。

本发明还提供一种进程间通讯方法,其特征在于,当发送进程的发送线程向接收进程的接收线程发送数据时,该方法包含如下步骤:

A:发送线程将所述数据存储在共享存储单元的可用地址段中,并将数据通知消息通过共享消息队列发送到分发单元;数据通知消息中包含所述数据在共享存储单元中的地址信息和接收线程标识;

B:分发单元接收到上述数据通知消息后,获取该消息中包含的数据的起始信息和接收线程标识;

C:分发单元将所述数据从共享存储单元拷贝到分发存储单元中,并将该数据在分发存储单元中的地址信息发送到接收线程标识对应的接收线程中。

此外,所述分发单元为所述接收进程的线程。

此外,在所述步骤C中,分发单元通过分发消息队列将所述数据在分发存储单元中的地址信息发送到所述接收线程中。

此外,所述共享存储单元中包含为所述发送线程分配的存储区域;在所述步骤A中,所述发送线程将所述数据存储在该存储区域中的可用地址段中。

此外,在所述步骤B和C之间包含如下步骤:

B1:分发单元在所述接收进程的地址空间分配堆内存,将该堆内存作为所述分发存储单元;

在所述步骤C之后还包含如下步骤:

D:所述接收线程根据数据的地址信息从分发存储单元读取所述数据,并对数据进行处理;

E:所述接收线程释放所述分发存储单元对应的堆内存。

由上可知,由于本发明为每一个发送线程在共享存储单元中分配独立的存储区域,有效地防止了多个发送进程/线程向同一个地址空间写数据而导致数据冲突的问题,提高了系统处理的并发度;此外,由于在接收进程中采用了分发单元线程对发送进程/线程发送的数据及时进行拷贝、通知等处理,有效地避免了发送线程与接收线程的数据发送与接收速度不匹配而导致的数据不能被及时读取、甚至造成数据被覆盖的现象。

附图说明

图1为典型的多进程多线程系统架构示意图;

图2是现有技术中的进程间通讯模式示意图;

图3为本发明的一种进程间通讯装置的结构示意图;

图4是本发明的一种进程间通讯方法流程图。

具体实施方式

下面将结合附图和实施例对本发明进行详细描述。

图3为本发明的一种进程间通讯装置的结构示意图。如图3所示,进程间通讯装置用于在发送进程和接收进程之间进行数据通讯,发送进程(进程A)包含一个或多个发送线程:线程A1,....,线程An,n为进程A中包含的发送线程的数量;接收进程(进程B)包含一个或多个发送线程:线程B1,....,线程Bm,m为进程B中包含的发送线程的数量。

该装置包含:共享存储单元,共享消息队列,分发单元,分发存储单元,分发消息队列。其中:

共享存储单元用于为发送进程中的各发送线程提供存储空间,该存储空间用于存储发送到其它进程的数据;在共享存储单元中可以为发送进程中的不同发送线程分配不同的存储区域;欲向其它进程发送数据的线程可将数据存放在为该线程分配的区域中。

共享消息队列用于在发送进程和接收进程的分发单元之间传送数据通知消息;该消息通常包含共享存储单元的偏移地址(数据的起始地址)及数据长度;此外该消息中还可包含消息(即数据的起始地址及长度)转发目的标识信息,用于指示该消息的接收者,即接收进程中的接收线程的标识信息。

上述数据的起始地址及数据长度可统称为数据的地址信息,若发送方和接收方对数据的长度进行了预先约定,则数据的地址信息中可不包含数据长度。

分发单元用于从共享消息队列中读取数据通知消息,通过其中包含的转发目的标识信息获知该消息的接收线程标识信息,并从该消息中获取共享存储单元的偏移地址及数据长度;根据该偏移地址和数据长度从共享存储单元中读取数据,并将该数据拷贝到分发存储单元中;分发单元还将该数据在分发存储单元中的偏移地址(数据的起始地址)及数据长度通过分发消息队列发送到上述接收线程标识信息对应的线程中。

分发单元通常处于接收进程的地址空间中,也就是说,分发单元为接收进程中的一个实现数据和消息分发功能的特定线程。

分发存储单元用于存储数据,该存储单元通常位于接收进程的地址空间中;分发存储单元通常是预先分配的接收进程地址空间中的堆内存,也可以是分发单元根据需要动态分配的堆内存。

分发消息队列用于在分发单元和接收进程中的各线程之间传送消息,该消息中通常包含上述分发存储单元中的偏移地址(数据起始地址)及数据长度;由于在接收进程中存在多个线程,而多个线程通常共享该分发消息队列,因此上述消息中通常还包含上述接收线程标识信息,用于接收者确认是否应该读取该消息。

在UNIX系统中,上述共享消息队列和分发消息队列通常是system V(系统V)消息队列。

图4是本发明的一种进程间通讯方法流程图。如图4所示,当发送进程中的发送线程(例如,线程A1)需要向接收进程中的接收线程(例如,线程B1)发送数据时,该方法包含如下步骤:

101:线程A1将需发送至线程B1的数据存储在共享存储单元中为线程A1所分配的存储区域的当前可用的地址段中;

由于为A1所分配的存储区域的大小有限,线程A1需要循环使用该存储区域,以避免在连续发送多段数据时,前一段数据尚未被读取即被下一段数据覆盖。该存储区域的大小与线程A1写入数据段的频率和数据量有关,即该存储区域的大小需要保证循环使用该存储区域时不会出现后续数据将尚未被读取的数据覆盖的现象。

102:线程A1将以上数据在共享存储单元中的偏移地址及数据长度通过共享消息队列发送到分发单元;

由上可知,上述共享消息队列通常为系统消息队列,因此上述偏移地址及数据长度信息通常包含在数据通知消息中传送给分发单元,该数据通知消息中还需包含接收线程标识信息,即,线程B1的标识信息。

103:分发单元接收到上述数据通知消息后,从该消息中获取偏移地址(数据起始地址)和数据长度以及接收线程标识信息;

104:分发单元在接收进程的地址空间中分配堆内存作为分发存储单元,根据上述偏移地址和数据长度信息从共享存储单元读取数据,并将该数据拷贝到分发存储单元中;

105:分发单元将分发存储单元的地址,即数据的起始地址及数据长度通过分发消息队列发送到上述接收线程标识对应的接收线程,即,线程B1中;

同样,由于分发消息队列通常为系统消息队列,因此上述数据起始地址及数据长度信息通常包含在数据转发消息中传送给接收线程,即线程B1,该数据转发消息中还需包含接收线程标识信息,即,线程B1的标识信息。

106:线程B1接收到数据转发消息后,根据该消息中包含的数据起始地址和数据长度从分发存储单元中读取数据,对该数据进行相应的处理,并释放分发存储单元对应的堆内存;

由于线程B1与分发单元处于相同进程的地址空间中,因此在数据使用完毕后,线程B1可使用上述数据起始地址直接释放分发存储单元对应的堆内存。

此外,线程B1也可以通知分发单元堆内存中的数据已使用完毕,由分发单元自行释放该地址空间。例如,线程B1向分发单元发送内存释放消息,通知分发单元释放分发存储单元对应的堆内存;此外,还可以通过全局变量的通讯方式通知分发单元释放内存。由于接收线程通知分发单元释放内存的方式属于进程内的线程间通讯方式,不是本发明的重点,因此对此不进行过多的描述。

基于本发明的基本原理,上述实施例可以有多种变化方式,例如:

上述分发存储单元可以是一段预先分配的堆内存池,分发单元负责对其进行管理,并根据需要从堆内存中选择使用其中的一段或多段堆内存;当有突发的大量数据需要拷贝,预先分配的堆内存池中的可分配内存无法满足要求时可以动态分配堆内存使用,这样可以减少内存分配/释放的次数。

由上可知,由于本发明为每一个发送线程在共享存储单元中分配独立的存储区域,有效地防止了多个发送进程/线程向同一个地址空间写数据而导致数据冲突的问题,提高了系统处理的并发度;此外,由于在接收进程中采用了分发单元线程对发送进程/线程发送的数据及时进行拷贝、通知等处理,有效地避免了发送线程与接收线程的数据发送与接收速度不匹配而导致的数据不能被及时读取、甚至造成数据被覆盖的现象。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号