一种消息的读写方法和装置的制作方法

文档序号:6615751阅读:162来源:国知局
专利名称:一种消息的读写方法和装置的制作方法
技术领域
本发明涉及计算机技术领域,特别是涉及 一种消息的读写方法和 装置。
背景技术
通过消息队列进行数据传输是UNIX操作系统的IPC (Inter Process Communication,进程间通讯)的基本方法之一,被广泛地使 用于分布式应用程序间的数据交换。应用程序通过调用系统提供的 API ( Application Programming Interface,应用程序接口 )函数访问目
标消息队列,读取或写入数据。根据调用函数的不同,应用程序可以 分为两种,消息的生产者和消费者,消息的生产者和消费者通过指定 所发或所收消息的类型来建立联系。每一条消息在消息队列中都是唯 一的,只能被一个生产者发送后进入队列,被一个消费者接收后取出 队列。
任何一个消息队列都支持多个应用进程或线程同时对其访问,消 息队列系统提供互斥处理机制,可以保证各个应用进程或线程的安全 访问,不会出现冲突。其中,多个应用进程或线程可以处理不同类型 的消息。例如,A进程发送X类型的消息,B进程发送Y类型的消 息,C进程接收X类型的消息,D进程接收Y类型的消息,因此进 程A、 C和B、 D分别配对,而彼此间没有影响。另外,多个应用进 程或线程也可以处理相同类型的消息。例如,A进程发送X类型的 消息,B、 C、 D进程都接收X类型的消息,当有一条X类型的消息 到达队列时,B、 C、 D其中的一个可以收到这条消息,其他进程则 处于等待状态。
消息队列支持两种使用模式, 一种使用模式为首先,消息的生产者产生某种类型的消息,并将该消息放入消息队列;然后,消息的 消费者从消息队列中接收该类型的消息。如果有多个消息的消费者, 则消费者按照调用的先后顺序从队列中接收消息,直到队列中该类型
的消息为空。另一种使用模式为如果消息队列中某种类型的消息为 空,则消息的消费者调用接收函数,处于等待状态;当消息的生产者 产生该类型的消息并将该消息放入消息队列时,消息的消费者就可以 立即取得该消息。
在实现本发明过程中,发明人发现现有技术中至少存在如下问 题当消息队列中的某一类型的消息为空,且同时有大量消息的消费 者处于等待状态时,该些消费者不占用CPU时间;而当消息的生产 者产生某种类型的消息并将该消息放入消息队列时,所有处于等待状 态的消费者都被唤醒,而无论该消费者是否需要接收该种类型的消 息。被唤醒的消费者会在消息队列中对需要的消息进行査询,其中一 个消费者收到该消息,而其他消费者会在遍历所有的消息后再次进入 等待状态。因此,当消息的产生非常频繁时,所有处于等待状态的消 费者会被反复唤醒,因此该些消费者会占用大量的CPU时间,产生 非常大的无谓的系统开销,消息的并发接收能力急剧下降。当硬件系 统采用多CPU结构时,产生的问题更加明显。

