专利名称:基于链表的进程间消息传递方法
技术领域:
本发明涉及进程间消息传递方法,尤其涉及一种基于链表的进程间消息传递方法。
背景技术:
在现有技术中,服务框架由服务组件和消息事件组成。其中,服务组件可以为独立的进程或者线程,每个服务组件通常包含一个输入消息队列和一个输出消息队列,并且每个服务组件知道其下一个服务名称,由此形成一个逻辑上首尾相接的服务链表。消息事件在流经每个服务组件后,会产生新的消息事件输入下个衔接的服务组件。
“消息”是在计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;消息队列会保留消息,直到可以成功地传递它。
在使用套接字SOCKET、管道(FIFO)等进程间通信(Inter-ProcessCommunication,IPC)机制传递消息时,消息需要在多个进程间传递,通常,每个处理进程都要完成下面的处理环节从接收缓冲区中读取接收的消息,并解码成为内部数据结构;完成处理过程,保存处理结果;把处理后的结果编码成为消息流,写入发送缓冲区发送到对端进程。例如图1所示,处理进程1从接收缓冲区中拷贝消息数据,然后需要对消息数据进行解码,对解码后的数据进行相应的处理后,再对经过处理后的消息数据进行编码,并且拷贝到发送缓冲区,以便下一个进程(即处理进程2)能够接收消息数据。处理进程2、处理进程3都重复类似的步骤来对消息数据进行处理。
在上述传统进程间消息传递机制中,消息在不同进程间传递时都要在缓冲区和内存之间被拷贝,并且消息事件字段的编码、解码,在消息并发数量和消息事件承载数据量较少的情况下,上述操作不会造成性能上的瓶颈,但是在消息并发数量较多或者消息事件承载数据量较多的应用中(如实时计费系统),上述操作频繁发生,会造成系统性能严重下降。
根据上述描述,可以得出现有技术的技术方案存在下列缺点消息在接收缓冲区、发送缓冲区以及内存之间多次拷贝,在大数据量的情况下数据传输效率低;每次消息传递都要完成编码或者解码的过程,消耗系统CPU资源;发明内容本发明解决的问题是现有技术中,进程间对消息传递的处理消耗了大量资源,导致系统性能下降的情况。本发明提供了一种能够提高消息传输效率的基于链表的进程间消息传递方法。
本发明提供的基于链表的进程间消息传递方法包括a)主控进程创建消息队列,所述消息队列包括已分配节点队列和空闲节点队列;b)第一处理进程接收来自外部的消息,从消息队列中申请空闲节点,并将消息字段首尾链接成共享内存链表,然后发送该链表的头指针到第二处理进程;c)当收到第一处理进程传递的共享内存链表头指针后,第二处理进程将第一处理进程传递的指针转换为地址空间内的内存地址;d)第二处理进程访问所述内存地址中的共享内存链表,在完成处理后将结果更新到该链表中,然后将该链表的头指针发送到后续处理进程。
根据上述进程间消息传递方法,主控进程还创建共享内存区,所述共享内存区用于存放进程间通信的消息数据。
根据上述进程间消息传递方法,所述共享内存区为消息的每个字段分配预定长度的内存块,根据上述进程间消息传递方法,有多个处理进程对消息进行处理。
根据上述进程间消息传递方法,处理完的消息节点被释放到空闲节点队列中去。
根据上述进程间消息传递方法,节点包括消息队列大小、消息队列空闲节点链表头指针和消息队列已分配节点链表头指针。
根据上述进程间消息传递方法,在处理进程间采用FIFO机制发送共享内存链表的头指针。
根据上述进程间消息传递方法,消息队列节点数据包括共享内存链表的头指针、共享内存链表的尾指针和消息数据字段个数的至少一个。
特别地,本发明还提供了一种基于链表的计费系统进程间消息传递方法,包括a)主控进程创建消息队列,所述消息队列包括已分配节点队列和空闲节点队列;b)鉴权进程接收来自外部进程的消息,并且从消息队列中申请空闲节点,并将消息字段首尾链接成共享内存链表,然后发送该链表的头指针到计费进程;c)当收到鉴权进程传递的共享内存链表头指针后,计费进程将鉴权进程传递的指针转换为地址空间内的内存地址;d)计费进程访问所述内存地址中的共享内存链表,在完成处理后把处理后的结果更新到该链表中,然后发送该链表的头指针到记账进程;
e)记账进程指针转换为地址空间内的内存地址,访问所述内存地址中的共享内存链表。
由于本发明采用基于共享内存的消息传递技术和共享内存链表的数据结构,有效地提高了在流式服务处理框架下消息的传递效率。
在本发明中,由于传递的数据只是链表的指针,因此减轻了进程间数据传输的负荷,提高了传输效率。并且由于链表本身具有插入、删除节点速度较快且灵活的特性,以及采用动态内存链表作为消息的数据结构,因此能够解决因消息字段数据动态更改引起的性能问题。使用链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
图1是现有技术中IPC机制消息传递示意图;图2是本发明实例原型系统示意图;图3是本发明实例的基于链表的进程间消息传递方法的流程图;图4是本发明实例采用的内存池机制示意图;图5是根据本发明实例的计费系统处理框架示意图;图6是本发明实例在计费系统中的应用示意图;图7是本发明在计费系统中消息传递方法的流程图。
具体实施例方式
图2是本发明原型系统示意图。如图所示,所述原型系统包括主控进程、处理进程和外部进程。其中,主控进程负责创建消息队列,同时主控进程还对各处理进程进行控制。
外部进程将消息事件输入到处理进程中,并由主控进程和处理进程在共享内存中维护该消息队列的数据结构。所述消息队列的数据结构包括消息队列大小、消息队列空闲节点链表头指针、消息队列已分配节点链表头指针。
在本实施例中,为了方便描述,只涉及三个处理进程进程1、进程2和进程3。这三个处理进程可以进行相应的消息处理,关于消息处理的具体过程根据不同的应用有所不同。例如,三个消息处理进程可以是通信计费系统中的“识别鉴权”、“计费”、“记账”等等处理进程。从外部进程输入的消息在三个处理进程之间“流转”并得到处理。在实际应用中,系统可以包括更多的处理进程。
图3是本发明实施例的基于共享内存链表的进程间消息传递方法的流程图。在步骤301,主控进程创建一个共享内存区。系统启动时,首先由主控进程创建一个全局的共享内存区,共享内存的大小根据系统的处理能力计算获得,也可以通过动态增加的方法进行调整。
为了提高内存的分配效率,本系统采用了共享内存池机制以实现共享内存的分配和回收管理。如图4所示,共享内存链表是本发明为了解决消息动态更改采用的数据结构。消息数据由若干个字段组成,在共享内存中为每个消息数据的字段分配固定长度的内存块,并把这些字段首尾链接在一起,就形成了共享内存链表,每个已分配节点存放指向共享内存链表的头指针。为了避免在分配较小内存块时造成的内存碎片,本发明采用了内存池技术。在内存池中,具有多个内存块,在各内存块中具有预定长度的存储单元,如16字节的内存块、32字节长度的内存块、4k字节长度的内存块等等。具有不同长度的消息数据的字段分别存储在相应长度的内存块中。
在步骤302,主控进程创建消息队列。创建消息队列提供了可与各个处理进程交互的资源。消息队列是由多个共享内存链表组成,其中包括已分配节点链表和空闲节点链表。
在步骤303,处理进程1接收来自外部的消息,并且从所述消息队列中申请空闲节点。进程1通过SOCKET或者FIFO等IPC机制接收来自外部进程传递的消息,并且从消息队列中申请一个空闲节点。消息队列节点数据结构中包括下列信息共享内存链表的头指针;共享内存链表的尾指针;消息数据字段个数。申请空闲的消息队列节点是为处理后的消息申请内存块。
在步骤304,进程1对从外部进程所接收的消息进行处理。进程1以及后面提到的进程2、进程3是处理进程。对消息的处理过程根据不同的应用有所不同。例如,三个消息处理进程可以是通信计费系统中的“鉴权”、“计费”、“记账”等等处理进程。
在步骤305,进程1将处理后的消息的字段首尾链接成共享内存链表,然后发送该链表的头指针到处理进程2。再参考图4,字段1、字段2、字段3、字段4是四个经过进程1处理后的字段,其中字段1、字段3、字段4的长度均为32字节,字段2的长度为64字节,因此四个字段分别存储在32字节和64字节长的内存块里。进程1将四个字段首尾链接,形成共享内存链表,然后采用IPC机制(例如,FIFO机制)发送该链表的头指针(即消息队列节点的指针)到进程2。该链表的头指针即进程1所申请的空闲节点的共享内存链表的头指针,由于存放了指向共享内存链表的头指针,该节点成为已分配节点。
在步骤306,当收到进程1传递的共享内存链表头指针后,进程2将进程1传递的指针转换为地址空间内的内存地址。进程2将指针数据转换为地址空间内的内存地址。进程2通过访问所述内存地址即可获取存储在相关地址中的消息数据,以便作进一步的处理,这样避免了对消息数据的拷贝,节约了系统资源。
在步骤307,处理进程2访问所述内存地址中的共享内存链表,对消息数据进行相应的处理,在完成处理后,将处理后的字段结果更新到该链表中,然后将该链表的头指针发送到处理进程3。
在步骤308,进程3通过对链表指针所映射的内存地址的访问来获取共享内存链表。
在步骤309,进程3将处理完的消息节点释放到空闲节点队列中去。在本实施例中,进程3是最后一个处理进程,在消息数据进行处理完成后,可以将已经申请的消息队列节点释放到空闲节点队列中去。
计费系统就是本发明一种典型的应用案例,为了使计费系统有较好的处理性能,需要把数据和处理进程绑定在同一个物理主机上进行处理,以方便数据就近读取,提高数据读取效率。
由于通常计费事件中会包含几十个甚至几百个计费特征字段,在进程间传递这些数据时,如果采用数据拷贝的方法,会导致系统性能的急剧下降。而且计费系统的每个处理进程在处理过程中都需要不断的修改计费事件消息的数据结构并传递给下一个处理进程,例如从原始计费消息中识别出计费特征字段(如主叫位置、被叫位置、亲情号码标志等),因此在计费系统更适合采用本发明的指针直接引用的方法。
在如图5所示的计费系统中,包括了三个处理进程,即鉴权进程、计费进程、记账进程。三个进程都受到动态规则引擎的控制,在本实施例中,动态规则引擎是系统的主控进程。在实际计费系统中,会有多个处理进程进行消息数据处理。为了便于描述,在本实施例中,只对上述鉴权、计费、记账进程进行说明。
首先,将标准话单的消息数据输入到鉴权进程,所述标准话单消息数据中包括了话务的类型、主体、对象、通话开始时间、通话位置、业务量等特征字段,鉴权进程在对该消息数据进行处理后,处理后所得的结果,例如,产品ID等特征字段被添加到共享内存链表中,并且将该链表的指针发送到计费进程。计费进程在获取链表指针所映射的内存地址中的内容后,类似地,在对消息数据字段进行进一步处理后,将在该步骤产生的结果(例如,费用项、费用)添加到共享内存链表中,并且将该链表的指针发送到下一个处理进程(即记账进程)进行处理。
图7是本发明在计费系统中消息传递方法的流程图。其中在步骤701,主控进程创建一个共享内存区。共享内存的大小根据系统的处理能力计算获得,也可以通过动态增加的方法进行调整。
如图6所示,为了避免在分配较小内存块时造成的内存碎片,本发明采用了内存池技术,在内存池中,具有多个内存块,在各内存块中具有预定长度的存储单元,具有不同长度的计费系统的各种消息数据的字段分别存储在相应长度的内存块中。
在步骤702,主控进程创建消息队列。创建消息队列提供了可与各个处理进程交互的资源。消息队列是由多个共享内存链表组成,其中包括已分配节点链表和空闲节点链表。
在步骤703,鉴权进程接收来自外部进程的标准话单消息数据,并且从所述消息队列中申请空闲节点。所述标准话单消息数据中包括了话务的类型、主体、对象、通话开始时间、通话位置、业务量等特征字段。鉴权进程通过SOCKET或者FIFO等IPC机制接收来自外部进程传递的标准话单消息,从消息队列中申请一个空闲节点,消息队列节点数据结构中通常包括下列信息共享内存链表的头指针;共享内存链表的尾指针;消息数据字段个数。申请空闲的消息队列节点是为处理后的消息申请内存块。
在步骤704,鉴权进程对从外部进程所接收的消息进行处理。鉴权进程对所输入的标准话单的消息数据进行识别鉴权处理,处理后生成了新的特征字段(如产品ID)。
在步骤705,鉴权进程将处理后的消息字段(包括处理后产生的特征字段以及原先输入的标准话单消息字段)首尾链接成共享内存链表,然后发送该链表的头指针到计费进程。鉴权进程采用IPC机制(例如,FIFO机制)将该链表的头指针(即消息队列节点的指针)发送到计费进程。该链表的头指针即鉴权进程所申请的空闲节点的共享内存链表的头指针,由于存放了指向共享内存链表的头指针,该节点成为已分配节点。
在步骤706,当收到鉴权进程传递的共享内存链表头指针后,计费进程将鉴权进程传递的指针转换为地址空间内的内存地址。计费进程将指针数据转换为地址空间内的内存地址,使得计费进程可以通过访问所述内存地址获取存储在相关地址中的标准话单消息数据以及鉴权进程处理后生成的字段,以便作进一步的处理,这样避免了对消息数据的拷贝,节约了系统资源。
在步骤707,计费进程访问所述内存地址中的共享内存链表,对消息数据进行相应的处理,在完成处理后,将处理后生成的字段结果(例如费用项、费用等字段)以及原先从鉴权进程输入的消息数据字段更新到该链表中,然后将该链表的头指针发送到记账进程。
在步骤708,记账进程通过对链表指针所映射的内存地址的访问来获取共享内存链表,并且进行相应处理,生成例如账目、金额、累计项、累计值等字段。通过相关的输出进程将处理结果输出。
在步骤709,在完成处理后,记账进程将处理完的消息节点释放到空闲节点队列中去。作为最后一个处理进程,记账进程在处理完成后需要释放已经申请的消息队列节点到空闲节点队列中去可以进一步系统的利用效率。
虽然本发明公开了上述实施例,但具体实施例并不是用来限定本发明的,任何本领域技术人员,在不脱离本发明的精神和范围内,可以作出一些修改和润饰,因此本发明的保护范围应当以所附的权利要求书界定的范围为准。
权利要求
1.一种基于链表的进程间消息传递方法,其特征在于,包括a)主控进程创建消息队列,所述消息队列包括已分配节点队列和空闲节点队列;b)第一处理进程接收来自外部的消息,从消息队列中申请空闲节点,并将消息字段首尾链接成共享内存链表,然后发送该链表的头指针到第二处理进程;c)当收到第一处理进程传递的共享内存链表头指针后,第二处理进程将第一处理进程传递的指针转换为地址空间内的内存地址;d)第二处理进程访问所述内存地址中的共享内存链表,在完成处理后将结果更新到该链表中,然后将该链表的头指针发送到后续处理进程。
2.根据权利要求1所述的进程间消息传递方法,其特征在于,主控进程创建共享内存区,所述共享内存区用于存放进程间通信的消息数据。
3.根据权利要求2所述的进程间消息传递方法,其特征在于,所述共享内存区为消息的每个字段分配预定长度的内存块。
4.根据权利要求1所述的进程间消息传递方法,其特征在于,有多个处理进程对消息进行处理。
5.根据权利要求1所述的进程间消息传递方法,其特征在于,将处理完的消息节点释放到空闲节点队列中。
6.根据权利要求1所述的进程间消息传递方法,其特征在于,节点包括消息队列大小、消息队列空闲节点链表头指针和消息队列已分配节点链表头指针。
7.根据权利要求1所述的进程间消息传递方法,其特征在于,在处理进程间采用FIFO或者其他IPC机制发送共享内存链表的头指针。
8.根据权利要求1所述的进程间消息传递方法,其特征在于,消息队列节点数据包括共享内存链表的头指针、共享内存链表的尾指针和消息数据字段个数中的至少一个。
9.一种基于链表的计费系统进程间消息传递方法,其特征在于,包括a)主控进程创建消息队列,所述消息队列包括已分配节点队列和空闲节点队列;b)鉴权进程接收来自外部进程的消息,并且从消息队列中申请空闲节点,并将消息字段首尾链接成共享内存链表,然后发送该链表的头指针到计费进程;c)当收到鉴权进程传递的共享内存链表头指针后,计费进程将鉴权进程传递的指针转换为本进程地址空间内的内存地址;d)计费进程访问所述内存地址中的共享内存链表,在完成处理后把处理后的结果更新到该链表中,然后发送该链表的头指针到记账进程;e)记账进程指针转换为本进程地址空间内的内存地址,访问所述内存地址中的共享内存链表。
10.根据权利要求9所述的进程间消息传递方法,其特征在于,主控进程创建共享内存区,所述共享内存区用于存放进程间通信的消息数据。
11.根据权利要求10所述的进程间消息传递方法,其特征在于,所述共享内存区为消息的每个字段分配预定长度的内存块。
12.根据权利要求9所述的进程间消息传递方法,其特征在于,将处理完的消息节点释放到空闲节点队列中。
13.根据权利要求9所述的进程间消息传递方法,其特征在于,节点包括消息队列大小、消息队列空闲节点链表头指针和消息队列已分配节点链表头指针。
14.根据权利要求9所述的进程间消息传递方法,其特征在于,在各进程间采用FIFO或者其他IPC机制发送共享内存链表的头指针。
15.根据权利要求9所述的进程间消息传递方法,其特征在于,消息队列节点数据包括共享内存链表的头指针、共享内存链表的尾指针和消息数据字段个数中的至少一个。
全文摘要
本发明公开了一种基于链表的进程间消息传递方法,包括主控进程创建消息队列,该消息队列包括已分配节点队列和空闲节点队列;第一处理进程接收来自外部的消息,从空闲节点消息队列中申请空闲节点,并将消息字段首尾链接成共享内存链表,然后发送该链表的头指针到第二处理进程;当收到第一处理进程传递的共享内存链表头指针后,第二处理进程将第一处理进程传递的指针转换为本进程地址空间内的内存地址。第二处理进程访问该内存地址中的共享内存链表,在完成处理后将结果更新到该链表中,然后将该链表的头指针发送到后续处理进程。采用基于共享内存指针的消息传递技术和共享内存链表的数据结构,有效提高了在流式服务处理框架下消息的传递效率。
文档编号G06F9/46GK1859325SQ20061000748
公开日2006年11月8日 申请日期2006年2月14日 优先权日2006年2月14日
发明者孟庆光 申请人:华为技术有限公司