并发非阻塞无锁队列及其实施方法和装置制造方法及图纸

技术编号:2830341 阅读:463 留言:0更新日期:2012-04-11 18:40
仅当有必要防止队列变空时才使虚节点入列到并发非阻塞无锁FIFO队列中。仅在出列操作过程中并且仅当在该出列操作过程中队列包含单个用户节点时,虚节点才入列。这相对于总是将虚节点保持于队列中的常规机制而言减少了开销。用户节点直接入列到队列中并且能够按照任何线程的要求立即出列。优选地,入列和出列操作包括使用加载链接/条件存储(LL/SC)同步原语。这解决了ABA问题而无需使用唯一编号如队列特有编号,并且与包括使用比较和交换(CAS)同步原语以及通过使用唯一编号来解决ABA问题的常规机制形成对比。此外,优选地插入存储排序防护以使得算法可以在弱一致性处理器上运行。

【技术实现步骤摘要】

本专利技术一般地涉及数字数据处理领域。具体而言,本专利技术涉及利用处理器同步原语如加载链接/条件存储(load-linked/store conditional, LL國SC )的并发非阻塞无锁(non-blocking, lock free )先 进先出(FIFO)队列。
技术介绍
在二十世纪后半叶,开始出现了称之为信息革命的现象。尽管 信息革命是在范围上比任一事件或者机器都更广泛的历史性发展, 但是没有哪个设备比数字电子计算机更能代表信息革命。毋庸置疑, 计算机系统的发展已经是一场革命。年复一年,计算机系统增长更 快、存储更多数据并提供更多应用给它们的用户。现代计算机系统通常包括至少一个中央处理单元(CPU)以及 为了存储、获取和传送信息而必需的支持硬件如通信总线和存储器。 它也包括为了与外界通信而必需的硬件如输入/输出控制器或者存储 控制器以及与之附接的设备如键盘、监视器、磁带驱动器、磁盘驱 动器、耦合到网络的通信线路等。该一个或者多个CPU是该系统的 核心。它们执行如下指令,这些指令包括计算机程序并指引其它系 统组件的操作。通常通过增加并行性并且具体通过利用多个CPU(也称为处理 器)来提高计算机系统的整体速度。在集成电路芯片上封装各个处 理器的成本并不高,这已经使多处理器系统成为现实,虽然这样的 多个处理器给系统增添了多重的复杂性。从计算机硬件的观点来看,多数系统以基本上相同的方式操 作。处理器能够执行很简单的操作,比如算术、逻辑比较以及将数据从一个位置移动到另一位置。但是各操作执行得都很快。处于多 个级别上的复杂软件指引计算机执行为数众多的这些简单操作,使 计算机能够执行复杂任务。通过使用具有增强功能的软件以及更快 的硬件来执行基本上相同的 一组很简单的操作,使得被用户认为是 计算机系统的新功能或者改进功能的那些功能成为可能。先进先出(FIFO)队列广泛地用于并行应用和操作系统中。应 用和进程线程频繁地使数据入列到FIFO队列上以及使数据从FIFO 队列中出列。 一般而言,FIFO队列是如下数据结构,该数据结构提 供了包含数据的不同存储器位置的有序列表。队列的各不同存储器 位置通常称为节点。为了使节点保持有序,各节点具有next指针, 该指针标识(即指向)队列中下一节点的存储器位置。队列的第一 个节点称为头节点而队列的最后一个节点称为尾节点。由于尾节 点是队列的最后一个节点,所以尾节点的next指针通常为NULL (空)。队列具有标识(即指向)头节点的头指针以及标识(即指 向)尾节点的尾指针。通过在队列的当前尾节点之后插入节点来使该节点入列,使得 入列的节点变成队列的新尾节点。因而,为了使节点入列到队列上, 线程必须确定哪个节点是当前尾节点。为了实现这一点,线程通常 利用队列的尾指针。在队列的头部使节点出列,使得当前头节点出列而下一节点变 成队列的新头节点。因而,为了使节点从队列中出列,线程必须确 定哪个节点是当前头节点。为了实现这一点,线程通常利用队列的 头指针。如上所述,应用和进程线程在FIFO队列上使数据入列和出列。 多个不同的此类线程可以进行对队列的并发使用。队列的并发使用 使得难以维持队列的完整性。然而,必须针对队列可能遇到的所有可能条件来维持队列的完整性。必须使得并发访问同步以维持队列的完整性。用于包括FIFO 队列的并发数据结构的算法是阻塞或者非阻塞的。阻塞算法使得緩慢或者延迟的进程(或者线程)可以不确定地防止更快的进程(或 者线程)完成对并发数据结构的操作。非阻塞算法保证了如果一个 或者多个激活进程(或者线程)试图执行对并发数据结构的操作则 一些操作将在有限数目的步骤内完成。非阻塞算法通常比阻塞算法 更为优选,因为当由于发生比如处理器调度抢先、页面故障和高速 緩存未命中这样的事件而暂停或者延迟进程(或者线程)时,阻塞 算法会不利地经历明显的性能下降。已经针对包括并发FIF O队列的共享数据结构提出了无锁算法。 无锁算法使得可以对共享数据结构进行并发更新而无需牵涉到由被 操作系统管理的锁来保护的关键部分。无锁同步的一些最普遍益处 包括 比基于锁的算法更高效; 提高了多处理器机器上的可伸缩性; 可用于几乎所有包括中断句柄的环境中; 非阻塞实施自然地避免了优先级反转; 协作技术保证了完成进度,这不同于无效(u叩roductive )的自旋锁。特殊处理器同步原语如传统的比较和交换以及现代的加载链 接/条件存储(例如PowerPC ldarx/stdcx )已经用来为FIFO队列和后 进先出(LIFO)队列(LIFO队列也称为LIFO栈)实施高效的无锁 算法。并发LIFO队列很容易实施;然而高效的并发FIFO队列明显 地更具^L战性。Michael等人在1996年的分布式计算原理研讨会上在简单、 快速和实用的非阻塞和阻塞并发算法,,(Simple, Fast, and Practical Non-blocking and Blocking Concurrent Algorithms, Symposium of Principles of Distributed Computing, 1996 ) —文中描述了 一种高效的现 有技术并发队列。Michael等人的公开内容所存在的问题包括 为入列到队列中的各用户节点分配分离的链接节点。由此,节 点并不直接入列到队列中,因为需要额外的链接节点。这会限制队 列性能以及线程可以使用队列的方式。由于存储器分配问题,分配 这一额外链接节点增添了开销并且使这一算法对于中断句柄而言不 可行。 传统的比较和交换原语需要特殊考虑(例如唯一编号生成器)以防止经典的ABA问题(下文将加以讨论),这增添了附加开销。 一般而言,当进程或者线程读取在如FIFO队列之类的共享存 储器位置上的值丄计算新的值、然后尝试如比较和交换原语之类的 操作时,会出现本领域公知的ABA问题,如果在读取与比较和交 换之间, 一个或者多个其它进程将值^改变成值仏然后再次改变 回值」,则该问题即使不应当继续却仍然可能继续。Michael等人的 公开内容描述了 一种并发非阻塞队列,其中通过将额外计数字段 分配给队列指针如尾节点的next指针来解决ABA问题。由此, 例如,每当任何线程修改尾节点时,与尾节点的next指针相关联 的计数将递增。在ABA问题会以别的方式出现的情形下,如果已经 在另 一 节点上使尾节点入列和出列,则尝试使新节点入列到队列上 的线程将认识到被它认为是尾节点的节点的next指针计数字段 已经改变,即使next指针仍然具有与以前相同的值。因此,线程 将不完成它的入列操作,由此防止出现ABA问题,但代价是为提供 额外计数字段而必需的附加开销。于2005年5月3日授权给Forin等人而转让给微软公司的题为 NON-BLOCKING CONCURRENT QUEUES WITH DIRECT NODE ACCESS BY THREADS(可由线程进行直接节点访问的非阻塞并发 队列)的美国专利第6,889,269号至少部分地解决了 Michael等人公 开内容中的一些问题,但却引入了出列时间窗。Forin等人的专利所 存在的问题包括 有利地使用户节点直接入列到队本文档来自技高网...