发明内容
本发明实施例要解决的问题是提供 一 种消息的读写方法和装置, 以克服现有技术中由于消费者被无谓唤醒而造成占用大量CPU时间
的缺陷。
为达到上述目的,本发明实施例的技术方案提供 一种消息的读写
方法,包括以下步骤将消息从生产者发送到消息队列的步骤;根据
所述消息的类型,查询消息同步表,如果所述消息同步表中存在与所
述消息的类型对应的记录,则确认有对应的消费者的步骤;当有对应 的消费者时,唤醒所述对应的消费者中的一个消费者的步骤;将所述
6消息发送给所述被唤醒的消费者的步骤。
其中,在所述生产者唤醒对应的消费者中的一个消费者的步骤 中,具体包括获取与所述消息的类型对应的记录的下标;如果所述 记录的等待消费者的数量大于O,则获取与所述下标对应的消息同步 信号灯,对所述消息同步信号灯进行V操作,并将所述记录中等待 消费者的数量减1。
其中,在所述生产者查询消息同步表之前,还包括消费者加入等
待队列的步骤,该消费者加入等待队列的步骤具体包括根据需读取
消息的类型,查询所述消息同步表,如果所述消息同步表中存在与所 述需读取消息的类型对应的记录,则将所述记录中等待消费者的数量
加i;获取与所述需读取消息的类型对应的记录的下标;获取与所述 下标对应的消息同步信号灯;对所述消息同步信号灯进行P操作。
其中,在所述生产者查询消息同步表之前,还包括消费者建立消 息同步表记录并加入等待队列的步骤,该消费者建立消息同步表记录 并加入等待队列的步骤具体包括根据需读取消息的类型,查询所述 消息同步表,如果所述消息同步表中没有与所述需读取消息的类型对 应的记录,则在所述消息同步表中建立消息同步表记录,并对所述记
录进行初始化;获取所述记录的下标;获取与所述下标对应的消息同 步信号灯;对所述消息同步信号灯进行P操作。
其中,所述对记录进行初始化具体包括将所述记录的消息类型 设置为所述需读取消息的类型;将所述记录的等待消费者的数量设置 为l。
其中,在所述被唤醒的消费者读取消息之前,还包括如下步骤 判断所述等待消费者的数量是否为0,如果是,则清除所述记录。 其中,在所述生产者查询消息同步表之前,还包括如下步骤建
立消息同步信号灯集;建立消息同步表,所述消息同步表中表项的数 量与所述消息同步信号灯集中的消息同步信号灯的数量相同;对所述消息同步表进行初始化。
其中,所述对消息同步表进行初始化具体包括将所述消息同步 表的消息类型设置为-1;将所述消息同步表的记录的数量设置为0。
本发明实施例的技术方案还提供了一种消息的读写装置,包括
发送装置,用于将消息从生产者发送到消息队列;查询装置,用于根
据所述消息的类型,查询消息同步表,如果所述消息同步表中存在与
所述消息的类型对应的记录,则确认有对应的消费者;唤醒装置,当 有对应的消费者时,唤醒所述对应的消费者中的一个消费者;将所述 消息发送给所述被唤醒的消费者的装置。
其中,所述消息的读写装置还包括信号灯集建立单元,用于建 立消息同步信号灯集;消息同步表建立单元,用于建立消息同步表, 所述消息同步表中表项的数量与所述消息同步信号灯集中的消息同 步信号灯的数量相同;消息同步表初始化单元,用于对所述消息同步 表进行初始化。
上述技术方案仅是本发明的一个优选技术方案,具有如下优点 本发明实施例通过生产者根据消息的类型,在消息同步表中查询有对 应的消费者,并唤醒其中的一个消费者的方法,使得消费者不会被无 谓唤醒,从而节省了 CPU时间。


