具有事务能力的排队的制作方法

文档序号:6540823阅读:192来源:国知局
具有事务能力的排队的制作方法
【专利摘要】本发明提供一种用于具有事务能力的排队的方法和系统。该方法可以包括:提供具有有序消息列表的队列;在队列内提供取出光标操作以指向用于取出应用开始搜寻要取回的消息的当前开始位置;如果存在多于一个放入应用则提供用于放入操作的第一锁以保证一次仅一个应用正在向队列放入;如果存在多于一个取出应用则提供用于取出操作的第二锁以保证一次仅一个应用正在从队列取出;并且在放入与取出应用之间进行同步以检查并更新取出光标操作。
【专利说明】具有事务能力的排队

【技术领域】
[0001] 本发明涉及在计算机系统中排队的领域。具体而言,本发明涉及具有事务能力的 排队。

【背景技术】
[0002] 消息队列在计算中是广泛使用的概念。具体而言,在消息接发中间件中,队列可以 用来缓冲在应用之间发送的消息。这些队列的性能经常对于系统作为整体的性能是关键 的;因此,许多研究已经投入到创建高效实现方式中。
[0003] 如果系统需要严格FIFO (先入先出)队列,则存在写入无锁/无等待队列的大量 方式,该队列将缩放至同时向这样的队列放入和从这样的队列取出消息的大量应用。这样 的设计的缺点是它们往往复杂并且在其中有向队列放入消息的单个应用和从队列取出消 息的单个应用的情况下比更简单队列更慢。这样的算法通常依赖于用于执行原子操作、t匕 如比较和交换(CAS)(稍后讨论)的能力。这些原子操作通常是单个机器指令并且在常规意 义上未视为锁。
[0004] 严格fifo队列经常是不够的,例如jms (Java?消息服务)要求队列支持事务,从 而可以在两级中向队列放入/从队列取出(多个)消息。首先放入/取出消息,然后(潜在地 作为组)提交消息或者代之以取消所有放入/取出,这称为回滚。为了保留消息顺序(并且 为了简化应当快速且不应失败的提交操作),事务的实现经常涉及到将事务中涉及到的消 息留在队列上、但是在"锁"状态中,从而它们不能被其它应用所访问。以这一方式实施事 务的队列不再FIFO ;可以锁在队列的头部/尾部的消息,并且可用于取回的第一消息可以 实际上在消息列表的中间。Java和所有基于Java的商标和标志是Oracle和/或它的隶属 机构的商标或者注册商标。
[0005] 就目前已知,不存在对于这一类型的非FIFO队列工作的无锁算法。
[0006] 已知"两锁"FIFO队列,该队列允许应用得以向队列放入并且不同应用同时可以 取出,从而消息可以经过队列高效地用流发送。如果多个应用有可能需要同时放入(或者取 出),则放入(或者取出)权由时钟序列化(因此两个锁是放入锁和取出锁)。Herb Sutter在 http://www. ddj. com/cpp/211601363提供如何可以实施两锁队列的说明。
[0007] 在两锁FIFO队列中,无串行化出现于放入器与取出器之间--取出器无论放入器 正在做什么都总是取出在队列上的第一消息。在提到的非FIFO的支持事务的队列中,不可 能有这样的隔离。取出应用需要高效地找到待取出的消息,并且如果放入应用在放入应用 正在检查的在队列中的位置"之前"提交消息,则取出器必须代之以发现该消息。
[0008] 支持事务为原子,这意味着如果在单个事务中提交向队列放入的两个消息,则必 须先取出先放入的消息。这强调需要在放入器与取出器之间的高效通信。如果取出器只是 逐个检查在队列上的消息,在它在事务中发现第一消息时,它可能仍然被锁,但是到这时第 二消息被检查(如果提交已经出现),继而该消息可以为可用,并且可能从队列取出错误消 肩、。
[0009] 因此,在本领域中需要解决前述问题。


【发明内容】