【技术保护点】
一种无锁并发FIFO队列,包括:    至少一个用户节点,各用户节点具有指向下一节点的“next”指针;    虚节点,具有指向下一节点的“next”指针,其中在出列操作过程中并且仅当在所述出列操作过程中所述无锁并发FIFO队列包含所述用户节点中的单个节点时,所述虚节点才入列;    标识头节点的头指针;    标识尾节点的尾指针;    标识所述虚节点的虚指针。

【技术特征摘要】
US 2006-11-13 11/559,0041.一种无锁并发FIFO队列,包括至少一个用户节点,各用户节点具有指向下一节点的“next”指针;虚节点,具有指向下一节点的“next”指针,其中在出列操作过程中并且仅当在所述出列操作过程中所述无锁并发FIFO队列包含所述用户节点中的单个节点时,所述虚节点才入列;标识头节点的头指针;标识尾节点的尾指针;标识所述虚节点的虚指针。2. 如权利要求1所述的无锁并发FIFO队列,其中所述虚节点 不包含在所述无锁并发FIFO队列中,并且其中在所述出列操作过程 中所述无锁并发FIFO队列包含两个或者更多用户节点,使得所述虚 节点在所述出列操作过程中不入列。3. —种实施队列的方法,包括以下步骤(a) 使用户节点入列到队列的末尾,其中在所述入列步骤(a) 之前,所述队列至少包括具有指向下一节点的next指针的虚节点, 并且其中所述用户节点具有指向下一节点的next指针;(b) 在所述入列步骤(a)之后,使所述虚节点从所述队列中出列;(c) 在所述出列步骤(b)之后,有条件地使头节点从所述队 列中出列;(d) 在所述有条件的出列步骤(c)过程中,仅当所述队列包 含仅一个用户节点时才使另一虚节点入列到所述队列的末尾。4. 如权利要求3所述的方法,其中所述入列步骤(a)包括以 下步骤通过将尾节点的next指针设置为指向所述用户节点而将所述 用户节点链接到所述队列的末尾;将所述队列的尾指针更新为指向所述用户节点。5. 如权利要求4所述的方法,其中所述更新步骤不是在所述入 列步骤(a)过程中完成而是在后续入列操作或者后续出列操作过程 中完成。6. 如权利要求3所述的方法,其中如果所述有条件的出列步骤 (c)成功地使得节点出列,则所述方法还包括以下步骤将步骤(c)中出列的节点的next指针设置为NULL; 如果步骤(c)中出列的节点为用户节点,则返回所述出列的用 户节点;如果步骤(c)中出列的节点...

【专利技术属性】
技术研发人员:DA克里斯坦森
申请(专利权)人:国际商业机器公司
类型:发明
国别省市:US[美国]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1
相关领域技术
  • 暂无相关专利