图l是本发明实施例的 一种消息同步表的结构图; 图2是本发明实施例的 一种消息的读写方法的流程图。
具体实施例方式
下面结合附图和实施例,对本发明的具体实施方式
作进一步详细 描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
本发明釆用基于内存的BQS (Buffer Queue System,消息队列系 统),该BQS釆用链表式数据结构,利用UNIX系统的IPC进程间通讯 (共享内存、信号灯)技术,使得消息的生产者和消息的消费者可以
8对消息队列进行操作,完成应用进程或线程间的数据交换。
一个BQS中可以包含多个消息队列,各个消息队列之间相互独 立。每个消息队列中可以包含多种类型的消息,每种类型的消息链表
中可以包含多个消息或空消息。在BQS中,每个消息可以釆用分段存
储方式存储在多个数据段中,每个数据段存储区的大小可以根据消息 的长度而定,既可以节省存储区空间,又可以提高消息操作的灵活性。
本发明实施例在釆用BQS时,需要完成以下操作过程首先,建 立消息同步信号灯集,所述消息同步信号灯集用于消息同步,其数量 可以根据BQS能够支撑的最大并发数而定;然后,建立消息同步表, 所述消息同步表中表项的数量与所述消息同步信号灯集中的消息同 步信号灯的数量相同;最后,对所述消息同步表进行初始化,其初始 化过程具体为将所述消息同步表的消息类型设置为-1,即设置 mtype--l;将所述消息同步表的记录的数量设置为O,即设置count二0。
本发明实施例的 一种消息同步表的结构如图1所示,该消息同步 表包括n个表项,所述表项的下标Idx分别为0, 1, 2……,n-l;每 个表项对应一个消息同步信号灯,用于记录消息类型和需读取所述类 型的消息的等待消费者的数量。所述表项中存储的记录可以由生产者
和消费者进行互斥地查询和修改。
釆用B Q S时,本发明实施例的 一 种消息的读写方法如图2所示,
首先将消息从生产者发送到消息队列,然后根据所述消息的类型,查 询是否有对应的消费者,如果有,则唤醒所述对应的消费者中的一个 消费者,最后被唤醒的消费者读取所述消息。参照图2,本实施例包 括以下步骤
步骤s201,消费者加入等待队列。其加入过程包括以下步骤 步骤s2011,根据需读取消息的类型,查询消息同步表,如果所 述消息同步表中没有与所述需读取消息的类型对应的记录,则转步骤 s2012;否则转步骤s2013。本实施例中假设该消费者需读取type类型的消息,则调用MsgQueSynTbl—Alloc(type)对消息同步表进行查询。步骤s2012,在所述消息同步表中建立消息同步表记录,并对所述记录进行初始化,然后转步骤s2014。所述对记录进行初始化具体包括将所述记录的消息类型设置为所述需读取消息的类型,即设置mtype=type;将所述记录的等待消费者的数量设置为1,即设置count=l。
步骤s2013,将所述记录中等待消费者的数量加1,即执行count++。
步骤s2014,获取所述记录的下标MsgQueSynTblIndex。
步骤s2015,对BQS核心资源进行信号灯V操作,使得其他应用进程或线程能够访问BQS。所述BQS核心资源由消息的实体数据区、链式索引数据区及消息同步表共同构成。所述V操作是不可中断的程序段,称为V原语。V原语操作的动作为首先信号量sem加l;然后若信号量sem加l后大于零,则进程继续执行;若信号量sem加1后小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
步骤s2016,根据所述记录的下标MsgQueSynTblIndex,获取与
所述下标对应的消息同步信号灯。
步骤s2017,对所述消息同步信号灯进行P操作,即调用T—Mutex—SemP ( MsgQueSynTblIndex),等待消息到达的信号唤醒。所述P操作是不可中断的程序段,称为P原语。P原语操作的动作为首先信号量sem减l;然后若信号量sem减1后仍大于或等于零,则进程继续执行;若sem减l后小于零,则该进程被阻塞后进入与该信号相对应的队列中,转进程调度。
步骤s202,将消息从生产者发送到消息队列。首先对BQS核心资源进行信号灯P操作,使得所有使用BQS的应用进程或线程达到同步;然后,将消息类型为type的消息从该生产者发送到指定的消
10息队列中。
步骤S203,根据消息的类型,查询是否有对应的消费者。如果有,
则转步骤s204,否则对BQS核心资源进行信号灯V操作,返回O并结東。其查询过程为根据所述消息的类型type ,调用GetMsgQueSynldxByMType (type),查询消息同步表,如果所述消息同步表中存在与type类型的记录,则确认有对应的消费者;否则没有对应的消费者。
步骤s204,唤醒所述对应的消费者中的一个消费者。其唤醒过程具体包括首先,获取与所述消息的类型type对应的记录的下标MsgQueSynTblIndex;然后,如果所述记录的等待消费者的数量大于0,则根据所述记录的下标MsgQueSynTblIndex,获取与所述下标对应的消息同步信号灯;调用T—Mutex_SemV(MsgQueSynTblIndex),对所述消息同步信号灯进行V操作,唤醒等待接收type类型消息的消费者,并将所述记录中等待消费者的数量减1。再对BQS核心资源进行信号灯V操作,使得其他应用进程或线程能够访问BQS,消息写入成功后返回0。如果有多个消费者等待接收type类型的消息,当写入消息后,进行同步表信号灯V操作,此时只有一个消费者被唤醒,其他消费者仍然处于信号灯睡眠状态,不会因为一个消息的到达,造成各个消费者对系统CPU资源的占用。而对被唤醒消费者的选择,则根据操作系统的信号灯实现而定,且对多个接收type类型消息的消费者来说,各个消费者能够取得该消息的机会是均等的。
步骤s205,对消息同步记录进行清理。首先,对BQS核心资源进行信号灯P操作,使得所有使用BQS的应用进程或线程达到同步的效果;然后,判断所述等待消费者的数量是否为O,如果是,则清除所述记录;最后,对BQS核心资源进行信号灯V操作,使得其他应用进程或线程能够访问BQS。
步骤s206,将所述消息发送给所述被唤醒的消费者。其发送过程
ii包括以下步骤
步骤s2061,根据消息类型type,在消息队列中进行查询,如果查询到所述消息队列中有类型为type的消息,则转步骤s2062;否则转步骤s2064。
步骤s2062,将所述消息从所述消息队列发送到所述被唤醒的消费者。
步骤s2063,对BQS核心资源进行信号灯V操作,使得其他应用进程或线程能够访问BQS,返回消息体的长度并结東。
步骤s2064,判断读取消息的标志是否为NO—WAIT,如果是,则返回-1并结東;否则进行加入等待队列的操作。
在进行步骤s206时,如果在此段时间内,没有将消息类型为type的消息发送给其他消费者,则该消息类型为type的消息一定能够发送到该消费者;如果消息类型为type的消息被发送到该消费者前,全部被发送到其他消费者,则仍然没有消息类型为type的消息被发送到该消费者,该消费者处于饥饿状态,继续进行加入等待队列的操作。
当多个消费者等待同一种类型的消息时,例如消费者l、消费者2和消费者n都在等待类型为mtype—1的消息,该消息类型mtype—1在消息同步表中分配到idpO表项;如果有三个生产者将产生的消息发送到消息队列,其中生产者1和生产者2都发送了类型为mtype_ 1的消息,生产者n发送了类型为mtype_2的消息。本发明实施例的 一 种消息的读写流程包括以下步骤
步骤s301,消费者l等待消息时,以消息类型mtype一l从消息同步表中分配到idxi表项,也就拥有了BQS消息信号灯的第idx^项的使用权,并进行T—Mutex—SemP操作。
步骤s302,消费者2等待消息时,以消息类型mtype—l从消息同步表中检索到idFO表项,同样拥有了 BQS消息信号灯的第idFO项的使用权,并进行T一Mutex—SemP操作。
12步骤s303,消费者n等待消息时,以消息类型mtype一l从消息同步表中检索到icb^0表项,同样拥有了 BQS消息信号灯的第idx:0项的使用权,并进行T—Mutex—SemP操作。
步骤s304,生产者l将消息写入消息队列后,检索到类型mtype—1已经有消费者等待接收,也就拥有了 B Q S消息信号灯的第idx=0项的使用权,并进行T—Mutex—SemV操作。此时,消费者l、消费者2和消费者n中的一个消费者被唤醒,取得消息。
步骤s305,生产者2将消息写入消息队列后,检索到类型mtype—1已经有消费者等待接收,也就拥有了BQS消息信号灯的第icb^O项的使用权,并进行T一Mutex一SemV操作。此时,剩余的消费者中的一个
消费者被唤醒,取得消息。
步骤s306,生产者n将消息写入消息队列后,检索到类型mtype—2
未有消费者等待接收,操作结東。
经过上述过程后,消费者中的最后 一个仍然处于接收等待状态;消息队列中有 一 条类型为mtype_2的消息。
当多个消费者等待不同类型的消息时,例如消费者l等待类型为mtype—l的消息,消费者2等待类型为mtype—2的消息,消费者n等待类型为mtype—n的消息,该消息类型mtype—1在消息同步表中分配到idx二0表项,该消息类型mtype一2在消息同步表中分配至ijidx^表项,该消息类型mtype一n在消息同步表中分配到idx-2表项;如果有三个生产者将产生的消息发送到消息队列,其中生产者l发送了类型为mtype一l的消息,生产者2发送了类型为mtype—2的消息,生产者n发送了类型为mtyp^n的消息。本发明实施例的 一种消息的读写流程包括以下步骤
步骤s401,消费者l等待消息时,以消息类型mtype一l从消息同步表中分配到icb^O表项,也就拥有了 BQS消息信号灯的第idFO项的使步骤s402,消费者2等待消息时,以消息类型mtype—2从消息同步 表中分配到i(b^l表项,也就拥有了 BQS消息信号灯的第idx^项的使 用权,并进行T一Mutex—SemP操作。
步骤s403,消费者n等待消息时,以消息类型mtype—n从消息同步 表中分配到idx-2表项,也就拥有了 BQS消息信号灯的第icb^2项的使 用权,并进行T—Mutex—SemP操作。
步骤s404,生产者l将消息写入消息队列后,检索到类型mtype—1 已经有消费者等待接收,也就拥有了BQS消息信号灯的第idx-O项的 使用权,并进行T一Mutex—SemV操作。此时,消费者l被唤醒,取得 消息。
步骤s405,生产者2将消息写入消息队列后,检索到类型mtype—2 已经有消费者等待接收,也就拥有了 BQS消息信号灯的第idx^项的 使用权,并进行T一Mutex一SemV搡作。此时,消费者2被唤醒,取得 消息。
步骤s406,生产者n将消息写入消息队列后,检索到类型mtype一n 已经有消费者等待接收,也就拥有了 B Q S消息信号灯的第i dx=2项的 使用权,并进行T—Mutex一SemV搡作。此时,消费者n被唤醒,取得 消息。
经过上述过程后,所有的消费者都已经取得消息,消息队列中无 任何消息。
本发明实施例通过生产者根据消息的类型,在消息同步表中查询 有对应的消费者,并唤醒其中的一个消费者的方法,使得消费者不会 被无谓唤醒,从而节省了CPU时间。
本发明实施例的一种消息的读写装置,包括发送装置,用于将 消息从生产者发送到消息队列;查询装置,用于根据所述消息的类型, 查询消息同步表,如果所述消息同步表中存在与所述消息的类型对应 的记录,则确认有对应的消费者;唤醒装置,当有对应的消费者时,
14唤醒所述对应的消费者中的 一个消费者;将所述消息发送给所述被唤
醒的消费者的装置;信号灯集建立单元,用于建立消息同步信号灯集; 消息同步表建立单元,用于建立消息同步表,所述消息同步表中表项 的数量与所述消息同步信号灯集中的消息同步信号灯的数量相同;消 息同步表初始化单元,用于对所述消息同步表进行初始化。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解 到本发明可借助软件加必需的通用硬件平台的方式来实现,因此,本 发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软 件产品的形式体现出来,该计算机软件产品存储在一个存储介质中, 包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器, 或者网络设备等)执行本发明各个实施例所述的方法。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领 域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以 做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
权利要求
1、一种消息的读写方法,其特征在于,包括以下步骤将消息从生产者发送到消息队列的步骤;根据所述消息的类型,查询消息同步表,如果所述消息同步表中存在与所述消息的类型对应的记录,则确认有对应的消费者的步骤;当有对应的消费者时,唤醒所述对应的消费者中的一个消费者的步骤;将所述消息发送给所述被唤醒的消费者的步骤。
2、 如权利要求1所述消息的读写方法,其特征在于,在所述唤 醒对应的消费者中的一个消费者的步骤中,具体包括获取与所述消息的类型对应的记录的下标;如果所述记录的等待消费者的数量大于O,则获取与所述下标对 应的消息同步信号灯,对所述消息同步信号灯进行V操作,并将所 述记录中等待消费者的数量减1。
3、 如权利要求1所述消息的读写方法,其特征在于,在所述查 询消息同步表之前,还包括消费者加入等待队列的步骤,该消费者加 入等待队列的步骤具体包括根据需读取消息的类型,查询所述消息同步表,如果所述消息同 步表中存在与所述需读取消息的类型对应的记录,则将所述记录中等 待消费者的数量加i;获取与所述需读取消息的类型对应的记录的下标;获取与所述下标对应的消息同步信号灯;对所述消息同步信号灯进行P操作。
4、 如权利要求l所述消息的读写方法,其特征在于,在所述查 询消息同步表之前,还包括消费者建立消息同步表记录并加入等待队 列的步骤,该消费者建立消息同步表记录并加入等待队列的步骤具体 包括根据需读取消息的类型,查询所述消息同步表,如果所述消息同 步表中没有与所述需读取消息的类型对应的记录,则在所述消息同步 表中建立消息同步表记录,并对所述记录进行初始化;获取所述记录的下标;获取与所述下标对应的消息同步信号灯;对所述消息同步信号灯进行p操作。
5、 如权利要求4所述消息的读写方法,其特征在于,所述对记录进行初始化具体包括将所述记录的消息类型设置为所述需读取消息的类型;将所述记录的等待消费者的数量设置为1。
6、 如权利要求1所述消息的读写方法,其特征在于,在所述被 唤醒的消费者读取消息之前,还包括如下步骤判断所述等待消费者的数量是否为0,如果是,则清除所述记录。
7、 如权利要求1至6任一项所述消息的读写方法,其特征在于, 在所述生产者查询消息同步表之前,还包括如下步骤建立消息同步信号灯集;建立消息同步表,所述消息同步表中表项的数量与所述消息同步 信号灯集中的消息同步信号灯的数量相同;对所述消息同步表进行初始化。
8、 如权利要求7所述消息的读写方法,其特征在于,所述对消 息同步表进行初始化具体包括将所述消息同步表的消息类型设置为-1; 将所述消息同步表的记录的数量设置为o。
9、 一种消息的读写装置,其特征在于,包括 发送装置,用于将消息从生产者发送到消息队列;查询装置,用于根据所述消息的类型,查询消息同步表,如果所 述消息同步表中存在与所述消息的类型对应的记录,则确认有对应的消费者;唤醒装置,当有对应的消费者时,唤醒所述对应的消费者中的一 个消费者;将所述消息发送给所述被唤醒的消费者的装置。
10、如权利要求9所述消息的读写装置,其特征在于,所述消息 的读写装置还包括信号灯集建立单元,用于建立消息同步信号灯集;消息同步表建立单元,用于建立消息同步表,所述消息同步表中 表项的数量与所述消息同步信号灯集中的消息同步信号灯的数量相同;消息同步表初始化单元,用于对所述消息同步表进行初始化。
全文摘要
本发明公开了一种消息的读写方法,包括将消息从生产者发送到消息队列的步骤;根据所述消息的类型,查询消息同步表,如果所述消息同步表中存在与所述消息的类型对应的记录,则确认有对应的消费者的步骤;当有对应的消费者时,唤醒所述对应的消费者中的一个消费者的步骤;将所述消息发送给所述被唤醒的消费者的步骤。本发明还公开了一种消息的读写装置,包括发送装置、查询装置、唤醒装置和将所述消息发送给所述被唤醒的消费者的装置。本发明通过生产者根据消息的类型,在消息同步表中查询有对应的消费者,并唤醒其中的一个消费者的方法,使得消费者不会被无谓唤醒,从而节省了CPU时间。
文档编号G06F9/46GK101470636SQ20071030441
公开日2009年7月1日 申请日期2007年12月27日 优先权日2007年12月27日
发明者宇 任, 朱律玮, 强 邹, 马新群 申请人:北京东方通科技发展有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1