[0010] 根据本发明的第一方面,提供一种用于具有事务能力的排队的方法,该方法包括: 提供具有有序消息列表的队列;在队列内提供取出光标操作,以指向用于取出应用开始搜 寻要取回的消息的当前开始位置;如果存在多于一个放入应用,则提供用于放入操作的第 一锁以保证一次仅一个应用正在向队列放入;如果存在多于一个取出应用,则提供用于取 出操作的第二锁以保证一次仅一个应用正在从队列取出;在放入与取出应用之间进行同 步,以检查并更新取出光标操作。
[0011] 该方法可以包括放入应用在它提交比光标的当前位置更早的消息时使用用于倒 回光标的指令。该方法可以包括取出应用使用用于向前移动光标的指令。
[0012] 取出光标操作可以包括由用于同步的原子指令使用的一个或者两个存储器字。
[0013] 在一个实施例中,队列可以是单链接列表,并且可以通过对在队列上的每个消息 进行编号来提供有序消息列表。取出光标操作可以使用:指向搜索应当在队列上开始的消 息的指针;以及在队列上的消息的顺序编号。同步可以使用双宽度比较和交换(DWCAS)操 作,并且取得光标操作包括用于指针的两个存储器字和消息的顺序编号。
[0014] 在另一实施例中,队列可以是以索引充当指针和顺序编号二者的数据结构;并且 取出光标操作可以指向数据结构的索引。同步可以使用比较和交换CAS操作,并且取出光 标操作包括用于索引的一个存储器字。
[0015] 同步可以备选地使用对取出光标操作的锁。
[0016] 如果存在单个放入应用,则可以不提供第一锁;如果存在单个取出应用,则可以不 提供第二锁;并且在这些情况下,同步可以围绕取出光标操作。
[0017] 该方法可以包括提供虚消息以防止空队列。
[0018] 该方法也可以包括提供最大顺序编号以指示不存在用于取出应用取回的有效消 息并且新放入设置光标以指向它。
[0019] 第一锁和第二锁可以将用于在事务中涉及到的每个队列的消息锁定达提交或者 回滚的持续时间。
[0020] 第一锁和第二锁可以由在消息中设置的标志提供,以指示它可用或者是事务的一 部分。备选地,第一锁和第二锁可以由代表事务而维护被锁定的消息的列表的锁管理器提 供。
[0021] 根据本发明的第二方面,提供一种用于具有事务能力的排队的系统,该系统包括: 具有有序消息列表的队列;在队列内用于操作的取出光标,用于指向用于取出应用开始搜 寻要取回的消息的当前开始位置;用于放入操作的第一锁,用于如果存在多于一个放入应 用则保证一次仅一个应用正在向队列放入;用于取出操作的第二锁,用于如果存在多于一 个取出应用则保证一次仅一个应用正在从队列取出;同步器机制,用于在放入与取出应用 之间进行同步以检查和更新取出光标操作。
[0022] 放入应用可以包括在它提交比光标的当前位置更早的消息时用于倒回光标的指 令。取出应用可以包括用于向前移动光标的指令。
[0023] 取出光标部件可以包括由用于同步的原子指令使用的一个或者两个存储器字。备 选地,取出光标部件可以包括用于同步的取出光标锁。
[0024] 在一个实施例中,队列是单链接列表,并且通过对在队列上的每个消息进行编号 来提供有序消息列表;并且其中同步机制包括双宽度比较和交换(DWCAS)操作,并且取得 光标部件包括用于指针的两个存储器字和消息的顺序编号。
[0025] 在另一实施例中,队列是以索引充当指针和顺序编号二者的数据结构;并且其中 同步使用比较和交换(CAS)操作,并且取出光标部件将一个存储器字用于索引。
[0026] 根据本发明的第三方面,提供一种用于具有事务能力的排队的计算机程序产品, 该计算机程序产品包括:计算机可读存储介质,可由处理电路读取并且存储指令,指令用于 由处理电路执行用于执行根据本发明的第一方面的方法。
[0027] 根据本发明的第四方面,提供一种在计算机可读介质上存储并且可向数字计算机 的内部存储器中加载的计算机程序,该计算机程序包括软件代码部分,当所述程序在计算 机上被运行时,该软件代码部分用于执行本发明的第一方面的方法。
[0028] 根据本发明的第五方面,提供一种基本上如参照附图描述的方法。
[0029] 根据本发明的第六方面,提供一种基本上如参照附图描述的系统。
[0030] 本发明的描述的方面提供实现具有事务能力的排队这样的优点。

【专利附图】

【附图说明】
[0031] 在说明书的结论部分中具体指出并且明确要求保护了被视为本发明的主题内容。 本发明关于组织和操作方法二者及其目的、特征和优点可以通过参照在与附图阅读时的以 下具体描述来最好地理解。
[0032] 现在将参照以下附图仅通过示例描述本发明的优选实施例,在附图中:
[0033] 图1是根据本发明的一个优选实施例的方法的一个示例实施例的流程图;
[0034] 图2是根据本发明的一个优选实施例的系统的一个示例实施例的框图;
[0035] 图3是根据现有技术的并且可以在其中实施本发明的一个优选实施例的计算机 系统的一个实施例的框图;
[0036] 图4是根据本发明的一个优选实施例的方法的一个方面的一个示例实施例的流 程图;并且
[0037] 图5是根据本发明的一个优选实施例的方法的一个方面的一个示例实施例的流 程图。

