CN101183304A - 并发非阻塞无锁队列及其实施方法和装置 - Google Patents
并发非阻塞无锁队列及其实施方法和装置 Download PDFInfo
- Publication number
- CN101183304A CN101183304A CNA2007101675682A CN200710167568A CN101183304A CN 101183304 A CN101183304 A CN 101183304A CN A2007101675682 A CNA2007101675682 A CN A2007101675682A CN 200710167568 A CN200710167568 A CN 200710167568A CN 101183304 A CN101183304 A CN 101183304A
- Authority
- CN
- China
- Prior art keywords
- node
- lines
- formation
- pointer
- falling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L49/00—Packet switching elements
- H04L49/90—Buffering arrangements
- H04L49/901—Buffering arrangements using storage descriptor, e.g. read or write pointers
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L49/00—Packet switching elements
- H04L49/90—Buffering arrangements
Abstract
仅当有必要防止队列变空时才使虚节点入列到并发非阻塞无锁FIFO队列中。仅在出列操作过程中并且仅当在该出列操作过程中队列包含单个用户节点时,虚节点才入列。这相对于总是将虚节点保持于队列中的常规机制而言减少了开销。用户节点直接入列到队列中并且能够按照任何线程的要求立即出列。优选地,入列和出列操作包括使用加载链接/条件存储(LL/SC)同步原语。这解决了ABA问题而无需使用唯一编号如队列特有编号,并且与包括使用比较和交换(CAS)同步原语以及通过使用唯一编号来解决ABA问题的常规机制形成对比。此外,优选地插入存储排序防护以使得算法可以在弱一致性处理器上运行。
Description
技术领域
本发明一般地涉及数字数据处理领域。具体而言,本发明涉及利用处理器同步原语如加载链接/条件存储(load-linked/storeconditional,LL-SC)的并发非阻塞无锁(non-blocking,lock free)先进先出(FIFO)队列。
背景技术
在二十世纪后半叶,开始出现了称之为信息革命的现象。尽管信息革命是在范围上比任一事件或者机器都更广泛的历史性发展,但是没有哪个设备比数字电子计算机更能代表信息革命。毋庸置疑,计算机系统的发展已经是一场革命。年复一年,计算机系统增长更快、存储更多数据并提供更多应用给它们的用户。
现代计算机系统通常包括至少一个中央处理单元(CPU)以及为了存储、获取和传送信息而必需的支持硬件如通信总线和存储器。它也包括为了与外界通信而必需的硬件如输入/输出控制器或者存储控制器以及与之附接的设备如键盘、监视器、磁带驱动器、磁盘驱动器、耦合到网络的通信线路等。该一个或者多个CPU是该系统的核心。它们执行如下指令,这些指令包括计算机程序并指引其它系统组件的操作。
通常通过增加并行性并且具体通过利用多个CPU(也称为处理器)来提高计算机系统的整体速度。在集成电路芯片上封装各个处理器的成本并不高,这已经使多处理器系统成为现实,虽然这样的多个处理器给系统增添了多重的复杂性。
从计算机硬件的观点来看,多数系统以基本上相同的方式操作。处理器能够执行很简单的操作,比如算术、逻辑比较以及将数据从一个位置移动到另一位置。但是各操作执行得都很快。处于多个级别上的复杂软件指引计算机执行为数众多的这些简单操作,使计算机能够执行复杂任务。通过使用具有增强功能的软件以及更快的硬件来执行基本上相同的一组很简单的操作,使得被用户认为是计算机系统的新功能或者改进功能的那些功能成为可能。
先进先出(FIFO)队列广泛地用于并行应用和操作系统中。应用和进程线程频繁地使数据入列到FIFO队列上以及使数据从FIFO队列中出列。一般而言,FIFO队列是如下数据结构,该数据结构提供了包含数据的不同存储器位置的有序列表。队列的各不同存储器位置通常称为“节点”。为了使节点保持有序,各节点具有“next”指针,该指针标识(即指向)队列中下一节点的存储器位置。队列的第一个节点称为“头节点”而队列的最后一个节点称为“尾节点”。由于尾节点是队列的最后一个节点,所以尾节点的“next”指针通常为NULL(空)。队列具有标识(即指向)头节点的头指针以及标识(即指向)尾节点的尾指针。
通过在队列的当前尾节点之后插入节点来使该节点入列,使得入列的节点变成队列的新尾节点。因而,为了使节点入列到队列上,线程必须确定哪个节点是当前尾节点。为了实现这一点,线程通常利用队列的尾指针。
在队列的头部使节点出列,使得当前头节点出列而下一节点变成队列的新头节点。因而,为了使节点从队列中出列,线程必须确定哪个节点是当前头节点。为了实现这一点,线程通常利用队列的头指针。
如上所述,应用和进程线程在FIFO队列上使数据入列和出列。多个不同的此类线程可以进行对队列的并发使用。队列的并发使用使得难以维持队列的完整性。然而,必须针对队列可能遇到的所有可能条件来维持队列的完整性。
必须使得并发访问同步以维持队列的完整性。用于包括FIFO队列的并发数据结构的算法是阻塞或者非阻塞的。阻塞算法使得缓慢或者延迟的进程(或者线程)可以不确定地防止更快的进程(或者线程)完成对并发数据结构的操作。非阻塞算法保证了如果一个或者多个激活进程(或者线程)试图执行对并发数据结构的操作则一些操作将在有限数目的步骤内完成。非阻塞算法通常比阻塞算法更为优选,因为当由于发生比如处理器调度抢先、页面故障和高速缓存未命中这样的事件而暂停或者延迟进程(或者线程)时,阻塞算法会不利地经历明显的性能下降。
已经针对包括并发FIFO队列的共享数据结构提出了无锁算法。无锁算法使得可以对共享数据结构进行并发更新而无需牵涉到由被操作系统管理的锁来保护的关键部分。无锁同步的一些最普遍益处包括:
·比基于锁的算法更高效;
·提高了多处理器机器上的可伸缩性;
·可用于几乎所有包括中断句柄的环境中;
·非阻塞实施自然地避免了优先级反转;
·协作技术保证了完成进度,这不同于无效(unproductive)的自旋锁。
特殊处理器同步原语如传统的比较和交换以及现代的加载链接/条件存储(例如PowerPC ldarx/stdcx)已经用来为FIFO队列和后进先出(LIFO)队列(LIFO队列也称为LIFO栈)实施高效的无锁算法。并发LIFO队列很容易实施;然而高效的并发FIFO队列明显地更具挑战性。
Michael等人在1996年的分布式计算原理研讨会上在“简单、快速和实用的非阻塞和阻塞并发算法”(“Simple,Fast,and PracticalNon-blocking and Blocking Concurrent Algorithms”,Symposium ofPrinciples of Distributed Computing,1996)一文中描述了一种高效的现有技术并发队列。Michael等人的公开内容所存在的问题包括:
·为入列到队列中的各用户节点分配分离的链接节点。由此,节点并不直接入列到队列中,因为需要额外的链接节点。这会限制队列性能以及线程可以使用队列的方式。由于存储器分配问题,分配这一额外链接节点增添了开销并且使这一算法对于中断句柄而言不可行。
·传统的比较和交换原语需要特殊考虑(例如唯一编号生成器)以防止经典的ABA问题(下文将加以讨论),这增添了附加开销。
一般而言,当进程或者线程读取在如FIFO队列之类的共享存储器位置上的值A、计算新的值、然后尝试如比较和交换原语之类的操作时,会出现本领域公知的“ABA问题”,如果在读取与比较和交换之间,一个或者多个其它进程将值A改变成值B,然后再次改变回值A,则该问题即使不应当继续却仍然可能继续。Michael等人的公开内容描述了一种并发非阻塞队列,其中通过将额外“计数”字段分配给队列指针如尾节点的“next”指针来解决ABA问题。由此,例如,每当任何线程修改尾节点时,与尾节点的“next”指针相关联的计数将递增。在ABA问题会以别的方式出现的情形下,如果已经在另一节点上使尾节点入列和出列,则尝试使新节点入列到队列上的线程将认识到被它认为是尾节点的节点的“next”指针“计数”字段已经改变,即使“next”指针仍然具有与以前相同的值。因此,线程将不完成它的入列操作,由此防止出现ABA问题,但代价是为提供额外“计数”字段而必需的附加开销。
于2005年5月3日授权给Forin等人而转让给微软公司的题为“NON-BLOCKING CONCURRENT QUEUES WITH DIRECT NODEACCESS BY THREADS”(可由线程进行直接节点访问的非阻塞并发队列)的美国专利第6,889,269号至少部分地解决了Michael等人公开内容中的一些问题,但却引入了出列时间窗。Forin等人的专利所存在的问题包括:
·有利地使用户节点直接入列到队列中而无需额外链接节点;然而必须反复地使虚节点出列和重新入列,由此增添了明显开销。例如,如果平均队列深度(AQD)是2个用户节点,则所有入列的25%将是无效的虚节点,或者具有1∶2的比率。一般而言,虚节点入列与用户节点入列的比率是1∶AQD(例如1∶2、1∶3、1∶4...)。
·改进了针对ABA问题的解决方案;然而需要队列特有编号用来唯一地标识包含节点的队列。
·当仅使单个用户节点入列时队列节点中的时间窗错误地检测到空队列。也就是说,如果第一线程暂时地使虚节点出列而留下单个用户节点,则第二线程上的出列将观察到空队列。这可能造成一些应用不正确地运行。
·虽然Forin等人的专利声明该发明涉及了利用非阻塞原子比较和交换(CAS)指令的FIFO队列,但是在该专利中没有描述或者在它的流程图中没有利用CAS指令。
·将需要一些附加的存储排序防护(storage ordering fence)以在弱一致性处理器上运行Forin等人的专利中公开的算法(下文将加以讨论)。
对更快速处理器的开发促成了弱一致性处理器架构的创建,该架构允许一定数量的指令推测(比如分支推测)和指令的无序执行。为了实现这些类型的执行,当在组内的指令之间不存在依赖性时处理器,将一系列指令分配给该组。能够并行或者无序地(即在更早的指令之前执行更迟的指令)执行组内的指令。然而,特别是对于加载和存储指令,由于指令序列内的数据依赖性,必须按程序顺序执行不同组中的指令以获得正确的处理结果。因此,将需要附加的存储排序防护以在弱一致性处理器上运行比如Forin等人的专利中公开的算法这样的算法。然而,Forin等人的专利没有详述为使它的算法可在弱一致性处理器上工作而必需的附加存储排序防护(fencing)。
使用并发LIFO队列(栈)作为丢弃(drop off)队列也并非很不寻常;然而,在能够执行正常有序任务处理之前,LIFO队列必须转换成FIFO队列。例如,于1997年9月23日授权给Rakity等人而转让给苹果计算机公司的题为“METHOD AND APPARATUS FORATOMICALLY ACCESSING A QUEUE IN A MEMORYSTRUCTURE WHERE LIFO IS CONVERTED TO FIFO”(用于在LIFO被转换成FIFO的情况下原子性地访问存储器结构中的队列的方法和装置)的美国专利第5,671,446号公开了这样一种方式。此方式具有很多缺点:
·就性能而言将LIFO队列转换成FIFO队列可能是昂贵的。
·在能够使单个节点出列之前,LIFO队列中的所有节点必须转换成FIFO顺序。
·单个任务必须执行LIFO到FIFO转换。在多处理器系统上这一转换可能变成瓶颈。
因此,需要一种用于提供并发非阻塞无锁FIFO队列的增强的机制。
发明内容
根据本发明的优选实施例,仅当有必要防止队列变空时才使虚节点入列到并发非阻塞无锁FIFO队列中。仅在出列操作过程中并且仅当在该出列操作过程中队列包含单个用户节点时,虚节点才入列。这相对于总是将虚节点保持于队列中的常规机制而言减少了开销。用户节点直接入列到队列中并且能够按照任何线程的要求立即出列。优选地,入列和出列操作包括使用加载链接/条件存储(LL/SC)同步原语。这解决了ABA问题而无需使用唯一编号如队列特有编号(queue-specific number),并且与包括使用比较和交换(CAS)同步原语以及通过使用唯一编号来解决ABA问题的常规机制形成对比。此外,优选地插入存储排序防护以使得算法可以在弱一致性处理器上运行。
根据如附图中所示对本发明优选实施例的如下具体描述,本发明的前述以及其它特征和优点将变得明显。
附图说明
下文将结合附图来描述本发明的优选示例性实施例,在附图中相似的标号指代相似的单元。
图1是根据本发明优选实施例用于提供并发、非阻塞、无锁FIFO队列的计算机系统的框图。
图2是根据本发明优选实施例的FIFO队列的初始状态的框图。
图3图示了根据本发明优选实施例的入列操作的框图,其中使用户节点入列到图2中所示FIFO队列的初始状态。
图4A、图4B和图4C是共同图示了根据本发明优选实施例的出列操作的框图。在图4A中,使虚节点从图3中所示状态下的FIFO队列中出列。在图4B中,使虚节点重新入列到图4A中所示状态下的FIFO队列中。在图4C中,使用户节点从图4B中所示状态下的FIFO队列中出列。
图5是用来图示根据本发明优选实施例的Queue类和Node结构的数据布局的示例性伪代码的示图。
图6是用来图示在图5的Queue类中声明的入列函数的示例性伪代码的示图。
图7是用来图示在图5的Queue类中声明的enqueueStep2函数的示例性伪代码的示图。
图8是用来图示在图5的Queue类中声明的出列函数的示例性伪代码的示图。
图9是用来图示在图5的Queue类中声明的enqueueDummy函数的示例性伪代码的示图。
具体实施方式
1.0概述
根据本发明的优选实施例,使用标准的加载链接/条件存储(LL/SC)同步原语来实施并发非阻塞无锁FIFO队列。使用加载链接/条件存储同步原语而不是比较和交换(CAS)同步原语解决了ABA问题而无需某一种唯一编号如队列特有编号,并且实现了更高效的定制代码。因而,本发明的优选实施例与包括使用比较和交换同步原语以及通过使用唯一编号来解决ABA问题的常规机制形成对比。另外,通过对加载链接/条件存储同步原语的谨慎使用,能够生成更高效的代码。
优选地,根据本发明优选实施例的算法谨慎地使用插入式存储排序防护(例如PowerPC同步指令)以在弱一致性处理器上实现既高效又正确的执行。
根据本发明优选实施例的算法是协作型的。如果入列落在后面,则后续的入列或者出列操作将帮助完成当前入列。入列是两步骤的过程:
1.将新节点连接到队列的末尾。
2.将队列的尾指针更新为指向新节点。
如果当前入列落在后面,例如当前入列被更高优先级的任务抢先或者在上述步骤1与步骤2之间出现页面故障,则后续的入列或者出列操作能够为当前入列完成步骤2。
使用虚节点来实现并发入列和出列操作是本领域中公知的技术;然而本领域现有技术的算法始终将虚节点保持于队列中。根据本发明的优选实施例,仅当有必要防止队列变空时才使虚节点入列到队列中。也就是说,仅在出列操作过程中并且仅当在该出列操作过程中队列包含单个用户节点时才使虚节点入列。如果至少两个用户节点入列,则虚节点无需入列。相对于总是将虚节点保持于队列中的常规机制如Forin等人的专利中描述的机制而言,这减少了开销。
为了展现这一优点而构造了测试,其中使用根据本发明优选实施例的算法(在下文的“详述”部分中将更具体地描述)以及Forin等人的专利中描述的方法针对十秒间隔由十六个线程反复地使十六个用户节点入列和出列。测试结果在下表1中示出。
表1
测试描述:针对10秒间隔由16个线程反复地使16个用户节点入列和出列 | |||
测试算法 | 虚节点入列 | 用户节点入列 | 比率(虚节点/用户节点) |
本发明的优选实施例 | 1 | 13,504,240 | 1∶13,504,240 |
Forin等人的专 | 431,279 | 7,274,904 | 1∶17(大约) |
如表1中所示,Forin等人的专利中描述的算法每十七个队列使虚节点入列一次。作为对比,根据本发明优选实施例的算法仅在测试运行结束时使虚节点重新入列一次。此外,根据本发明优选实施例的算法与Forin等人的专利中描述的算法相比能够在十秒间隔中使多出50%以上的用户节点入列。此外,Forin等人的专利中描述的算法由于之前讨论过的出列时间窗缺陷而在测试运行结束时在队列中不利地留下十三个用户节点。
总的来说,测试已经表明,当生产者线程(入列)和消费者线程(出列)以近似相同的速率运行时,根据本发明优选实施例的算法很少使虚节点入列。
根据本发明的优选实施例,用户节点直接入列到队列中并且能够按照任何线程的要求立即出列。
根据本发明优选实施例的算法事实上能够用于包括低级内核中断句柄的所有编程环境中。因而,本发明的优选实施例与需要额外链接节点存储器管理的常规机制如Michael公开内容中的机制形成对比,其中该额外链接节点存储器管理限制了这些常规机制的使用。因而,这样的常规机制不能很好地适合于例如具有存储器分配限制的中断句柄。
2.0详述
现在将在特定计算机系统100即IBM eServer iSeries或者System i计算机系统的背景下参照图1来描述本发明优选实施例的计算机系统实施。然而,本领域技术人员将认识到,本发明的FIFO队列、方法、装置和计算机程序产品同样适用于任何计算机系统,无论该计算机系统是复杂的多用户计算装置、单用户工作站、PC还是嵌入式控制系统。如图1中所示,计算机系统100包括一个或者多个处理器101A、101B、101C和101D、主存储器102、海量存储接口104、显示器接口106、网络接口108和I/O设备接口109。这些系统组件通过使用系统总线110来互连。
图1旨在于在较高级别上描绘计算机系统100的代表性的主要组件,应理解到各个组件可以具有比图1中所示更大的复杂度而且这样的组件的数目、类型和配置可以变化。例如,计算机系统100可以包含与所示数目不同的处理器。
海量存储接口104用来将海量存储设备(比如直接存取存储设备112)连接到计算机系统100。直接存取存储设备112的一个具体类型是可以存储数据到CD ROM114和从CD ROM114读取数据的可读可写CD ROM驱动器。
根据优选实施例的主存储器102包含数据116、操作系统118和入列/出列机制120。尽管入列/出列机制120在图1中表示为与操作系统118相分离和分立,但是优选实施例明确地延及在操作系统118和/或内核内实施的入列/出列机制120。正如本领域中公知的,内核可以集成到操作系统118中并且将内核级服务提供给操作系统118和其它程序。例如,入列/出列机制120可以实施于内核中包含的中断句柄和/或系统任务调度器中。此外,在优选实施例的范围内,入列/出列机制120能够独自或者一起实施于应用软件、实用程序或者其它类型的软件中。例如,本发明适用于范围广泛的应用,如数据库、联网、任务调度和存储管理。
计算机系统100利用公知的虚拟寻址机制,这些机制使得计算机系统100的程序可以表现得好像它们是访问大型单个存储实体而不是访问多个小型存储实体如主存储器102和DASD设备112一样。因此,尽管数据116、操作系统118和入列/出列机制120被表示为驻留于主存储器102中,但是本领域技术人员将认识到这些项目并非必然同时全都完全地包含于主存储器102中。也应当注意,术语“存储器”在这里用来一般地指代计算机系统100的整个虚拟存储器。
数据116代表了用作对计算机系统100中任何程序的输入或者来自该程序的输出的任何数据。操作系统118是业内称为OS/400或者IBM i5/OS的多任务操作系统;然而本领域技术人员认识到本发明的精神和范围不限于任何一个操作系统。
根据本发明的优选实施例,入列/出列机制120提供了正如下文将具体讨论的用于实施并发非阻塞无锁FIFO队列的功能。另外,根据本发明的优选实施例,入列/出列机制120包括图5中所示Queue类和Node结构的数据布局、用于图6中所示入列函数的代码、用于图7中所示enqueueStep2函数的代码、用于图8中所示出列函数的代码以及用于图9中所示enqueueDummy函数的代码。入列/出列机制120可以预先加以编程、手工加以编程、从记录介质(例如CD ROM114)加以传送或者通过因特网(例如通过网络126)来下载。
处理器101A、101B、101C和101D(在这里也统称为“处理器101”)可以由一个或者多个微处理器和/或集成电路构成。处理器101执行主存储器102中存储的程序指令。主存储器102存储可以由处理器101访问的程序和数据。当计算机系统100启动时,处理器101初始地执行构成操作系统118的程序指令。操作系统118是管理计算机系统100的资源的复杂系统。这些资源中的一些资源是处理器101、主存储器102、海量存储接口104、显示器接口106、网络接口108、I/O设备接口109和系统总线110。
虽然计算机系统100表示为包含四个处理器和单个系统总线,但是本领域技术人员将认识到可以使用具有不同数目的处理器和/或多个总线的计算机系统来实施本发明。此外,在优选实施例中使用的接口均包括分离的完全编程微处理器,这些微处理器用来从处理器101卸载计算密集的处理。然而,本领域技术人员将认识到本发明同样适用于如下计算机系统,这些计算机系统简单地使用I/O适配器来执行相似的功能。
显示器接口106用来将一个或者多个显示器122直接连接到计算机系统100。这些显示器122可以是非智能终端(即哑终端)或者完全可编程工作站,这些显示器122被用来使得系统管理员和用户(在这里也称为“操作者”)可以与计算机系统100通信。然而,注意到尽管提供显示器接口106以支持与一个或者多个显示器122的通信,但是计算机系统100并非必然地需要显示器122,因为所有所需的与用户和处理的交互可以经由网络接口108进行。
网络接口108用来跨经网络126将其它计算机系统和/或工作站124连接到计算机系统100。无论计算机系统100可以如何连接到其它计算机系统,不管使用如今的模拟和/或数字技术还是经由将来的某一联网机制来实现网络连接126,本发明都同样适用。此外,很多不同网络协议能够用来实施网络。这些协议是使得计算机可以跨经网络126进行通信的专用计算机程序。TCP/IP(传输控制协议/网际协议)是适当网络协议的例子。
I/O设备接口109提供通向各种输入/输出设备中任何输入/输出设备的接口。
此时,重要的是注意到尽管已经以及将会在完全功能计算机系统的背景下描述本发明的这一实施例,但是本领域技术人员将认识到本发明能够作为各种形式的程序产品来分发,并且无论用来实际地实现该分发的信号承载介质的特定类型如何,本发明都同样地适用。适当信号承载介质的例子包括可记录型介质如软盘和CD ROM(例如图1的CD ROM114)以及传输型介质如数字和模拟通信链路(例如图1中的网络126)。
图2是根据本发明优选实施例的FIFO队列200的初始状态的框图。一般而言,FIFO队列200包括指定一系列节点的存储列表,这些节点是比如图1中所示主存储器102这样的包含数据的存储器中的位置。虚节点不可用于外部线程。另一方面,外部进程或者应用线程可以使用户节点入列和出列。
在图2中所示FIFO队列的初始状态下(即恰在构造它之后),包括FIFO队列200的存储列表被指定如下:具有“next”指针204的虚节点202;指向虚节点202的头指针206;指向虚节点202的尾指针208;以及指向虚节点202的虚指针210。因此,队列的头指针、尾指针和虚指针全部初始地指向虚节点202。根据本发明的优选实施例,仅使多个虚节点入列以防止FIFO队列200变得在逻辑上为空。当仅有一个虚节点入列时FIFO队列200才“在逻辑上为空”。由于这时在虚节点202之后没有下一节点,所以虚节点的“next”指针204优选地设置为NULL。
图3是图示了根据本发明优选实施例的入列操作的框图,其中用户节点302入列到图2中所示FIFO队列200的初始状态,即在逻辑上为空的队列。用户节点302具有“next”指针304。由于这时在用户节点302之后没有下一节点,所以用户节点的“next”指针304优选地设置为NULL。虚节点202保留于FIFO 200中直至自然地出列,即使FIFO队列200并非在逻辑上为空。根据本发明的优选实施例,图3中所示入列操作在两个步骤中发生。首先,入列操作将新节点即用户节点302入列到FIFO队列200的末尾(步骤351)。这通过将虚节点的“next”指针204设置为指向用户节点302来实现。然后,将队列的尾指针208更新为指向新节点即用户节点302(步骤352)。
图4A、图4B和图4C是共同图示了根据本发明优选实施例的出列操作的框图。具体而言,图4A-图4C一起图示了虚节点如何出列,然后在最后一个用户节点出列时如何重新入列。在图4A中,虚节点202从图3中所示状态下的FIFO队列200中出列。在图4B中,虚节点重新入列到图4A中所示状态下的FIFO队列200中。在图4C中,用户节点302从图4B中所示状态下的FIFO队列200中出列。
应当理解,根据本发明的优选实施例,图4A-图4C中所示场景是一种异常情况。这是因为在稳定状态过程中,假设队列中有至少两个用户节点,虚节点很少出列。虽然图4A-图4C中所示场景是一种异常情况,但是这一场景对于从如何根据本发明优选实施例来使用虚节点的角度进行理解是重要的。
在图4A中,虚节点202从图3中所示状态下的FIFO队列200中出列。虚节点202之所以出列是因为它是FIFO队列200中的第一个节点。虚节点202在这时被放在一边。根据本发明的优选实施例,虚节点202的出列被实现如下。队列的头指针206被设置为指向用户节点302(步骤451)。此外,虚节点的“next”指针204被设置为NULL(步骤452)。
在图4B中,虚节点重新入列到图4A中所示状态下的FIFO队列200中。重新入列的虚节点在图4B中表示为虚节点402。虚节点402优选地设置为虚节点202或者可以是另一虚节点。在任何情况下,在最后一个用户节点能够出列之前虚节点必须重新入列。根据本发明的优选实施例,虚节点402的重新入列被实现如下。当前尾节点的“next”指针304被设置为指向虚节点402(步骤453)。以这一方式,虚节点402被链接到FIFO队列200的末尾。然后,队列的尾指针208被设置为指向虚节点402(步骤454)。此外,由于这时在虚节点202之后没有下一节点,所以虚节点的“next”指针404被设置为NULL。
在图4C中,用户节点302从图4B中所示状态下的FIFO队列200中出列。使用户节点302出列,在FIFO队列200中仅留下虚节点402。根据本发明的优选实施例,用户节点302的出列被实现如下。队列的头指针206被设置为指向虚节点402(步骤455)。另外,用户节点的“next”指针304被设置为NULL(步骤456)。
根据本发明的优选实施例,队列必须原子性地更新三个无关指针:队列的头指针;队列的尾指针;以及节点的“next”指针。不能同时原子性地更新所有三个指针,使得这成为难以解决的问题。加载链接/条件存储同步原语将原子性地更新一个指针并且使得可以测试(加载)在加载链接与条件存储之间的无关共享存储器。比较和交换(CAS)同步原语能够用作备选的原语;然而,将需要解决CAS同步原语中固有的ABA问题,并且其实施将明显地不那么高效。
图5是用来图示根据本发明优选实施例的Node结构和Queue类的数据布局的伪随机代码的示图。Node结构在行501处示出。Queue类在行502处示出并且声明了如下函数:enqueue;enqueueStep2;dequeue;以及enqueueDummy。在行503处示出的enqueue函数是用以使新节点入列的公共接口。在行505处的enqueueStep2函数是执行入列操作的后一半操作的专用函数。在行504处的出列函数是用以使节点出列的公共接口。在行506处的enqueueDummy函数在需要的情况下使虚节点入列。
节点可以是用户节点或者虚节点。用户节点由用户分配并且包含用户特有数据。每队列被分配一个虚节点而该虚节点对于用户而言不可见。
本领域技术人员将认识到图5中所示Queue类和Node结构的数据布局是示例性的。其它实施也在本发明的精神和范围内。例如,Queue类能够实施为模板类,该模板类指定Node作为模板参数用以使用户的Node结构的布局广义化。为求简洁和清楚,图示了非模板类。
入列操作是两步骤的过程:
1.将新节点链接到队列的末尾。
2.将队列的尾指针更新为指向新节点。
第一步骤,即将新节点链接到队列的末尾,对应于图5的Queue类中行503处表示的入列功能并且在下文中将参照图6具体加以讨论。第二步骤,即将队列的尾指针更新为指向新节点,对应于图5的Queue类中行505处声明的enqueueStep2函数并且在下文中将参照图7具体加以讨论。一般而言,入列操作总是假设至少一个节点总是入列到队列中。
应当理解,图6-图9中图示的示例性伪代码用于举例说明而不用以限制本发明。本领域技术人员将认识到其它实施也在本发明的精神和范围内。例如,各种步骤按它们的优选顺序在图6-图9中阐明。然而,必须理解,各种步骤可以在与图中所示不同的时间发生或者可以同时发生。另外,本领域技术人员将认识到可以省略这些步骤中的一个或者多个步骤。
图6是用来图示图5的Queue类中行503处声明的入列函数的示例性伪代码的示图。在行601处,入列函数始于如下代码,该代码继续循环直至新节点成功地被链接到队列的末尾。在行602处得到队列尾指针的快照(snapshot)。队列的尾指针总是被假设为非NULL,因为总是有至少一个节点入列。在行603处,得到尾节点“next”指针的快照而设置预留以检测任何到尾节点“next”指针的存储。在行604处,对于弱一致性处理器而言需要存储排序防护以保证尾节点的“next”指针在它被测试之前是当前指针(在行605处)。在行605处,如果尾部尚未改变,则意味着仍然对当前尾节点进行操作而队列的尾指针与尾节点的“next”指针是一致的。如果尾部已经改变,则入列函数在行601处重新开始。
在行605.1处,如果当前尾节点的“next”指针为非NULL,则这意味着入列操作部分地完成而必须更新尾部,因而调用enqueueStep2(下文将参照图7加以讨论)以帮助完成部分入列。先前的入列必须在下一入列能够开始之前完成,因而入列函数在行601处重新开始。
在行605.2处,入列函数现在尝试有条件地将新节点链接到队列的末尾。如果另一线程当前正在使节点入列则条件存储可能失败。
在行606处,入列函数的最后步骤调用enqueueStep2(下文将参照图7加以讨论)以将队列的尾指针更新为指向新节点。
图7是用来图示图5的Queue类中行505处声明的enqueueStep2函数的示例性伪代码的示图。enqueueStep2函数既可以由入列函数调用又可以由出列函数调用,以帮助完成部分入列。在行701处,enqueueStep2函数始于如下代码,该代码继续循环直至尾部更新。这是能够由多个线程并发执行的协作工作。因此,有可能另一线程可以在这一线程能够更新尾部并且没有必要进行更新之前更新尾部。在行702处,得到队列尾指针的快照而设置预留以检测任何到队列尾指针的存储。在行703处,对于弱一致性处理器而言需要存储排序防护以保证尾节点的“next”指针是当前指针。在行704处,得到尾节点的“next”指针的快照。在行705处,如果尾节点的“next”指针为NULL,则由于尾部已经被另一线程更新所以退出循环。在行706处,enqueueStep2函数尝试有条件地将队列的尾指针摆动到下一节点。如果另一线程当前正在执行enqueueStep2则条件存储可能失败。
出列操作比入列操作略微复杂一些。出列考虑事项包括:
·如果虚节点出列,则将它放在一边而尝试使下一节点出列。
·如果仅单个用户节点入列,则在使该用户节点出列之前使虚节点入列。队列一定不能为空。
·如果头节点部分地出列,则帮助完成入列。当前头节点直至完全地入列才能够出列。
·如果队列在逻辑上为空,则返回NULL。如前所述,仅当虚节点入列时队列才在逻辑上为空。
图8是用来图示图5的Queue类中行504处声明的出列函数的示例性伪代码的示图。在行801处,出列函数始于如下代码,该代码继续循环直至用户节点成功地出列或者检测到在逻辑上为空的队列。在行802处,得到队列头指针的快照而设置预留以检测任何到队列头指针的存储。在行803处,对于弱一致性处理器而言需要存储排序防护以保证头节点的“next”指针和队列的尾指针是当前指针。在行804处,得到头节点的“next”指针的快照。在行805处,如果队列的头指针和尾指针相等,则队列的状态将不允许使节点出列。执行这些动作之一以改变队列状态从而允许使节点出列。这三个动作分别在行805.1、805.1和805.3处示出。
在行805.1处,如果队列中的唯一节点是虚节点,这队列在逻辑上为空。执行条件存储以检验队列的头指针是否尚未改变。如果头部尚未改变,则出列函数返回NULL以指示队列为空。如果头部已经改变,则出列函数在行801处重新开始。
在行805.2处,如果队列中的唯一节点是用户节点,则调用enqueueDummy函数(下文将参照图9加以讨论)以使虚节点入列。在使虚节点入列之后,能够使用户节点出列。因而,一旦虚节点入列,出列函数就在行801处重新开始。
在行805.3处,如果第二节点部分地入列,则调用enqueueStep2函数(上文已参照图7加以讨论)以通过更新队列的尾指针来帮助完成入列。一旦enqueueStep2函数完成,出列函数就在行801处重新开始。
在行806处,出列函数尝试有条件地使头节点出列。如果另一线程并发地正在使节点出列则条件存储可能失败。如果条件存储成功则执行如下步骤。
在行806.1处,出列节点的“next”指针被设置为NULL。这使得出列节点准备再次入列。
在行806.2处,如果出列节点是用户节点,则将用户节点返回给调用者。另一方面,在行806.3处,如果出列节点为虚节点,则该虚节点被放在一边而出列函数在行801处重新开始以使用户节点出列。
图9是用来图示图5的Queue类中行506处声明的enqueueDummy函数的示例性伪代码的示图。enqueueDummy函数仅当队列包含单个用户节点时才使虚节点入列。在行901处,enqueueDummy函数始于如下代码,该代码继续循环直至虚节点成功地入列或者虚节点不再需要入列。在行902处,得到队列尾指针的快照。在行903处,得到尾节点“next”指针的快照而设置预留以检测任何到尾节点“next”指针的存储。在行904处,对于弱一致性处理器而言需要存储排序防护以保证队列的头指针和尾指针是当前指针。在行905处,enqueueDummy函数检验是否仍然需要添加虚节点。首先,检验尾部是否尚未改变(即如果尾部改变,则意味着另一节点正在入列,因而在该情况下没有必要使虚节点入列)。其次,检验队列的头指针和尾指针是否相等(即是否仅一个节点入列)。然后,检验尾节点的“next”指针是否为NULL(即如果尾节点的“next”指针为非NULL,则这意味着部分入列正在进行)。第四,检验虚节点是否尚未入列。
在行905.1处,enqueueDummy函数现在尝试有条件地使虚节点入列。如果另一线程并发地正在使节点入列则条件存储可能失败。如果虚节点成功地入列,则enqueueDummy函数完成。否则enqueueDummy函数在行901处重新开始。
在行906处,如果虚节点不再需要入列,则enqueueDummy函数完成。也就是说,在行905处检验的四个条件之一为“假”(false)。
本领域技术人员将认识到在本发明的范围内可以进行很多变更。例如,尽管入列/出列机制被表示为与图1中的操作系统相分离和分立,但是本发明延及在操作系统和/或内核内的实施。此外,本发明能够用应用软件、实用程序或者其它类型的软件独自或者一起加以实施。例如,本发明适用于范围广泛的应用,如数据库、联网、任务调度和存储管理。因此,尽管已经参照本发明的优选实施例具体地示出和描述了本发明,但是本领域技术人员将理解到,在不脱离本发明的精神和范围的情况下,可以在其中做出形式和细节上的这些以及其它改变。
Claims (11)
1.一种无锁并发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)中出列的节点为虚节点,则重新开始所述有条件的出列步骤(c)。
7.如权利要求3所述的方法,其中所述入列步骤(a)、所述出列步骤(b)、所述有条件的出列步骤(c)和所述入列步骤(d)均包括使用加载链接/条件存储原语。
8.如权利要求7所述的方法,其中所述入列步骤(a)、所述出列步骤(b)、所述有条件的出列步骤(c)和所述入列步骤(d)均包括使用存储排序防护。
9.一种用于实施队列的装置,包括:
至少一个处理器;
耦合到所述至少一个处理器的存储器;
由在所述至少一个处理器上运行的至少一个线程入列和出列的无锁并发FIFO队列,所述无锁并发FIFO队列包括:
至少一个用户节点,各用户节点具有指向下一节点的“next”指针;
虚节点,具有指向下一节点的“next”指针,其中在出列操作过程中并且仅当在所述出列操作过程中所述无锁并发FIFO队列包含所述用户节点中的单个节点时,所述虚节点才入列;
标识头节点的头指针;
标识尾节点的尾指针;
标识所述虚节点的虚指针。
10.如权利要求9所述的装置,其中所述虚节点不包含在所述无锁并发FIFO队列中,并且其中在所述出列操作过程中所述无锁并发FIFO队列包含两个或者更多用户节点,使得所述虚节点在所述出列操作过程中不入列。
11.一种用于在具有至少一个处理器的数字计算设备中实施队列的计算机程序产品,包括:
在计算机可读信号承载介质上提供的多个可执行指令,其中所述可执行指令在由所述至少一个处理器执行时使所述数字计算设备执行以下步骤:
(a)使用户节点入列到队列的末尾,其中在所述入列步骤(a)之前,所述队列至少包括具有指向下一节点的“next”指针的虚节点,并且其中所述用户节点具有指向下一节点的“next”指针;
(b)在所述入列步骤(a)之后,使所述虚节点从所述队列中出列;
(c)在所述出列步骤(b)之后,有条件地使头节点从所述队列中出列;
(d)在所述有条件的出列步骤(c)过程中,仅当所述队列包含仅一个用户节点时才使另一虚节点入列到所述队列的末尾。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US11/559,004 US7802032B2 (en) | 2006-11-13 | 2006-11-13 | Concurrent, non-blocking, lock-free queue and method, apparatus, and computer program product for implementing same |
US11/559,004 | 2006-11-13 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101183304A true CN101183304A (zh) | 2008-05-21 |
CN101183304B CN101183304B (zh) | 2012-04-18 |
Family
ID=39369155
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2007101675682A Expired - Fee Related CN101183304B (zh) | 2006-11-13 | 2007-10-26 | 并发非阻塞无锁队列及其实施方法和装置 |
Country Status (4)
Country | Link |
---|---|
US (1) | US7802032B2 (zh) |
JP (1) | JP5116442B2 (zh) |
KR (1) | KR100992017B1 (zh) |
CN (1) | CN101183304B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102906706A (zh) * | 2010-05-24 | 2013-01-30 | 索尼电脑娱乐公司 | 信息处理装置及信息处理方法 |
CN103262030A (zh) * | 2010-12-16 | 2013-08-21 | 英特尔公司 | 经由动态聚合操作的快速且线性化并发优先级队列 |
CN103262036A (zh) * | 2010-12-17 | 2013-08-21 | 英特尔公司 | 非阻塞无等待数据并行调度器 |
CN103294753A (zh) * | 2012-01-30 | 2013-09-11 | 辉达公司 | 无锁先入先出 |
CN104168217A (zh) * | 2014-08-15 | 2014-11-26 | 杭州华三通信技术有限公司 | 一种先入先出队列调度方法及装置 |
CN104915248A (zh) * | 2015-05-18 | 2015-09-16 | 北京京东尚科信息技术有限公司 | 计算机实现的商品提供/消费方法及系统 |
CN103793267B (zh) * | 2014-01-23 | 2017-07-21 | 腾讯科技(深圳)有限公司 | 队列的访问方法及装置 |
Families Citing this family (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8543743B2 (en) * | 2009-01-27 | 2013-09-24 | Microsoft Corporation | Lock free queue |
US9384063B2 (en) * | 2009-06-18 | 2016-07-05 | Microsoft Technology Licensing, Llc | Eliding synchronization in a concurrent data structure |
CN102004709B (zh) * | 2009-08-31 | 2013-09-25 | 国际商业机器公司 | 处理器局部总线到高级可扩展接口之间的总线桥及映射方法 |
JP5553685B2 (ja) * | 2010-05-24 | 2014-07-16 | 株式会社ソニー・コンピュータエンタテインメント | 情報処理装置および情報処理方法 |
JP5491282B2 (ja) * | 2010-05-26 | 2014-05-14 | 日本電信電話株式会社 | データ入出力装置、データ記憶方法及びプログラム |
DK2661845T3 (da) * | 2011-01-04 | 2014-11-10 | Napatech As | Apparat og fremgangsmåde til modtagelse og videresendelse af data |
WO2013086702A1 (en) * | 2011-12-14 | 2013-06-20 | Telefonaktiebolaget L M Ericsson (Publ) | Buffer resource management method and telecommunication equipment |
US9823931B2 (en) * | 2012-12-28 | 2017-11-21 | Nvidia Corporation | Queued instruction re-dispatch after runahead |
CN104424123B (zh) * | 2013-09-10 | 2018-03-06 | 中国石油化工股份有限公司 | 一种无锁数据缓冲区及其使用方法 |
KR101593170B1 (ko) * | 2014-08-19 | 2016-02-19 | 서울시립대학교 산학협력단 | 큐 저장장치의 데이터 처리 장치, 방법 및 그 기록매체 |
US10409800B2 (en) | 2015-08-03 | 2019-09-10 | Sap Se | Priority queue for exclusive locks |
CN106100912B (zh) * | 2016-08-25 | 2019-06-07 | 福州福大自动化科技有限公司 | 一种异常状态事件库的构建方法以及系统 |
US10423464B2 (en) * | 2016-09-30 | 2019-09-24 | Hewlett Packard Enterprise Patent Development LP | Persistent ticket operation |
US11681625B2 (en) * | 2018-12-20 | 2023-06-20 | Intel Corporation | Receive buffer management |
US11422856B2 (en) | 2019-06-28 | 2022-08-23 | Paypal, Inc. | Adaptive program task scheduling to blocking and non-blocking queues |
US11265227B2 (en) * | 2019-12-26 | 2022-03-01 | Paypal, Inc. | System and method for dynamic time estimates |
US11327793B2 (en) * | 2020-02-18 | 2022-05-10 | International Business Machines Corporation | Garbage collection work stealing mechanism |
CN112000588A (zh) * | 2020-07-30 | 2020-11-27 | 北京浪潮数据技术有限公司 | fifo链表管理方法、装置、设备及可读存储介质 |
US11693663B2 (en) | 2020-10-23 | 2023-07-04 | Ut-Battelle, Llc | Circular queue management with split indexes |
US20230185694A1 (en) * | 2021-12-10 | 2023-06-15 | International Business Machines Corporation | Debugging communication among units on processor simulator |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5671446A (en) * | 1995-03-16 | 1997-09-23 | Apple Computer, Inc. | Method and apparatus for atomically accessing a queue in a memory structure where LIFO is converted to FIFO |
US6523060B1 (en) * | 1995-04-07 | 2003-02-18 | Cisco Technology, Inc. | Method and apparatus for the management of queue pointers by multiple processors in a digital communications network |
US6668291B1 (en) * | 1998-09-09 | 2003-12-23 | Microsoft Corporation | Non-blocking concurrent queues with direct node access by threads |
US6636950B1 (en) * | 1998-12-17 | 2003-10-21 | Massachusetts Institute Of Technology | Computer architecture for shared memory access |
AU2001257403A1 (en) * | 2000-04-26 | 2001-11-07 | The Trustees Of Columbia University In The City Of New York | A low latency fifo circuit for mixed clock systems |
US6988186B2 (en) * | 2001-06-28 | 2006-01-17 | International Business Machines Corporation | Shared resource queue for simultaneous multithreading processing wherein entries allocated to different threads are capable of being interspersed among each other and a head pointer for one thread is capable of wrapping around its own tail in order to access a free entry |
US7249352B2 (en) * | 2002-08-22 | 2007-07-24 | International Business Machines Corporation | Apparatus and method for removing elements from a linked list |
US9448856B2 (en) * | 2005-12-30 | 2016-09-20 | Level 3 Communications, Llc | Lock-free dual queue with condition synchronization and time-outs |
-
2006
- 2006-11-13 US US11/559,004 patent/US7802032B2/en not_active Expired - Fee Related
-
2007
- 2007-10-26 CN CN2007101675682A patent/CN101183304B/zh not_active Expired - Fee Related
- 2007-10-30 JP JP2007281488A patent/JP5116442B2/ja not_active Expired - Fee Related
- 2007-11-02 KR KR1020070111488A patent/KR100992017B1/ko not_active IP Right Cessation
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102906706A (zh) * | 2010-05-24 | 2013-01-30 | 索尼电脑娱乐公司 | 信息处理装置及信息处理方法 |
US9658905B2 (en) | 2010-05-24 | 2017-05-23 | Sony Corporation | Information processing apparatus and method for carrying out multi-thread processing |
CN103262030A (zh) * | 2010-12-16 | 2013-08-21 | 英特尔公司 | 经由动态聚合操作的快速且线性化并发优先级队列 |
CN103262030B (zh) * | 2010-12-16 | 2015-12-09 | 英特尔公司 | 经由动态聚合操作的快速且线性化并发优先级队列 |
CN103262036A (zh) * | 2010-12-17 | 2013-08-21 | 英特尔公司 | 非阻塞无等待数据并行调度器 |
CN103294753A (zh) * | 2012-01-30 | 2013-09-11 | 辉达公司 | 无锁先入先出 |
CN103793267B (zh) * | 2014-01-23 | 2017-07-21 | 腾讯科技(深圳)有限公司 | 队列的访问方法及装置 |
CN104168217A (zh) * | 2014-08-15 | 2014-11-26 | 杭州华三通信技术有限公司 | 一种先入先出队列调度方法及装置 |
CN104168217B (zh) * | 2014-08-15 | 2018-01-09 | 新华三技术有限公司 | 一种先入先出队列调度方法及装置 |
CN104915248A (zh) * | 2015-05-18 | 2015-09-16 | 北京京东尚科信息技术有限公司 | 计算机实现的商品提供/消费方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
KR100992017B1 (ko) | 2010-11-05 |
US20080112423A1 (en) | 2008-05-15 |
JP2008123516A (ja) | 2008-05-29 |
CN101183304B (zh) | 2012-04-18 |
JP5116442B2 (ja) | 2013-01-09 |
US7802032B2 (en) | 2010-09-21 |
KR20080043226A (ko) | 2008-05-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101183304B (zh) | 并发非阻塞无锁队列及其实施方法和装置 | |
US8095727B2 (en) | Multi-reader, multi-writer lock-free ring buffer | |
US8689237B2 (en) | Multi-lane concurrent bag for facilitating inter-thread communication | |
US7627744B2 (en) | External memory accessing DMA request scheduling in IC of parallel processing engines according to completion notification queue occupancy level | |
US8584126B2 (en) | Systems and methods for enabling threads to lock a stage prior to processing data | |
EP2288989B1 (en) | Local collections of tasks in a scheduler | |
US9009711B2 (en) | Grouping and parallel execution of tasks based on functional dependencies and immediate transmission of data results upon availability | |
CN103999051B (zh) | 用于着色器核心中着色器资源分配的策略 | |
Stepner et al. | Embedded application design using a real-time OS | |
CN103608776A (zh) | 异构型处理设备上的动态工作划分 | |
CN103262002A (zh) | 优化系统调用请求通信 | |
CN103207810A (zh) | 计算任务状态封装 | |
EP3109778A1 (en) | Computer-implemented method of performing parallelized electronic-system level simulations | |
CN109460302B (zh) | 用于数据流式计算的内存管理系统及其方法 | |
CN109656868B (zh) | 一种cpu与gpu之间的内存数据转移方法 | |
CN114730273B (zh) | 虚拟化设备和方法 | |
CN104166539A (zh) | 并行原子递增 | |
JP2002287957A (ja) | キャッシュのような構造を使用してcpu設計におけるオペランド・アクセス・ステージを高速化するための方法及び装置 | |
CN104769553A (zh) | 用于支持集群中的工作共享复用的系统和方法 | |
CN102929708A (zh) | 一种实现智能卡多任务处理的方法 | |
RU2643622C1 (ru) | Вычислительный модуль | |
CN108415779A (zh) | 用于通过主机结构接口的队列管理的技术 | |
CN103593606A (zh) | 上下文信息管理方法及系统 | |
EP3660675B1 (en) | Sharing data by a virtual machine | |
CN114930292A (zh) | 协作式工作窃取调度器 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120418 Termination date: 20181026 |