背景技术
在通信领域中,随着对称多处理(Symmetrical Multi-Processing,以下简称为SMP)、多核、超线程等概念、技术、产品的出现,通信系统的处理能力有了极大的提升空间。目前已经有了一些操作系统支持SMP体系架构,可以实现多CPU协同工作,使得CPU处理密集型的系统能力得到扩展。但传统的业务支撑软件、应用开发模式并不能充分发挥SMP体系架构的优势,必须要做相应的调整。
一种很重要的调整方式就是尽可能将系统中耗用CPU比重突出的业务流程多实例化。否则,这种业务流程在任一时刻只能在一个核上运行,而其他核则空闲,影响多核的整体使用效率。如果将这种业务流程多实例化,则可由操作系统调度,并行在多个核上运行,提高多核利用率,提升整体业务处理效率。
当存在多实例化线程时,就会对整个系统的编程模式产生以下影响:多实例并行运行的互斥保护;多实例代码的可重入;多实例线程的通信方式。
上述前两个问题属于基于优先级抢占调度机制、多核体系结构的共性问题,业务代码必然要考虑,此处不再详述。
对于多实例线程的通信方式,涉及到以下问题:其他线程向多实例线程发消息;多实例线程向其他线程发消息;多实例线程间的通信。
因为多实例线程之间是完全并行的,相互联系主要集中于对于共享数据的操作,所以通过互斥保护机制就可以了。这类线程间几乎没有通信需求,即使有,也应该是广播通知方式,而不是点对点的。本文中不做详细讨论。
在传统的业务支撑环境中,往往是由一个线程实现某种业务,而为了实现线程之间的通信,每个线程都拥有其在系统中唯一的ID,我们可称之为线程标识符(Thread Identification,以下简称为TID或线程ID)。当一个线程要与其他业务线程通信时,只需向标识该业务线程的TID发送消息即可。
但在SMP体系架构下,多实例线程使得同一种业务可以由许多线程来实现,这些线程是执行同样的代码指令、完成同样的功能,对外接口完全一样,表现形式是完全对称的。这时,如果要实现其他业务线程与该业务线程群的通信,就出现问题,如何标识这些多实例线程呢?其他业务线程怎么记住系统中有哪些此类线程,有多少,该如何选择下一个业务处理者?
发明内容
为了解决上述问题,本发明提供了一种通信方法及装置,用于在对称多处理体系下实现多实例线程通信,通过引入多实例线程族概念,采用多实例线程族主线程或者代理函数的方式来隔离多实例化具体实现,从而,保持了业务线程多实例化后对外呈现的简单性、统一性,使得只需对业务支撑部分做少量简单改动,就可以实现上层业务、应用在SMP体系架构上的开发部署,因此,可以充分发挥多核开行处理的优势,进而提升业务处理系统的整体能力。
为了实现上述目的,本发明的一个方面提供了一种通信方法,用于在对称多处理体系下实现多实例线程通信,其包括以下步骤:步骤S302,在第一业务线程发送消息给第二业务线程族以进行处理时,将消息发送给第二业务线程族的代理;步骤S304,代理根据预定算法将消息分配给第二业务线程族中的一个子线程;以及步骤S306,代理设置消息中的目的线程ID,并将消息发送给子线程。
根据本发明的一个方面,该通信方法还包括以下步骤:步骤S308,当第二业务线程族中的一个子线程向第一业务线程发送消息时,设置子线程的消息发送函数中的源线程ID和目的线程ID;以及步骤S310,调用代理,代理重新设置源线程ID,然后发送消息。
此外,根据本发明的一个方面,在步骤S306中,设置消息中的目的线程ID的步骤具体为:将消息中的目的线程ID替换成子线程的线程ID。并且,在步骤S308中,设置子线程的消息发送函数中的源线程ID和目的线程ID的步骤具体为:将子线程的消息发送函数中的源线程ID设置为子线程本身的线程ID,并将目的线程ID设置为第一业务线程的线程ID。另外,在步骤S310中,重新设置源线程ID的步骤具体为:将子线程本身的线程ID设置为代理的线程ID。
根据本发明的实施例,预定算法为负荷均衡算法,此外,代理包括以下一种:主线程或代理函数。
本发明的另一方面还提供了一种通信装置,用于在对称多处理体系下实现多实例线程通信,其包括:发送单元,用于在第一业务线程发送消息给第二业务线程族以进行处理时,将消息发送给第二业务线程族的代理;分配单元,用于根据预定算法将消息分配给第二业务线程族中的一个子线程;以及第一设置发送单元,用于设置消息中的目的线程ID,并将消息发送给子线程。
根据本发明的另一方面,该通信装置还包括:第二设置发送单元,用于当第二业务线程族中的一个子线程向第一业务线程发送消息时,设置子线程的消息发送函数中的源线程ID和目的线程ID;以及调用设置单元,用于调用代理,重新设置源线程ID,然后发送消息。
另外,根据本发明的另一方面,第一设置发送单元用于将消息中的目的线程ID替换成子线程的线程ID,以及第二设置发送单元还用于将子线程的消息发送函数中的源线程ID设置为子线程本身的线程ID,并将目的线程ID设置为第一业务线程的线程ID。此外,调用设置单元还用于将子线程本身的线程ID设置为代理的线程ID。
如上所述,本发明实现了以下技术效果:由主线程或者代理函数完成负载均衡处理、多实例线程的分配,并对消息发送参数中有关多实例线程族的TID进行替换,保持了业务线程多实例化后对外呈现的简单性、统一性,并且,充分发挥了多核并行处理的优势,提升了业务处理系统的整体能力。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
具体实施方式
以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
在本发明的下述实施例中,多实例线程族主线程或者代理函数都可以作为代理,实现隔离作用,为叙述方便,本文后续主要以代理来统称这两种方法。
图1是业务线程族C作为一个整体呈现给系统内其他线程(其多实例化对于其他线程基本透明)的视图。
如图1所示,在传统单核业务体系中,业务线程C跟其他线程一样,也是由一个线程实体构成的。因此,其他线程在与C线程通信时,可以很明确地用C线程的TID来通信。但当移植到多核体系中,业务线程C多实例化为C1、C2...Cn多个线程,并且,每个Cn线程都有其独立的TID,我们把C1、C2...Cn。这些由同一段代码创建出来的完成同样功能的线程群称为多实例线程族C。
由于业务流程的多实例数量有可能跟多核体系结构有关(比如在双核中多实例数可能为2,四核中多实例数可能为4),也就是说,n的数量是不确定的。因此,多实例线程的TID也是不确定的,可能随多核体系结构的变化而变化。按照传统方式,由其他业务线程来记住众多多实例线程的TID,并且选定由其中的某一个多实例线程来处理本次业务,这是不现实的。
对于上层业务线程A、B,以及驱动线程H来说,它们只关心其业务上下游关系,即它的前序处理者、后序处理者,而不必关心具体由哪个多实例线程Cn来处理。因此,多实例线程族C可以对外以一个实体存在:业务线程族C。A、B、H不必面对众多、不确定的线程C1、C2...Cn。
上述实现方式具有以下优点:线程多实例对于其他线程基本透明,并且,单核、多核兼容性、移植性好。
但是,对于系统监控进程I来说,它需要掌握所有线程的运行情况,比如可能通过心跳方式进行监测,需要与系统内所有线程进行点对点通信,那么还是有必要为每个多实例线程分配独立的TID。
因此,在本发明的实施例中,基本思想就是:对于多实例线程族C,可以用一个主线程来管理,也可以简单地通过多实例线程族代理函数实现。系统内其他线程只需将消息发送给该主线程TID或者代理函数所拥有的虚拟TID,然后由主线程TID或者代理函数去进行负载均衡,分配到某个多实例线程,并且用该多实例线程的TID来替换掉通信函数中所用到的主线程TID,再发送出去。反之,当某个多实例线程需要向其他线程发送消息时,则先发给所属多实例线程族的主线程或者代理函数虚拟TID,它们将会把通信函数中的源TID由多实例线程的TID替换为主线程TID。
以下将结合图2详细描述如图3所示的通信方法,图2是根据本发明的实施例采用多实例线程族主线程或者多实例线程族代理函数后的通信处理的视图,图3是根据本发明的在对称多处理体系下实现多实例线程通信的流程图。
在本实施例中,将涉及主线程方式和代理函数方式,在此,倾向于使用代理函数方式,原因如下:使用主线程,对外屏蔽了其子线程的多实例化,流程清晰,但增加了线程数量以及调度切换开销,并且主线程成为多个线程的分发处理中心,可能会成为新的瓶颈;而使用代理函数,其多实例线程号TID的翻译、选择在通信函数处理过程中完成,流程稍微费解,但避免了上述主线程方式的缺点。
如图3所示,在对称多处理体系下实现多实例线程通信的方法包括以下步骤:
步骤S302,在第一业务线程发送消息给第二业务线程族以进行处理时,将消息发送给第二业务线程族的代理;
步骤S304,代理根据预定算法将消息分配给第二业务线程族中的一个子线程;
步骤S306,代理设置消息中的目的线程ID,并将消息发送给子线程,参照图2,设置消息中的目的线程ID的步骤具体是指:将消息中的目的线程ID替换成子线程的线程ID。
以上步骤S302、步骤S304、以及步骤S306实现了业务线程向线程族发送消息的整个过程,继续参照图2,线程族向业务线程发送消息的步骤如下:
步骤S308,当第二业务线程族中的一个子线程向第一业务线程发送消息时,设置子线程的消息发送函数中的源线程ID和目的线程ID,参照图2,设置子线程的消息发送函数中的源线程ID和目的线程ID的步骤具体为:将子线程的消息发送函数中的源线程ID设置为子线程本身的线程ID,并将目的线程ID设置为第一业务线程的线程ID;
步骤S310,调用代理,代理重新设置源线程ID,然后发送消息,如图2所示,重新设置源线程ID的步骤具体为:将子线程本身的线程ID设置为代理的线程ID。
至此,实现了线程族向业务线程发送消息的整个过程。
在本实施例中,需要指出的是,预定算法为负荷均衡算法。
此外,需要指出的是,代理函数也拥有一个TID,但无需创造实际线程,该TID就是现有传统系统软件中该业务线程的TID,这样整个系统软件其他线程无需更改访问它的TID,同时,为所有的线程TID分配多实例处理函数指针数组,初始化为空。为多实例线程族代理函数TID、多实例线程TID注册挂接具体的函数实现。其实现的功能就是根据接收的消息类型,分发到具体的某个多实例线程,并根据情况进行目标TID、源TID的转换。
并且,在通信函数(如,postMsg、ASEND)中增加对线程代理函数指针数组的处理,如果不为空,则执行挂接的多实例线程族代理函数。
图4根据本发明的在对称多处理体系下实现多实例线程通信的装置400的框图。
如图4所示,在对称多处理体系下实现多实例线程通信的装置400包括:发送单元402,用于在第一业务线程发送消息给第二业务线程族以进行处理时,将消息发送给第二业务线程族的代理;分配单元404,用于根据预定算法将消息分配给第二业务线程族中的一个子线程;以及第一设置发送单元406,用于设置消息中的目的线程ID,并将消息发送给子线程,其中,第一设置发送单元406还用于将消息中的目的线程ID替换成子线程的线程ID。
此外,为实现线程族向业务线程发送消息的通信,该通信装置400还包括:第二设置发送单元408,用于当第二业务线程族中的一个子线程向第一业务线程发送消息时,设置子线程的消息发送函数中的源线程ID和目的线程ID,其中,第二设置发送单元408还用于将子线程的消息发送函数中的源线程ID设置为子线程本身的线程ID,并将目的线程ID设置为第一业务线程的线程ID;以及调用设置单元410,用于调用代理,重新设置源线程ID,然后发送消息,其中,调用设置单元410还用于将子线程本身的线程ID设置为代理的线程ID。
在本实施例中,预定算法为负荷均衡算法,此外,代理包括以下一种:主线程和代理函数。
本发明注重的是多实例线程通信实现的系统方法,而不是具体的软件编程实现方法,无需按照严格的顺序,上述实施例也并不是唯一、最佳的软件编程实现方法。以下提供另一实施例,步骤包括:
(1)修改TID数据结构,增加属性,以判断是否为多实例线程族代理函数;
(2)创建线程多实例处理函数指针数组;
(3)实现多实例线程族代理函数(参照图2,就是多实例线程族C的代理函数),功能包括实现负载均衡算法,在C1...Cn之间进行负载均衡,将通信函数中的目标TID由代理函数的TID替换为选定后的多实例线程TID;
(4)实现多实例线程的处理函数,功能包括将通信函数中的源TID由具体某个多实例线程TID替换为该多实例线程族代理函数TID,以保持多实例线程族对外的统一接口、标识;
(5)修改通信函数实现,增加对目标TID、源TID属性的判断,如果为多实例线程或者多实例线程族代理函数,则去执行对应线程的多实例处理函数。
上述方法同样能够在对称多处理体系下实现多实例线程通信。
从以上的描述中,可以看出,本发明实现了如下技术效果:保持了业务线程多实例化后对外呈现的简单性、统一性,使得只需对业务支撑部分做少量简单改动,就可以实现上层业务、应用在SMP体系架构上的开发部署,因此,可以提升业务处理系统的整体能力。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。