【具体实施方式】
[0038] 将理解为了图示简化和清楚,在附图中示出的单元未必按比例绘制。例如单元中 的一些单元的维度可以相对于其它单元而夸大以求清楚。另外,在视为适当时,可以在附图 之中重复标号以指示对应或者类似特征。
[0039] 在以下具体描述中,阐述许多具体细节以便提供本发明的透彻理解。然而本领域 技术人员将理解无这些具体细节仍然可以实现本发明。在其它实例中,尚未具体描述熟知 的方法、过程和部件以免模糊本发明。
[0040] 提供用于实施支持事务的两锁队列的方法和系统。它要求在放入器与取出器之间 的一些同步,并且这可以使用比较和交换(CAS)或者双宽度比较和交换(DWCAS)或者备选 地使用另一锁来高效地实现。CAS是在多线程处理中使用以实现同步的原子指令,它比较存 储器位置的内容与给定的值,并且仅在它们相同时将该存储器位置的内容修改为给定的新 值。DWCAS是一种如果在两个相邻存储器字中的现有值如程序所预计的那样,则允许更新那 些位置为新值的常见技术。这意味着在放入器与取出器之间的通信可以通过这一单个指令 的少量调用来实施。
[0041] 参照图1,流程图100示出描述的方法的一个示例实施例。可以提供101具有有序 消息列表的队列。例如队列可以是有序消息列表的单链接列表,这可以由在队列上的每个 消息的编号提供。在另一示例中,队列可以是以索引充当顺序编号的数据结构。
[0042] 可以在队列内提供102光标以指向用于取出应用的当前开始位置。光标可以包括 指向在队列上的消息的指针和在队列上的消息的顺序编号或者可以指向数据结构的索引。
[0043] 可以提供103用于放入操作的第一锁,以保证一次仅一个应用正在向队列放入。 可以提供104用于取出操作的第二锁以保证一次仅一个应用正在从队列取出。
[0044] 如果仅存在单个放入应用,则无需放入锁(因此,队列可以仅有单个取出锁)。如果 仅有单个取出应用,则不要求取出锁,从而队列可以无锁或者取决于其正在如何被使用而 具有放入锁和/或取出锁。
[0045] 可以在放入与取出应用之间提供105同步以检查和更新取出光标操作。同步可以 通过原子操作、比如CAS或者DWCAS或者如以下更具体说明的那样通过对光标的锁来执行。
[0046] 参照图2,示意框图200示出描述的系统的示例。
[0047] 可以提供支持事务处理的队列210。队列2100可以具有在队列210中的排序的 消息201-206。在一个实施例中,这可以是消息在它放在队列上时的"orderld (顺序Id)" (例如始于1并且依次增加),从而更低编号对应于更早放入的消息。
[0048] 队列210可以包括指向队列的头部的指针和指向队列的尾部的指针,该头部将具 有仍然在队列上的最旧消息,该尾部将具有最新近添加的消息。
[0049] 提供与在队列中的如下位置对应的取出光标部件211,取出应用应当在该位置开 始搜寻待取回的消息。光标可以指向在队列210中的消息204,该消息标记用于取出应用开 始搜寻待取回的消息的当前开始位置。在一个实施例中,取出光标部件可以使用两个存储 器字--一个字是指向在队列上的搜索应当在其开始的消息的指针,而另一个字包含消息 的 orderId〇
[0050] -个或者多个放入应用221-223可以向队列210放入,并且一个或者多个取出应 用231-233可以从队列210取出。
[0051] 可以提供用于放入应用的第一锁220以保证一次仅一个应用正在向队列放入。可 以提供用于取出应用的第二锁230以保证一次仅一个应用正在从队列取出。如果仅存在单 个放入应用,则可以不要求第一锁220 (因此队列可以仅有单个取出锁)。如果仅存在单个 取出应用,则可以不要求第二锁230,从而队列可以无锁或者取决于其正在如何被而具有放 入锁和/或取出锁。
[0052] 可以提供同步器机制240用于在放入与取出应用221-223、231-233之间同步以检 查和更新取出光标部件211。同步器机制240可以使用原子操作、比如CAS或者DWCAS用于 在放入与取出应用之间的通信。备选地,可以使用光标锁。
[0053] 参照图3,用于实施本发明的方面的示例系统包括适合于存储和/或执行程序代 码的数据处理系统300,该数据处理系统包括通过总线系统303直接或者间接耦合到存储 器单元的至少一个处理器301。存储器单元可以包括在实际执行程序代码期间运用的本地 存储器、体存储装置和高速缓冲存储器,这些高速缓冲存储器提供对至少一些程序代码的 暂时存储以便减少必须在执行期间从体存储装置取回代码的次数。
[0054] 存储器单元可以包括形式为只读存储器(R0M)304和随机存取存储器(RAM)305的 系统存储器302。基本输入/输出系统(BIOS) 306可以存储于R0M304中。包括操作系统 软件308的系统软件307可以存储于RAM305中。软件应用310也可以存储于RAM305中。
[0055] 系统300也可以包括主存储装置311、比如磁硬盘驱动以及次存储装置312、比如 磁盘驱动和光盘驱动。驱动和它们的关联计算机可读介质提供对用于系统300的计算机可 执行指令、数据结构、程序模块和其它数据的非易失性存储。软件应用可以存储于主存储装 置311和次存储装置312以及系统存储器302上。
[0056] 计算系统300可以使用经由网络适配器316的与一个或者多个远程计算机的逻辑 连接在联网环境中操作。
[0057] 输入/输出设备313可以直接或者通过居间I/O控制器耦合到系统。用户可以通 过输入设备、比如键盘、指示设备或者其它输入设备(例如麦克风、操纵杆、游戏板、卫星盘、 扫描仪等)向系统300中录入命令和信息。输出设备可以包括扬声器、打印机等。显示设备 314也经由接口、比如视频适配器315连接到系统总线303。
[0058] 现在描述用于具有事务能力的排队的描述的方法的实现的进一步细节。该方法包 括提供队列,其中队列可以包括与用于"取出应用"开始搜寻待取回的消息的开始位置对应 的"取出光标"机制。可以提供用于放入的第一锁,并且可以提供用于取出的第二锁。
[0059] 在第一实施例中,队列可以由在存储器中不连续的消息构建。这可以被设想为单 链接列表,其中每个消息保护指向后续消息的指针,但是底层数据结构可以更复杂,例如消 息可以被分组成"页",并且每个消息页可以具有指向下一页的指针。可以执行对在队列上 的每个消息的编号(=〇rderId),其中更低编号对应于更早放入的消息。
[0060] 在这一实施例中,在第一锁与第二锁之间同步(通信)可以使用双宽度比较和交换 (DWCAS)操作。如果放入应用提交比光标更早的消息则它可以使用DWCAS指令以倒回光标。 取出应用可以使用DWCAS指令以向前移动光标。
[0061] 在这一实施例中,取出光标包括:指向在队列上的其中搜索应当开始的消息的指 针;以及消息的"orderld"。
[0062] 在第二实施例中,队列也可以用于数据结构、比如数组,其中在数组中的索引可以 充当指向消息的"指针"和它的orderld二者,但是在该情况下将使用CAS而不是DWCAS。 [0063] 没有提供如何向列表添加消息/从列表去除消息的细节,因为这在本领域中已 知--在单链接列表示例中,这些是无关紧要的操作。
[0064] 处理器使用64位字是常见的。这意味着由单个字构成的"orderld"将允许接近 2~64=1. 8xl(Tl9个消息("接近2~64",因为将保留至少1个"orderld"作为特别值)。如 果每秒向队列添加1百万个消息,则"orderld"卷绕(wrap)将需要多于500, 000年。这意 味着除非在高到难以置信的速率使用这样的队列,否则"orderld"就不可能在实践中卷绕。 如果无需考虑它,由于"orderld"对于头部和尾部消息是已知的,则有可能检测这样的卷 包(warpping),并且可以增强用于判决"orderld"是否比另一个"更早"的代码以考虑这一 点。然而由于它是这种不频繁事件,所以将几乎确信地的是保持正常代码简单/高效、并且 将卷包作为特殊情况来处理、并且暂时禁用队列并对每个消息重新编号会更好。
[0065] 处理空队列可能在两锁队列中略微复杂。一种如何解决这一点的解决方案是从未 具有空队列。在队列创建时,可以创建虚节点,并且头部+尾部+getCursor (取出光标)可 以都指向它。如果取出器认为它可以正在取出最后节点,则它并不取出它并且代之以标记 它为虚节点(du_y),并且在之后再次推进头部时取出虚节点。
[0066] 用于"orderld"的最大值(此后为OrderId_Max)可以用来指不getCursor点"经 过队列的尾部"(即没有用于取出器取回的有效消息),从而新的放入将设置光标以指向它。 [0067] 现在提供如何对队列执行各种操作的描述。在这一描述中,假设每个消息包含标 志,该标志表示它是否可用或者当前是事务的一部分。这足以用于完全原子事务,消息将变 成一次一个可用,不能按照如下顺序取回消息,该顺序示出提交不是原子的,但是仍然存在 问题。例如考虑包含两个放入的事务,对于真正原子事务,消息应当同时可用,但是利用所 描述的方案,用户可以辨别并非是这种情况。想象在非常快的一连串中从队列的三个取出, 第一取出可以取出放入的第一消息,而第二取出可能在事务中放入的第二消息被标记为可 用(并且消息将最终被第三取出而取回)之前出现。对于真正的原子操作而言,在示例中的 第二取出不应当失败。一旦已经将操作描述为具有这一限制,将讨论可以解决这一限制的 解决方案。
[0068] 在许多现代系统上,可能需要存储器屏障以便保证操作(向系统的其它部分)表现 为按照正确顺序发生。未描述这些屏障,因为它们将根据架构变化,本领域技术人员将能够 推断在他们熟悉的架构上何处需要屏障。
[0069] 参照图4,流程图400示出从队列取出的操作的一个示例实施例。
[0070] 如果取出锁存在,则该方法可以通过取得401它来开始。如果仅曾经从队列取出 一个应用,则不要求取出锁。仅如果两个应用可能试图并且在重叠时间从相同队列取出,则 要求取出锁。
[0071] 可以记录402getCursor的当前值为"开始位置"。
[0072] 可以确定403开始点是否为"OrderId_Max",在该情况下,在队列上无适当消息 412,可以解锁413getCursor (如果它存在),并且该过程可以结束414。"OrderId_Max"是 用于getCursor的orderld部分的最大可能值-它从未指示消息的有效位置,所有有效 消息被视为在它"之前"。
[0073] 然而如果起始点不是"OrderlcLMax",则考虑"开始位置"引用的消息,从而该方法 试图锁404消息。
[0074] 可以确定405消息是否被锁。如果它没有被锁,则可以设置406getCursor为 "0rderId_Max",并且该过程可以沿着队列扫描407从而尝试锁消息。可以确定408适当消 息是否被锁。如果是这样,则尝试更新getCursor为在被锁消息之后的消息或者如果无下 一消息则为 "〇rderId_Max"。
[0075] 可以确定410更新是否成功。如果确实成功,则该过程具有消息并且更新 getCursor411。可以解锁413getCursor (如果它存在),并且该过程可以结束414。
[0076] 回到步骤405,如果消息被锁,贝U过程可以试图更新415getCursor为下一消息或 者如果无下一消息则为"OrderlcLMax"。该过程然后可以前进至步骤410并且如以上描述 的那样继续。
[0077] 在步骤410,如果更新没有成功,则可以倒回417getCursor,因为没有要取出的更 早消息。可以解锁416被锁定的消息,并且该过程可以往回循环以让开始位置等于当前 getCursor402〇
[0078] 图4的过程指代"锁定"消息,这可以指代如查看在消息中的标志是否被设置用于 指示消息正在使用中(即当前向队列放入或者从队列取出)、并且如果标志未被设置则对它 进行设置一样简单的事情。它也可以指代如以下进一步描述的那样通过锁管理器来锁定消 肩、。
[0079] 在步骤409接近于该过程的结束,该过程尝试更新getCursor并且在关于它是 否成功时分叉。如果已经被锁定的消息的orderld少于(或者等于)getCursor的当前 orderld,则代码可以进行更新。如果getCursor的orderld少于已经锁的消息,贝U更新不 应改变getCursor,并且更新被视为尚未成功。检查和更新是算法的可以通过DWCAS操作来 执行的算法的一部分。
[0080] 有可能通过具有额外"取出光标锁"来进行更新而不使用DWCAS (例如因为处理器 并不支持它),该"取出光标锁"保护对getCursor的更新。取出和放入应用二者将需要占 用锁,并且锁争用可能减缓队列的操作。
[0081] 可以执行提交取出的操作如下。
[0082] 可以已经标记所有消息不可用,因此或者依次标记消息为删除(并且偶尔无用单 元回收所有删除的消息),或者从列表去除它们。根据用于列表的数据结构,这可能要求取 出锁,但是应当指出,如果在队列的开始有都适合于去除的消息并且getCursor未指向它 们,则取出器将从未查看这些消息(不应向它们中倒回光标),因此对于单链接列表结构,可 以去除它们而无取出锁。
[0083] 可以执行用于回滚取出的操作如下。
[0084] 对于在事务中取出的每个消息,按照递增orderld的顺序:
[0085] 标记消息可用。
[0086] 如果getCursor在消息位置之后,则例如使用DWCAS来同步倒回getCursor。
[0087] 参照图5,流程图500示出向队列放入消息的操作的一个示例实施例。
[0088] 可以预备501消息用于放入(例如分配它所必需的任何存储器/如果不能使用放 入器提供的副本则复制消息等),并且可以在这一级标记消息为事务的一部分。
[0089] 如果放入锁存在则可以占用502它。
[0090] 可以向消息指派503下一 orderld顺序编号,并且可以增加用于下一消息的下一 orderld。
[0091] 可以向消息列表添加504消息。在单连接列表的实施例中,这意味着设置在列表 的尾部的消息的"下一"指针以指向新消息。
[0092] 可以设置505用于队列的尾部指针以指向新消息。
[0093] 可以释放506放入锁(如果它存在),并且可以记录这一消息被放入作为事务的一 部分用于在提交/回滚中使用。
[0094] 可以执行用于提交放入的操作如下。
[0095] 对于在事务中的每个消息放入,按照增加 orderld的顺序(即放入消息的顺序):
[0096] 标记消息为可用。
[0097] 如果getCursor在消息位置之后,用DWCAS倒回getCursor。
[0098] 可以执行用于回滚放入的操作如下。
[0099] 可以已经标记所有消息不可用,因此或者依次标记它们为删除(并且偶尔无用单 元回收所有删除的消息),或者从列表去除它们。从列表去除它们根据用于列表的数据结构 可能要求取出锁。然而应当指出如果在队列的开始有都适合于去除的消息并且getCursor 未指向它们,则取出器将从未查看这些消息(不能向它们中倒回光标),因此对于单链接列 表结构,可以去除它们而无取出锁。
[0100] 注意在回滚/提交放入与提交/回滚取出之间的对称性。事务可以包含放入和取 出二者,并且应当对于在事务中的每个操作执行以上描述的适当动作。相似地,系统可以包 含许多队列(和与这些队列无关的其它操作),并且适当提交/回滚动作应当适用于每个与 队列有关的操作的相关队列。
[0101] 如更早提到的那样,重复的取出可以示出以上方案并未实施原子事务。使用快速、 重复的取出操作,如果该方法仅在假设可用的放入的每个消息上依次设置标志,则可以有 可能断定并未原子地添加在事务中完成的向队列的放入。因此,用于使队列表现为原子的 最简单方式是在放入的提交/回滚正在出现之时(即在每个消息中的标志一个接一个地正 在被设置成可用之时)取得取出锁。如果提交放入的应用具有取出锁,则这排除任何其它应 用完成迅速重复的取出,这将示出消息并未都同时出现。
[0102] 它具有性能影响,因为在提交放入之时暂停所有取出。也如果同时提交两个事务 并且它们均试图取得在涉及到的所有队列中的取出锁,则除非按照相同顺序取得取出锁, 则两个提交器可以结束保持另一个正在等待的锁并且始终等待每个其它锁一死锁。可以 定义用于取得在队列上的锁的顺序以便防止这样的死锁。
[0103] 一种用于使事务表现为原子的更复杂解决方案是具有如下方法,该方法允许多个 消息的状态从系统的其余部分的观点来看表现为瞬时改变。描述这样的系统为"锁管理 典" 〇
[0104] 锁管理器代表在系统中的每个事务维护锁的消息的列表。它也维护当前被锁定的 所有消息的(潜在非常大的)哈希表。它具有用于代表事务锁定/解锁消息并且查询消息是 否被锁、例如在哈希表中的操作的应用编程接口(API)。用于哈希表的关键字可以是消息的 orderld (如果有多个队列则加上用于队列的唯一 id)。因此,试图取出消息而不是关注在 消息中的"可用"标志的应用要求锁管理器代表它锁定消息。在需要提交事务时,以下步骤 出现:
[0105] 1.提交器向锁管理器通知提交(或者回滚)开始;
[0106] 2.提交器执行提交所需要的任何工作(例如倒回取出光标);
[0107] 3.提交器向锁管理器通知提交完成(并且锁管理器释放在所有消息上的锁)
[0108] 锁管理器在它在步骤1直至步骤3中被通知完成之后暂停对受影响的消息进行引 用的任何请求,只要关注的是系统的其余部分,整个提交就表现为原子的,并且仅影响如下 应用,这些应用试图和访问在提交事务而不是完整队列中的消息。
[0109] 另一优化在可以(例如用锁管理器)同时表观地改变多个状态的实现方式中是可 能的。在提交放入(或者回滚取出)的以上描述中,有可能需要对于在事务中的每个消息倒 回getCursor。一旦提交表现为原子,在事务中涉及到的每个队列仅需一个可能的倒回(与 在事务中的每个消息比对)。在步骤2中向在每个队列中的最早消息(按照orderld)倒回 光标,并且这足以保证消息排序。
[0110] 公开内容试图高效地实施非严格FIFO的队列,可以(有可能)成批向队列放入、然 后提交(解锁)消息。尽管消息被锁,在消息被锁之后被放入的其它(未锁的)消息仍然可以 出队列,这在严格FIFO队列中是不可能的。
[0111] 本发明可以采用全硬件实施例、全软件实施例或者包含硬件与软件单元的实施例 这样的形式。在一个优选实施例中,在包括但不限于固件、常驻软件、微代码等的软件中实 施本发明。
[0112] 本发明可以采用从计算机可用或者计算机可读介质可访问的计算机程序产品的 形式,该计算机可用或者计算机可读介质提供用于由计算机或者任何指令执行系统使用或 者与计算机或者任何指令执行系统结合使用的程序代码。出于本描述的目的,计算机可用 或者计算机可读介质可以是任何装置,该装置可以包含、存储、传达、传播或者传送用于由 指令执行系统、装置或者设备使用或者与指令执行系统、装置或者设备结合使用的程序。
[0113] 可以对前文进行改进和修改而未脱离本发明的范围。
[0114] 所属【技术领域】的技术人员知道,本发明的各个方面可以实现为系统、方法或计算 机程序产品。因此,本发明的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、 完全的软件实施方式(包括固件、驻留软件、微代码等),或硬件和软件方面结合的实施方 式,这里可以统称为"电路"、"模块"或"系统"。此外,在一些实施例中,本发明的各个方面 还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介 质中包含计算机可读的程序代码。
[0115] 可以采用一个或多个计算机可读介质的任意组合。计算机可读介质可以是计算 机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是--但不限 于--电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算 机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便 携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器 (EPR0M或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者 上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的 有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0116] 计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号, 其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括--但 不限于--电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是 计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者 传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0117] 计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括--但不限 于--无线、有线、光缆、RF等等,或者上述的任意合适的组合。
[0118] 可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的计算 机程序代码,所述程序设计语言包括面向对象的程序设计语言一诸如Java、Smalltalk、C++ 等,还包括常规的过程式程序设计语言一诸如"C"语言或类似的程序设计语言。程序代码可 以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、 部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。 在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络一包括局域网(LAN) 或广域网(WAN)-连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务 提供商来通过因特网连接)。
[0119] 下面将参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和 /或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中 各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算 机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些计算 机程序指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图 和/或框图中的一个或多个方框中规定的功能/动作的装置。
[0120] 也可以把这些计算机程序指令存储在计算机可读介质中,这些指令使得计算机、 其它可编程数据处理装置、或其他设备以特定方式工作,从而,存储在计算机可读介质中的 指令就产生出包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的指令 的制造品(article of manufacture)〇
[0121] 也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备 上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计 算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令提供实现流程图和/ 或框图中的一个或多个方框中规定的功能/动作的过程。
[0122] 附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程 序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以 代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个 用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所 标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以 基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的 是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行 规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的 组合来实现。
[0123] 为了避免疑惑,不会解释术语如这里贯穿说明书和权利要求书使用的"包括"为意 味着"仅由......构成"。
【权利要求】
1. 一种用于具有事务能力的排队的方法,包括: 提供具有有序消息列表的队列; 在所述队列内提供取出光标操作,以指向用于取出应用开始搜寻要取回的消息的当前 开始位置; 如果存在多于一个放入应用,则提供用于放入操作的第一锁以保证一次仅一个应用正 在向所述队列放入; 如果存在多于一个取出应用,则提供用于取出操作的第二锁以保证一次仅一个应用正 在从所述队列取出; 在放入与取出应用之间进行同步,以检查并更新所述取出光标操作。
2. 如权利要求1所述的方法,包括: 放入应用在它提交比所述光标的所述当前位置更早的消息时使用用于倒回所述光标 的指令。
3. 如权利要求1或2所述的方法,包括: 取出应用使用用于向前移动所述光标的指令。
4. 如权利要求1至3中的任一权利要求所述的方法,其中所述取出光标操作包括被用 于同步的原子指令使用的一个或者两个存储器字。
5. 如前述权利要求中的任一权利要求所述的方法,其中所述队列是单链接列表,并且 通过对在所述队列上的每个消息进行编号来提供所述有序消息列表。
6. 如权利要求5所述的方法,其中所述取出光标操作使用: 指向所述搜索应当在所述队列上开始的所述消息的指针;以及 在所述队列上的所述消息的所述顺序编号。
7. 如权利要求5或6所述的方法,其中同步使用双宽度比较和交换DWCAS操作,并且取 得光标操作包括用于所述指针的两个存储器字和所述消息的顺序编号。
8. 如权利要求1至4中的任一权利要求所述的方法,其中所述队列是以索引充当指针 和顺序编号二者的数据结构;并且 所述取出光标操作指向所述数据结构的所述索引。
9. 如权利要求7所述的方法,其中同步使用比较和交换CAS操作,并且取出光标操作包 括用于所述索引的一个存储器字。
10. 如前述权利要求中的任一权利要求所述的方法,其中同步使用对所述取出光标操 作的锁。
11. 如前述权利要求中的任一权利要求所述的方法,其中: 如果存在单个放入应用,则不提供第一锁; 如果存在单个取出应用,则不提供第二锁;并且 所述同步围绕所述取出光标操作。
12. 如前述权利要求中的任一权利要求所述的方法,包括提供虚消息以防止空队列。
13. 如前述权利要求中的任一权利要求所述的方法,包括提供最大顺序编号以指示不 存在用于取出应用取回的有效消息并且新放入设置所述光标以指向它。
14. 如前述权利要求中的任一权利要求所述的方法,其中所述第一锁和第二锁将用于 在所述事务中涉及到的每个队列的消息锁定达到提交或者回滚的持续时间。
15. 如前述权利要求中的任一权利要求所述的方法,其中所述第一锁和第二锁由在消 息中设置的标志提供,以指示它可用或者是事务的一部分。
16. 如前述权利要求中的任一权利要求所述的方法,其中所述第一锁和第二锁由代表 事务而维护被锁定的消息的列表的锁管理器提供。
17. -种用于具有事务能力的排队的系统,包括: 具有有序消息列表的队列; 在所述队列内用于操作的取出光标,用于指向用于取出应用开始搜寻要取回的消息的 当前开始位置; 用于放入操作的第一锁,用于如果存在多于一个放入应用则保证一次仅一个应用正在 向所述队列放入; 用于取出操作的第二锁,用于如果存在多于一个取出应用则保证一次仅一个应用正在 从所述队列取出; 同步器机制,用于在放入与取出应用之间进行同步,以检查和更新所述取出光标操作。
18. 如权利要求17所述的系统,包括: 放入应用,包括在它提交比所述光标的所述当前位置更早的消息时用于倒回所述光标 的指令。
19. 如权利要求17或18所述的系统,包括: 取出应用,包括用于向前移动所述光标的指令。
20. 如权利要求17至19中的任一权利要求所述的系统,其中所述取出光标部件包括由 用于同步的原子指令使用的一个或者两个存储器字。
21. 如权利要求17至20中的任一权利要求所述的系统,其中所述取出光标部件包括用 于同步的取出光标锁。
22. 如权利要求17至21中的任一权利要求所述的系统,其中所述队列是单链接列表, 并且通过对在所述队列上的每个消息进行编号来提供所述有序消息列表;并且其中所述同 步机制包括双宽度比较和交换DWCAS操作,并且取得光标部件包括用于所述指针的两个存 储器字和所述消息的顺序编号。
23. 如权利要求17至21中的任一权利要求所述的系统,其中所述队列是以索引充当指 针和顺序编号二者的数据结构;并且其中同步使用比较和交换CAS操作,并且取出光标部 件将一个存储器字用于所述索引。
【文档编号】G06F9/46GK104063271SQ201410098848
【公开日】2014年9月24日 申请日期:2014年3月17日 优先权日:2013年3月20日
【发明者】J·勒威尔, I·C·爱德华兹, T·洛班, A·J·肖非尔德 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1