CN102880518B - 实现公平可缩放的读者写者互斥的方法和装置 - Google Patents
实现公平可缩放的读者写者互斥的方法和装置 Download PDFInfo
- Publication number
- CN102880518B CN102880518B CN201210319993.XA CN201210319993A CN102880518B CN 102880518 B CN102880518 B CN 102880518B CN 201210319993 A CN201210319993 A CN 201210319993A CN 102880518 B CN102880518 B CN 102880518B
- Authority
- CN
- China
- Prior art keywords
- queue
- thread
- nodes
- reader
- queue nodes
- 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.)
- Active
Links
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
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Mobile Radio Communication Systems (AREA)
- Multi Processors (AREA)
- Executing Machine-Instructions (AREA)
Abstract
实现公平可缩放的读者写者互斥以便由处理***中多个处理线程访问临界段,通过如下完成:为第一线程在第一线程的栈上创建第一队列节点,该队列节点表示第一线程对访问临界段的请求;将第一节点加入由用于所述临界段的单字读者写者互斥体指向的队列,该队列表示期望访问临界段的线程列表,该队列中的每一队列节点位于所述多个处理线程中的一线程的栈上;等待直到由队列中的先前队列节点指示该第一队列节点没有在前的写入请求;由第一线程进入所述临界段;由第一线程退出所述临界段;以及从该队列中清除第一队列节点。
Description
本申请是PCT国际申请号为PCT/US2006/030521、国际申请日为2006年8月3日、中国国家申请号为200680031472.7、题为“实现公平可缩放的读者写者互斥的方法和装置”的申请的分案申请。
本专利文献所揭示的部分内容包含受到版权保护的材料。当其出现在专利商标局的专利文件或纪录中时,版权人不反对任何人复制本专利文件或专利揭示内容,但是保留任何版权所有。
技术领域
本发明一般地涉及多线程编程,尤其涉及在多线程编程环境下读者(reader)与写者(writer)的互斥(mutual exclusion)。
背景技术
互斥是一种编程技术,其通常通过使用信息量(semaphore)来确保同一时刻只有一个程序或例程可以访问某些资源,例如存储器位置、输入/输出(I/O)端口或文件,其中信息量是程序中用以协调一个以上程序或例程活动的标志。用于执行互斥(或互斥体(mutex))的对象可称为一个锁定(lock)。
读者-写者(RW)锁定允许多个读者查阅共享数据,或者允许单个写者排他地访问以修改此数据。在共享存储器的多处理器上,获得和释放这些锁定所需的开销对并行应用程序的性能有很大的影响。这些锁定初级实现 (其中处理器绕全局锁定变量旋转以等待锁定变为可用)的主要问题,是当所述锁定被竞争时,包含所述锁定的存储器以及连接到该存储器的互连网络也会被竞争。
现有技术的各种方法实现可缩放的排他锁定,即能够被竞争而不导致存储器或者互连竞争的排他锁定。这些方法取决于高速缓存硬件支持或者本地存储器的存在,其中访问本地存储器的等待时间低于访问远程存储器的等待时间。
在1991年4月在弗吉尼亚州威廉斯堡举行的第三届有关并行程序的原理和实践的ACM研讨会文集第106-113页(Proceedings ofthe 3rd ACM Symposiumon Principle and Practice of Parallel Programming,pp.106-113,Williamsburg,VA,April 1991)由John M.Mellor-Crummey和Michael L.Scott发表的“ScalableReader-Writer Synchronization for Shared-Memory Multiprocessors”一文中,作者描述了一种使用原子运算以建立等待处理器的单链表(singly linked list)的排他锁定。列表首部的处理器拥有该锁定,而新处理器则将自己加入列表尾部。与在绕全局锁定变量旋转不同,每一处理器在其本地存储器内绕一个变量旋转。处理器通过归零该变量来释放所述锁定,而下一个处理器在绕该变量旋转的队列中排队。
对于这种排他锁定的RW变量,每一队列元素包括一附加的变量来保存请求的状态。当新的读者请求达到时,就检查队列中前一元素的状态以确定新请求是否必须阻止。有了RW锁定,读者必须能够以任何顺序释放锁定。因此,当读者出队时,Mellor-Crummey和Soctt的单链表变得不连续。为了允许这种状况,在他们的排他锁定中加入两个全局变量,一个是活动读者数量的计数,一个是队列中第一写者的指针。当读者获得和释放锁定时,它们保持活动读者的全局计数最新。当释放锁定时,如果读者发现读者计数为零,其解除对全局变量指向的写者的阻止。
在1993年有关并行进程的国际会议文集(Proceedings of the 1993International Conference on Parallel Processing)中由Orran Krieger、MichaelStumm、Ron Unrau和Jonathan Hanna发表的“A Fair Fast Scalable Reader-WriterLock”一文中,作者描述了一种从Mellor-Crummey和Scott的排他锁定算法中导出的公平可缩放的RW锁定算法。在Krieger等人的方法中,并不是加入更多的全局状态(其可变为被竞争),而是把RW锁定需要的额外状态在与该锁定关联的列表中分配。更具体地,读者被保持在双链表(doubly linked list)中。利用双链表,代替对全局变量的同步,正在释放锁定的读者可与其最近的邻近读者同步以从队列中移除其本身。这允许读者以任何顺序出队而列表也不会变得不连续。因此,不必保持对第一写者的全局指针,也不必保持对活动读者数量的全局计数。
上面讨论的两种现有技术至少存在各种不足。在上述的每一方法中,不能将队列节点分配在栈中,因为有时调用者提供的队列节点会被其他线程读取或写入,甚至在调用者释放了互斥体上它的锁定之后。这些方法要求将队列节点分配在堆(heap)中,这比栈分配慢,并且可能需要获得该堆本身上的其他锁定。此外,这些方法要求队列节点在互斥体的生存期内永不被释放,也不能以某种方式被原子性地参考计数以确定何时释放它们是安全的(这在多线程环境中相比普通的读和写是开销巨大的)。这些方法还要求队列节点存在的时间比获得和释放锁定之间的时间更长。另外,Krieger等人的方法中,当读者在其前任已经观察到没有后继者可以解除阻止时预期会被其前任解除阻止时,有时允许读者阻止其他读者,这导致读者阻止直到所有之前的读者释放互斥体。
因此,多线程编程技术需要进一步改进以克服这些和其他缺陷。
发明内容
本发明提出了一种实现公平可缩放的读者写者互斥以便由处理***中多个处理线程访问临界段的方法,所述方法包括:为第一线程在所述第一线程的栈上创建第一队列节点,所述队列节点表示所述第一线程访问所述临界段的请求;将所述第一队列节点加入由用于所述临界段的单字读者写者互斥体指向的队列,所述队列表示期望访问所述临界段的线程列表,所述队列中的每一队列节点位于所述多个处理线程中的一线程的栈上;等待直到由所述队列上的先前队列节点指示所述第一队列节点没有在前的写入请求;由所述第一线程进入所述临界段;以及在所述第一线程退出所述临界段之后,从所述队列中移除所述第一队列节点,其中,作为读者的线程绝不阻止作为读者的另一线程。
本发明还提供了一种用于实现公平可缩放的读者写者互斥体以便由处理***中多个处理线程访问临界段的装置,所述装置包括:用于为第一线程在所述第一线程的栈上创建第一队列节点的装置,所述第一队列节点表示由所述第一线程对访问所述临界段的请求;用于将所述第一队列节点加入由用于所述临界段的单字读者写者互斥体指向的队列的装置,所述队列表示期望访问所述临界段的线程列表,所述队列中的每一队列节点位于所述多个处理线程中的一线程的栈上;用于等待直到由所述队列上的先前队列节点指示所述第一队列节点没有在前的写入请求的装置;用于由所述第一线程进入所述临界段的装置;以及用于在所述第一线程退出所述临界段之后从所述队列中移除所述第一队列节点的装置,其中,作为读者的线程绝不阻止作为读者的另一线程。
附图说明
通过下面的本发明的详细描述,本发明的特征和优点将会变得显而易见,其附图中:
图1是根据本发明一个实施例的读者写者互斥体的示例性队列的示意图;
图2是根据本发明一个实施例的队列节点的示意图;
图3是根据本发明一个实施例的使用具有读者写者互斥体的队列的流程图;
图4是根据本发明一个实施例并详细示出队列节点值的图1所示示例性队列的示意图;以及
图5是根据本发明一个实施例示出队列节点状态值UnblockNext的使用的示意图。
具体实施方式
本发明的一个实施例是一个读者-写者互斥体过程,该过程以克服在前读者-写者互斥体缺陷的方式实施读者和写者的互斥。处理线程在进入一临界段之前获得互斥体上的“读者锁定”或“写者锁定”,并在之后释放它们的锁定。互斥体的工作是确保若一写者在临界段(critical section)中,则该写者就是那里唯一的线程。典型地,读者-写者互斥体起到保护数据结构一致性的作用。希望修改此结构的线程只有在获得写者锁定之后才能这么做。读者-写者互斥体优于普通互斥体之处在于多个读者可同时进行,因此重要的是读者绝不阻止读者。
本说明书中引用本发明的“一个实施例”或“一实施例”意思是连同该实施例一起描述的特定特征、结构或特性是包含在本发明的至少一实施例中。于是,在本说明书中的不同位置多次出现的短语“在一个实施例中”并不一定指代同一实施例。
一线程在其进入临界段前可能不得不等待其他线程离开。本发明是“公平的”是因为它以“先到先服务”的顺序服务于线程,这确保没有线程会被阻延而一直等待。等待中的线程不应该消耗存储器带宽;否则它会减慢其他线程。等待通过“本地旋转”来完成,这意味着读取一个没有其他处理器会频繁接触的高速缓存线,直到其他线程更新此高速缓存线以告知“继续进行”。
RW互斥体可利用队列来实现。此队列包括零或更多个根据需要建立和销毁的队列节点。此互斥体包括指向队列尾部的单字(word)。在本发明的实施例以及此处的使用中,“字”定义处理***中需要用以储存指针值的存储器容量。当处理线程要求对互斥体保护的临界段进行读或写访问时,它们会将请求放到该队列上。访问请求由队列节点表示。每一线程提供将绕其旋转的队列节点。当队列节点位于队列首部时,创建此队列节点的线程会被授权访问该临界段。在本发明的一个实施例中,在线程的栈上创建队列节点。RW互斥体指向队列的尾部以指示下一个希望访问临界段的线程可被链接到哪里。
图1是根据本发明一个实施例的读者写者互斥体的示例性队列的示意图。图1示出处于不同阶段的4个线程。线程1100和线程2102是临界段内部的读者。线程1100包括栈104。线程1已于之前在其堆栈104中创建队列节点1106。队列节点1106目前是用于读者写者互斥体108的队列的首部。线程1还包括指令指针110以指定正在被此线程执行的当前指令。当线程1在临界段内时,指令指针引用临界段内的存储器。类似地,线程2102包括栈112。线程2已于之前在其栈112内创建队列节点2114并链接队列节点2到用于RW互斥体的队列中。线程2还包括指令指针116以指定正在被此线程执行的当前指令。当线程2在临界段内时,此指令指针引用临界段内的存储器。线程3118是一个写者,正等待2个之前的读者(即,线程1和2)离开后进入临界段。线程3包括包含队列节点3122的栈120,以及指令指针124。线程4126是一个读者,它正在其栈130上构建队列节点4128,准备将该节点加入到队列中。当线程4将队列节点4128加入队列后,线程4会等待直到之前的写者(线程3)发信号通知它已经离开临界段。一旦队列节点4128被加入队列中,读者写者互斥体108会变化以指向队列节点4128为队列的新尾部。线程4也包括指令指针130。
图2是根据本发明一个实施例的使用具有读者写者互斥体的队列的流程图。在框200,期望访问临界段的一线程在该线程的栈上创建队列节点。这是图1所示例子中线程4126所处的步骤。在框202,该线程将新创建的队列节点加入到队列的尾部。在框204,该线程通过绕其队列节点旋转来等待进入临界段。这是图1所示例子中线程3118所处的步骤。在框206,当线程获得锁定时,该线程被允许进入临界段。这是图1所示例子中线程1100和线程2102所处的步骤。在框208,线程退出临界段。在框210,线程从队列中移除该队列节点。最后,在框212,线程从线程的栈中删除该队列节点。
图3是根据本发明一个实施例的队列节点300的详细结构图。一个队列节点包括一个表示要获得互斥体并访问临界段的请求的数据结构,并且包括至少5个字段。NodeState(节点状态)字段302规定关于或对于拥有线程的信息。根据本发明的一个实施例,此值可为Writer(写者)、Reader(读者)UnblockNext(解除阻止下一个)或ActiveReader(活动读者)。Writer状态指示线程计划写入数据至临界段中。Reader状态指示线程计划读取临界段中的数据。根据本发明的一个实施例,UnblockNext状态让后续线程发信号通知它只是部分地链接了其自身的队列节点,因此当前线程应等待直到后续队列节点完全链接。ActiveReader状态指示该线程正在临界段中且活动地读取数据。Next(下一个)字段304是队列中的下一队列节点的指针(指向队列尾部)。Next字段指向储存在另一线程的栈内的队列节点。WaitState(等待状态)字段306规定线程的等待状态(线程是等待还是继续进行)。根据本发明的一个实施例,其类型可以是Spin(旋转)、Going(行进)或Busy(忙碌)。Spin状态指示线程正在等待。Going状态指示线程可访问临界段。根据本发明的实施例,Busy状态指示队列节点还不能被删除。这避免在所有线程完成访问队列节点之前太早的破坏它。Previous(前一,Prev)字段308是队列中前一队列节点的指针(指向队列首部)。根据本发明的实施例,Flag(标志)字段309可包括Previous字段中的一个否则不会被使用的位(例如,一低数位),作为协调从队列中移除队列节点的标志位。EL字段310包括一简单旋转互斥体,用于辅助从队列中间删除读者的原子性。
表I显示ReaderWriterMutex(读者写者互斥体)和QueueNode(队列节点)的内部结构。为了便于与现有技术比较,加下划线的文字指示本发明相对于Krieger等人的参考文献中披露的代码增加的代码,加删除线的文字表示本发明相对于Krieger等人的参考文献中披露的代码删除的代码。文体上和明显的修改未被标出。
表I
图4是根据本发明一个实施例的详细示出样本队列节点值的图1所示示例性队列的示意图。读者写者互斥体结构108包括指向队列尾部(Qtail)的指针。队列节点1106具有值为ActiveReader的NodeState字段,且队列节点1的WaitState字段被设置为Going,因为创建队列节点1的线程已访问临界段并且是读者。Next字段指向队列中的下一队列节点(即,队列节点2114)。Prev字段指向空(null),因为此队列节点是队列首部。队列节点1的EL字段是Unlocked(开锁)。类似地,队列节点214具有值为ActiveReader的NodeState字段,且队列节点2的WaitState字段被设置为Going,因为创建队列节点2的线程已访问临界段并且是读者。Next字段指向队列中的下一队列节点(如队列节点3122)。Prev字段指向队列节点1因为在队列中该队列节点在队列节点2的前面。队列节点2的EL字段是Unlocked。
对于队列节点3122,NodeState字段的值是Writer。Next字段指向null因为队列节点3当前是队列的尾部。WaitState字段被设置为Spin,因为队列节点3正在等待轮到其访问临界段。Prev字段指向队列中的前一队列节点(如队列节点2114)。队列节点3的EL字段是Unlocked。
对于队列节点4128,NodeState字段的值是Reader。Next字段和Prev字段指向null,因为此队列节点是新创建的,还未链接到队列。WaitState字段被设置为Spin,因为队列节点4正在等待轮到其访问临界段。Flag被设置为零。队列节点4的EL字段是Unlocked。
表II显示处理线程中的用于读者的典型调用顺序。相似的程序调用也可用于写者。在本发明的实施例中,调用中的线程可在其栈上分配其队列节点。Krieger等人和Mellor-Crummey的引用文献中所披露的技术对读者不允许如此。
表II
表III至VII描述本发明的实施例的附加运算。表III定义本发明的实施例所要求的原子运算。这些原子运算是FetchAndStore(取和储存)、CompareAndSwap(比较和交换)以及FetchAndAdd(取和加)。这些运算存在于大多数现代计算硬件中,尤其是可从Intel公司购得的处理器,例如名为IA-32的32位处理器架构,以及名为Itanium Processor Family(IPF)的64位架构。在表III中,“T”指示正被原子性更新的存储器位置的类型,“*”指示类型指针。
表III
表IV和V显示如何获得和释放“写者锁定”。这些程序与Krieger等人在参考文献中所披露的方法类似,并提供在此以帮助理解它们如何与本发明的实施例的技术相交互。符号“&x”指示指向位置x的指针的构造。当线程尝试获得互斥体上的写者锁定时(表IV),此线程使其队列节点入队,且如果其不是队列中的唯一节点,则等待其前任将其WaitState设置为Going。当该线程释放锁定(表V)且有一个后续队列节点时,此线程通过将后者的WaitState改变为Going发信号通知下一线程行进。
表IV
表V
表VI显示如何获得一个读者锁定。线程使用FetchAndStore程序调用来使其队列节点入队。如果线程有一个前任(其是队列尾部的旧队列节点),则其原子性地检查该前任是否有READER的NodeState,若是,则将NodeState字段送入UnblockNext状态。如果该前任不是ActiveReader,则此线程绕其自身的队列节点的WaitState字段旋转,直到其被先前的线程设置为Going。然后此线程设法原子性地转化其NodeState从Reader至ActiveReader。如果这失败了,则此线程指示其有一个需要被解除阻止的后继者。为解除阻止此后继者,此线程等待直到此后继者的队列节点被链接至队列(通过等待“node->Next!=NULL”),才设置此后继者的队列节点的WaitState为Going,且随后当前线程成为ActiveReader。
表VI
表VII显示如何释放读者锁定。此方法取决于在“Prev”指针字段中具有一未使用的位FLAG(例如,如果队列节点是16位排列的,则该指针的最低位可用作FLAG)。FLAG位用于协调两个线程试图移除队列中的相邻节点的情形。该线程使用FetchAndAdd程序调用以原子性地获取“Prev”,并同时通过设置FLAG位来标志其为“使用中”。(逻辑上说,这是一个“FetchAndOr(取和或)”,但是Intel处理器只支持FetchAndAdd,且在此情形下这两种运算是相同的,因为FLAG位在FetchAndAdd之前一直是0)。
表VII
如果有一个前任,则此线程设法获得绕该前任的旋转锁定。如果不能,这意味着前任的所有者正试图从队列中移除此前任,而当前线程应等待直到该移除已完成,并与新的前任重试。有趣的是,它通过旋转直至“node->Prev!=pred+FLAG”来检测此移除已完成,且随后在Pred->EL上释放此前任线程获得的锁定。此方案是不寻常的,因为线程释放了另一线程获得的锁定。否则,在已经成功获得前任的旋转锁定后,该线程获得绕其自身的队列节点的旋转锁定并将其从队列中移除,并注意在需要时更新队列尾部指针(“m->Qtail”)。它随后释放绕前任的旋转锁定并行进到“Unlock_Self”标签。
如果FetchAndAdd程序调用的结构指示没有前任,则线程获得绕其自身队列节点的旋转锁定。如果此线程没有后继者,则此线程尝试使用“CompareAndSwap(m->Qtail,NULL,node”)来改变队列为空。如果成功,处理在“Unlock_Self”标签继续。如果没有成功,这意味着另一线程正忙于附加一后续队列节点到队列,因此线程等待直到“node->Next!=NULL”。该线程随后发信号通知下一线程其可继续进行。这一信令需要小心执行,因为设置Prev字段为NULL或设置WaitState为Going都可能会导致拥有的线程继续进行,并可能在当前线程使用完此队列节点之前继续到销毁对应的队列节点的指针。为避免这一问题,当前线程在设置后继者的Prev指针为NULL及设置WaitState为Going之前,临时设置后继者的WaitState为Busy。在此也注意,该过程使用FetchAndStore来设置后继者的Prev字段,这对最后的“Unlock_Self”步骤是必须的。
表VII中的“Unlock_Self”步骤实现该协议。这里,变量tmp是当前节点断开链接之前的“node->Next->Prev”的值。如果tmp的FLAG位未被设置,则当前线程释放当前线程获得的绕其队列节点旋转锁定。但是如果FLAG位被设置,这指示后继队列节点的拥有者在重试循环中,而当前线程必须等待此后继线程释放当前线程获得的所述队列节点上的锁定。最后,此线程等待直到node->WaitState!=Busy,在这之后该线程获悉可安全返回(并销毁节点)。
图5是示出根据本发明一个实施例的NodeState值UnblockNext的使用的示意图。在此例中,有3个参与的线程,每一个在其栈上具有队列节点。拥有队列节点4502的线程已经作为读者进入临界段。其他2个队列节点最近已将它们的队列节点(队列节点5504和队列节点6506)加入到由读者写者互斥体500指向的队列中。队列节点5的拥有者尝试将其NodeState从Reader改变为ActiveReader。然而同时,在此尝试前,队列节点6506的拥有者将(队列节点5的)NodeState从Reader改变为UnblockNext,以便通知队列节点5的拥有者其具有一后继者,且应当等待直到其Next字段变为非空(即,如破折线箭头所示那样设置)。这些通知是在没有任何内部锁定的状况下被全部完成。
本发明的实施例具有至少3个优于绕本地存储器旋转的现有读者-写者互斥体的优点。首先,它允许在调用者的栈上分配队列节点。之前的读者-写者互斥体(如Kreiger等人和Mellor-Crummey等人的)不允许队列节点是栈分配的,因为由调用者提供的队列节点有时会被其他线程读取或写入,即使是在此调用者已经释放其在互斥体上的锁定之后。公知的现有技术要求队列节点是堆分配的,这通常比栈分配要慢,且确实会要求获得堆本身上的其他锁定。此外,公知的现有技术要求队列节点在互斥体的生存期内永不被释放,也无法以某种方式被原子性地参考计数以确定何时释放它们是安全的。相比普通的读和写而言,原子的参考计数本身在多线程环境中开销相对较大。本发明的实施例保证线程直到其他节点不再访问其队列节点时才离开互斥体释放程序;这样线程可在其自身的栈上分配其队列节点。
第二,本发明的实施例绝不允许读者阻止其他读者,正如Krieger等人的方法当读者在其前任已经观察到没有后继者要解除阻止时预期会被其前任解除阻止时有时会做的那样,这导致读者阻止直到所有之前的读者释放互斥体。
第三,本发明的实施例只为互斥体使用单字,而Mellor-Crummey等人的方法则需要3个字,这造成现有的设计在细粒度(fine-grained)的锁定的应用程序中大得多的开销。原因是通常在细粒度的情形下,每一数据元素均需要一互斥体,但一个线程只持有一个锁定(或少数锁定)。因此以可能造成锁定对象变大为代价来保持互斥体对象较小是值得的。
另一优点是本发明的实施例很好地符合C++的广泛用于异常安全代码编写的“资源获得是初始化”习惯。在将该习惯应用于互斥体的情况下,构建代表锁定获得的对象,而该对象的销毁则释放此锁定。如果在临界段中抛入异常,对象会被隐式地销毁,这样就自动释放锁定。这应用于本发明的各实施例是因为该对象本身可以是(或者作为成员包含)队列节点。Kreiger等人和Mellor-Crummey等人的现有技术参考文献都不允许这样经济的措施,因为他们要求队列节点的存在时间比获得和释放锁定之间的时间更长。
本发明的实施例通过具有一个从不引用可能已经被另一线程销毁的队列节点的协议,来启用队列节点的栈分配。这源于多种技术的使用。首先,使用原子运算和在Prev指针中的标记位,从而节点的拥有者可与前一节点的拥有者握手。使用原子运算和标记位之前已用于从链表中移除项目的无锁定算法(例如在2001年IEEE有关分布式计算的研讨会文集(Proc.Of 2001IEEESymposium on Distributed Computing)中由Timothy Harris发表的“A PragmaticImplementation of Non-Blocking Linked-Lists”一文中),但是在本发明的实施例中原子运算和标记位不仅用于移除握手,还用于控制哪一线程释放锁定。此外,在之前的无锁定算法中,项目中的链接可被其他线程使用,即使在其从列表中移除之后,且需要复杂的算法(如Harris的“timer snapshots(定时器快照)”)来确定何时可销毁该项目。第二,线程释放由另一线程持有的锁定。第三,加入额外的WaitState Busy,以发信号通知队列节点的拥有者他还不应销毁节点。第四,使用明智的读取和写入的排序。
此外,本发明的实施例设法只为互斥体部分使用单字,还能始终避免读者阻止读者。Krieger等人的方法具有单字的特征,但却面临读者阻止读者的问题。Mellor-Crummey没有读者阻止读者的问题,但互斥体却需要3个字。
尽管在此详细描述的操作是作为顺序流程来描述,但是某些操作事实上可以并行或同时执行。另外,在某些实施例中这些操作的顺序可重新安排。
在此描述的技术不限于任何特定硬件或软件配置;它们可在任何计算或处理环境中有适用性。这些技术可以由硬件、软件或二者的结合来实现。这些技术可用执行可编程机器上的程序实现,所述机器例如是移动或固定计算机、个人数字助理、机顶盒、蜂窝电话和寻呼机以及其他电子装置,每一个包含处理器、处理器可读取的存储介质(包括易失性和非易失性存储器和/或存储元件)、至少一输入装置、以及一个或多个输出装置。程序代码应用于使用所述输入装置输入的数据以执行所描述的功能和产生输出信息。所述输出信息可施加于一个或多个输出装置。本领域普通技术人员会理解,本发明可用多种计算机***配置实作,包括多处理器***、小型机、中型机等等,只要它们具有共享存储器并支持如表III所描述的原子运算。本发明还可于分布式计算环境中实作,其中任务可由通过通信网络连结的远程处理装置来执行。
可用高级程序或面向对象编程语言执行每一程序以与处理***交互。然而如果需要,可用汇编或机器语言执行程序。在任何情况下,语言可被编译或翻译。
可使用程序指令来促使用这些指令编程的通用或专用处理***来执行在此描述的操作。作为替代,可用包含用于执行这些操作的硬件化逻辑的特定硬件组件,或编程计算机组件和定制硬件组件的结合来执行这些操作。在此描述的方法可作为计算机程序产品提供,此产品可包括机器可访问介质,其上储存可用于对处理***或其他电子装置编程以执行这些方法的指令。在此使用的术语“机器可访问介质”应包括任何能够储存或编码一系列用于机器执行并导致该机器执行在此描述的方法任意之一的介质。术语“机器可访问介质”应相应地包括,但不限于,固态储存器、光或磁盘、以及编码数据信号的载波。而且,在本领域中通常以一种或另一种形式(例如程序、进程、流程、应用程序、模块、逻辑等等)提及软件发出一动作或产生一结果。这些表述仅仅是陈述软件被处理***执行而导致处理器执行产生一结果的动作的简单表述方法。
Claims (18)
1.一种实现公平可缩放的读者写者互斥以便对临界段进行访问的计算机实现方法,所述方法包括:
为在处理器上执行的多个处理线程的第一线程在所述第一线程的栈上创建第一队列节点,所述第一队列节点表示所述第一线程访问所述临界段的请求;
将所述第一队列节点加入由用于所述临界段的单字读者写者互斥体指向的队列,并将所述队列中的至少一个指针设置为指向所述第一队列节点,所述队列表示期望访问所述临界段的至少一个线程列表,所述第一队列节点被添加至所述队列的尾部,所述队列中的每一队列节点位于所述多个处理线程中的一线程的栈上;
等待直到条件符合,所述条件包括:所述第一队列节点由所述队列上的至少一个先前队列节点指示所述第一队列节点没有在前的写入请求;
响应于条件符合,允许所述第一线程进入所述临界段;以及
使所述第一线程释放旋转锁定,所述旋转锁定由所述多个处理线程的第二线程所获得。
2.如权利要求1所述的方法,其特征在于,作为读者的线程绝不阻止作为读者的另一线程。
3.如权利要求1所述的方法,其特征在于,还包括:
当第二队列节点已被所述多个处理线程的第三线程删除时,阻止所述第一线程引用所述第二队列节点的尝试。
4.如权利要求1所述的方法,其特征在于,当一读者线程将一队列节点部分地链接入所述队列之后且同时它的前一线程正试图获得所述临界段的读者写者互斥体上的锁定时,所述读者线程使得所述前一线程等待直到所述读者线程完成将所述队列节点链接入所述队列。
5.如权利要求1所述的方法,其特征在于,每一队列节点包括多个等待状态之一,且所述多个等待状态之一包含Busy状态,所述Busy状态指示一队列节点还不能被删除。
6.如权利要求1所述的方法,其特征在于,每一队列节点包括多个节点状态之一,且线程之间的节点状态的通知是由原子运算来完成的。
7.如权利要求6所述的方法,其特征在于,所述节点状态之一包括UnblockNext状态,所述UnblockNext状态允许后续线程发信号通知所述后续线程还只是部分地链接了所述后续线程的队列节点。
8.如权利要求1所述的方法,其特征在于,将队列中的至少一个指针设置为指向所述第一队列节点包括使用CompareAndSwap来将所述队列的尾部从空指针切换为指向所述第一队列节点。
9.如权利要求1所述的方法,其特征在于,所述队列上的每一队列节点是读者节点和写者节点中的一个。
10.一种用于实现公平可缩放的读者写者互斥体以便对临界段进行访问的装置,所述装置包括:
用于为在处理器上执行的多个处理线程的第一线程在所述第一线程的栈上创建第一队列节点的装置,所述第一队列节点表示由所述第一线程访问所述临界段的请求;
用于将所述第一队列节点加入由用于所述临界段的单字读者写者互斥体指向的队列,并将所述队列中的至少一个指针设置为指向所述第一队列节点的装置,所述队列表示期望访问所述临界段的至少一个线程列表,所述第一队列节点被添加至所述队列的尾部,所述队列中的每一队列节点位于所述多个处理线程中的一线程的栈上;
用于等待直到条件符合的装置,所述条件包括:所述第一队列节点由所述队列上的至少一个先前队列节点指示所述第一队列节点没有在前的写入请求;
用于响应于条件符合,允许所述第一线程进入所述临界段的装置;以及
用于使所述第一线程释放旋转锁定的装置,所述旋转锁定由所述多个处理线程的第二线程所获得。
11.如权利要求10所述的装置,其特征在于,作为读者的线程绝不阻止作为读者的另一线程。
12.如权利要求10所述的装置,其特征在于,还包括:
用于在第二队列节点已被所述多个处理线程的第三线程删除时阻止所述第一线程引用所述第二队列节点的尝试的装置。
13.如权利要求10所述的装置,其特征在于,当一读者线程将一队列节点部分地链接入所述队列之后且同时它的前一线程正试图获得所述临界段的读者写者互斥体上的锁定时,所述读者线程使得所述前一线程等待直到所述读者线程完成将所述队列节点连接入所述队列。
14.如权利要求10所述的装置,其特征在于,每一队列节点包括多个等待状态之一,且所述多个等待状态之一包含Busy状态,所述Busy状态指示一队列节点还不能被删除。
15.如权利要求10所述的装置,其特征在于,每一队列节点包括多个节点状态之一,且线程之间的节点状态的通知是由原子运算来完成的。
16.如权利要求15所述的装置,其特征在于,所述节点状态之一包括UnblockNext状态,所述UnblockNext状态允许后续线程发信号通知所述后续线程还只是部分地链接了所述后续线程的队列节点。
17.如权利要求10所述的装置,其特征在于,将队列中的至少一个指针设置为指向所述第一队列节点包括使用CompareAndSwap来将所述队列的尾部从空指针切换为指向所述第一队列节点。
18.如权利要求10所述的装置,其特征在于,所述队列上的每一队列节点是读者节点和写者节点中的一个。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US11/215,863 | 2005-08-30 | ||
US11/215,863 US7730491B2 (en) | 2005-08-30 | 2005-08-30 | Fair scalable reader-writer mutual exclusion |
Related Parent Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2006800314727A Division CN101253482B (zh) | 2005-08-30 | 2006-08-03 | 实现公平可缩放的读者写者互斥的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102880518A CN102880518A (zh) | 2013-01-16 |
CN102880518B true CN102880518B (zh) | 2015-04-22 |
Family
ID=37310844
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210319993.XA Active CN102880518B (zh) | 2005-08-30 | 2006-08-03 | 实现公平可缩放的读者写者互斥的方法和装置 |
CN2006800314727A Active CN101253482B (zh) | 2005-08-30 | 2006-08-03 | 实现公平可缩放的读者写者互斥的方法和装置 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2006800314727A Active CN101253482B (zh) | 2005-08-30 | 2006-08-03 | 实现公平可缩放的读者写者互斥的方法和装置 |
Country Status (4)
Country | Link |
---|---|
US (3) | US7730491B2 (zh) |
EP (1) | EP1920332B1 (zh) |
CN (2) | CN102880518B (zh) |
WO (1) | WO2007027365A1 (zh) |
Families Citing this family (61)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7730491B2 (en) * | 2005-08-30 | 2010-06-01 | Intel Corporation | Fair scalable reader-writer mutual exclusion |
US20070136289A1 (en) * | 2005-12-14 | 2007-06-14 | Intel Corporation | Lock elision with transactional memory |
US8028296B2 (en) * | 2006-03-31 | 2011-09-27 | Microsoft Corporation | Providing a wrapper around native synchronization objects |
US8516484B2 (en) | 2008-02-01 | 2013-08-20 | International Business Machines Corporation | Wake-and-go mechanism for a data processing system |
US8015379B2 (en) * | 2008-02-01 | 2011-09-06 | International Business Machines Corporation | Wake-and-go mechanism with exclusive system bus response |
US8171476B2 (en) | 2008-02-01 | 2012-05-01 | International Business Machines Corporation | Wake-and-go mechanism with prioritization of threads |
US8386822B2 (en) * | 2008-02-01 | 2013-02-26 | International Business Machines Corporation | Wake-and-go mechanism with data monitoring |
US8145849B2 (en) * | 2008-02-01 | 2012-03-27 | International Business Machines Corporation | Wake-and-go mechanism with system bus response |
US8127080B2 (en) | 2008-02-01 | 2012-02-28 | International Business Machines Corporation | Wake-and-go mechanism with system address bus transaction master |
US8880853B2 (en) | 2008-02-01 | 2014-11-04 | International Business Machines Corporation | CAM-based wake-and-go snooping engine for waking a thread put to sleep for spinning on a target address lock |
US8640141B2 (en) * | 2008-02-01 | 2014-01-28 | International Business Machines Corporation | Wake-and-go mechanism with hardware private array |
US8316218B2 (en) * | 2008-02-01 | 2012-11-20 | International Business Machines Corporation | Look-ahead wake-and-go engine with speculative execution |
US8250396B2 (en) * | 2008-02-01 | 2012-08-21 | International Business Machines Corporation | Hardware wake-and-go mechanism for a data processing system |
US8732683B2 (en) | 2008-02-01 | 2014-05-20 | International Business Machines Corporation | Compiler providing idiom to idiom accelerator |
US8225120B2 (en) | 2008-02-01 | 2012-07-17 | International Business Machines Corporation | Wake-and-go mechanism with data exclusivity |
US8788795B2 (en) * | 2008-02-01 | 2014-07-22 | International Business Machines Corporation | Programming idiom accelerator to examine pre-fetched instruction streams for multiple processors |
US8725992B2 (en) | 2008-02-01 | 2014-05-13 | International Business Machines Corporation | Programming language exposing idiom calls to a programming idiom accelerator |
US8312458B2 (en) | 2008-02-01 | 2012-11-13 | International Business Machines Corporation | Central repository for wake-and-go mechanism |
US8452947B2 (en) * | 2008-02-01 | 2013-05-28 | International Business Machines Corporation | Hardware wake-and-go mechanism and content addressable memory with instruction pre-fetch look-ahead to detect programming idioms |
US8612977B2 (en) * | 2008-02-01 | 2013-12-17 | International Business Machines Corporation | Wake-and-go mechanism with software save of thread state |
US8341635B2 (en) | 2008-02-01 | 2012-12-25 | International Business Machines Corporation | Hardware wake-and-go mechanism with look-ahead polling |
US8495642B2 (en) * | 2008-04-23 | 2013-07-23 | Red Hat, Inc. | Mechanism for priority inheritance for read/write locks |
US8266394B2 (en) * | 2008-07-14 | 2012-09-11 | International Business Machines Corporation | Methods for single-owner multi-consumer work queues for repeatable tasks |
US8230201B2 (en) * | 2009-04-16 | 2012-07-24 | International Business Machines Corporation | Migrating sleeping and waking threads between wake-and-go mechanisms in a multiple processor data processing system |
US8145723B2 (en) * | 2009-04-16 | 2012-03-27 | International Business Machines Corporation | Complex remote update programming idiom accelerator |
US8886919B2 (en) | 2009-04-16 | 2014-11-11 | International Business Machines Corporation | Remote update programming idiom accelerator with allocated processor resources |
US8082315B2 (en) * | 2009-04-16 | 2011-12-20 | International Business Machines Corporation | Programming idiom accelerator for remote update |
US8145817B2 (en) * | 2009-04-28 | 2012-03-27 | Microsoft Corporation | Reader/writer lock with reduced cache contention |
JP4385387B1 (ja) * | 2009-07-02 | 2009-12-16 | 修平 西山 | 属性付きキー・バリュー・ストアによるデータベース・システム |
US8510738B2 (en) | 2009-08-20 | 2013-08-13 | Microsoft Corporation | Preventing unnecessary context switching by employing an indicator associated with a lock on a resource |
US8943502B2 (en) * | 2010-03-15 | 2015-01-27 | International Business Machines Corporation | Retooling lock interfaces for using a dual mode reader writer lock |
US9652301B2 (en) * | 2010-09-15 | 2017-05-16 | Wisconsin Alumni Research Foundation | System and method providing run-time parallelization of computer software using data associated tokens |
US8949566B2 (en) * | 2010-12-02 | 2015-02-03 | International Business Machines Corporation | Locking access to data storage shared by a plurality of compute nodes |
CN102141932B (zh) * | 2010-12-14 | 2012-11-14 | 清华大学 | 大临界区保护方法 |
US8943510B2 (en) * | 2010-12-17 | 2015-01-27 | Microsoft Corporation | Mutual-exclusion algorithms resilient to transient memory faults |
US8527712B2 (en) * | 2011-05-13 | 2013-09-03 | Oracle International Corporation | Request to own chaining in multi-socketed systems |
US20130007322A1 (en) * | 2011-06-29 | 2013-01-03 | International Business Machines Corporation | Hardware Enabled Lock Mediation |
US9069566B1 (en) * | 2012-02-22 | 2015-06-30 | Hudku Technosoft Private Limited | Implementation of a multiple writer single reader queue in a lock free and a contention free manner |
KR20130118593A (ko) * | 2012-04-20 | 2013-10-30 | 한국전자통신연구원 | 데이터 분산 서비스를 위한 미들웨어에서 데이터를 처리하기 위한 장치 및 방법 |
CN102662747A (zh) * | 2012-04-23 | 2012-09-12 | 深圳市融创天下科技股份有限公司 | 一种线程访问临界区的方法、***和终端设备 |
CN102929711B (zh) * | 2012-09-24 | 2016-08-10 | 浙江大学 | 一种软件实时事务内存的实现方法 |
US9342380B2 (en) | 2013-03-05 | 2016-05-17 | Oracle International Corporation | System and method for implementing reader-writer locks using hardware transactional memory |
CN105765547A (zh) * | 2013-10-25 | 2016-07-13 | 超威半导体公司 | 用于执行总线锁定和转译后备缓冲器失效的方法和装置 |
US9329895B2 (en) | 2014-01-22 | 2016-05-03 | International Business Machines Corporation | Reader-writer lock |
US9304702B2 (en) | 2014-05-29 | 2016-04-05 | Netapp, Inc. | System and method for parallelized performance data collection in a computing system |
US9256477B2 (en) * | 2014-05-29 | 2016-02-09 | Netapp, Inc. | Lockless waterfall thread communication |
US9477521B2 (en) | 2014-05-29 | 2016-10-25 | Netapp, Inc. | Method and system for scheduling repetitive tasks in O(1) |
CN105512052B (zh) * | 2014-10-20 | 2019-01-01 | 伊姆西公司 | 用于处理输入输出操作请求的方法和装置 |
US9853908B2 (en) | 2014-11-25 | 2017-12-26 | Red Hat Inc. | Utilizing access control data structures for sharing computing resources |
US9798585B2 (en) * | 2015-05-19 | 2017-10-24 | Oracle International Corporation | Context switching with reader-writer locks |
US10599430B2 (en) | 2017-04-05 | 2020-03-24 | Cavium, Llc | Managing lock and unlock operations using operation prediction |
US10331500B2 (en) | 2017-04-05 | 2019-06-25 | Cavium, Llc | Managing fairness for lock and unlock operations using operation prioritization |
CN108768884A (zh) * | 2018-04-27 | 2018-11-06 | 江苏中科芯核电子科技有限公司 | 一种基于环形缓冲区的无线通信数据处理方法 |
CN115605846A (zh) * | 2018-05-04 | 2023-01-13 | 三星电子株式会社(Kr) | 用于在多核处理器中管理可共享资源的设备和方法 |
CN109558241A (zh) * | 2018-11-13 | 2019-04-02 | 锐捷网络股份有限公司 | 一种获取自旋锁的方法及装置 |
US11334627B2 (en) * | 2019-07-12 | 2022-05-17 | Arm Limited | Data processing |
CN112306698A (zh) * | 2019-07-29 | 2021-02-02 | 华为技术有限公司 | 一种numa***中的临界区执行方法及装置 |
CN111831413A (zh) * | 2020-07-01 | 2020-10-27 | Oppo广东移动通信有限公司 | 线程调度方法、装置、存储介质及电子设备 |
US20220253339A1 (en) * | 2021-02-05 | 2022-08-11 | Oracle International Corporation | Compact and Scalable Mutual Exclusion |
GB202217499D0 (en) * | 2022-11-23 | 2023-01-04 | Senseon Tech Ltd | Multithreaded architecture for enrichment processing of telemetry |
CN117171102B (zh) * | 2023-09-07 | 2024-01-26 | 山东九州信泰信息科技股份有限公司 | 一种多线程无锁高速写文件的方法 |
Family Cites Families (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5987496A (en) * | 1996-12-03 | 1999-11-16 | Mitsubishi Electric Information Technology Center America, Inc. (Ita) | Real-time channel-based reflective memory |
US6081665A (en) * | 1997-12-19 | 2000-06-27 | Newmonics Inc. | Method for efficient soft real-time execution of portable byte code computer programs |
US6237019B1 (en) | 1998-03-18 | 2001-05-22 | International Business Machines Corporation | Method and apparatus for performing a semaphore operation |
US6112222A (en) * | 1998-08-25 | 2000-08-29 | International Business Machines Corporation | Method for resource lock/unlock capability in multithreaded computer environment |
US6341302B1 (en) * | 1998-09-24 | 2002-01-22 | Compaq Information Technologies Group, Lp | Efficient inter-task queue protocol |
GB9825102D0 (en) * | 1998-11-16 | 1999-01-13 | Insignia Solutions Plc | Computer system |
US6480918B1 (en) * | 1998-12-22 | 2002-11-12 | International Business Machines Corporation | Lingering locks with fairness control for multi-node computer systems |
US6546443B1 (en) * | 1999-12-15 | 2003-04-08 | Microsoft Corporation | Concurrency-safe reader-writer lock with time out support |
US6823511B1 (en) * | 2000-01-10 | 2004-11-23 | International Business Machines Corporation | Reader-writer lock for multiprocessor systems |
US6684398B2 (en) * | 2000-05-31 | 2004-01-27 | Sun Microsystems, Inc. | Monitor entry and exit for a speculative thread during space and time dimensional execution |
US6934950B1 (en) * | 2000-06-06 | 2005-08-23 | International Business Machines Corporation | Thread dispatcher for multi-threaded communication library |
US7234139B1 (en) * | 2000-11-24 | 2007-06-19 | Catharon Productions, Inc. | Computer multi-tasking via virtual threading using an interpreter |
US7430627B2 (en) * | 2000-12-19 | 2008-09-30 | International Business Machines Corporation | Adaptive reader-writer lock |
GB0118294D0 (en) * | 2001-07-27 | 2001-09-19 | Ibm | Method and system for deadlock detection and avoidance |
US6965961B1 (en) * | 2002-03-01 | 2005-11-15 | University Of Rochester | Queue-based spin lock with timeout |
US20030200457A1 (en) * | 2002-04-23 | 2003-10-23 | International Business Machines Corporation | Enhancement to the MCS lock for increased functionality and improved programmability |
CN1212569C (zh) * | 2002-11-01 | 2005-07-27 | 英业达股份有限公司 | 多线程自动测试方法 |
US20040185845A1 (en) * | 2003-02-28 | 2004-09-23 | Microsoft Corporation | Access point to access point range extension |
US7200695B2 (en) * | 2003-09-15 | 2007-04-03 | Intel Corporation | Method, system, and program for processing packets utilizing descriptors |
US7493618B2 (en) * | 2003-09-19 | 2009-02-17 | International Business Machines Corporation | Fault tolerant mutual exclusion locks for shared memory systems |
US7260735B2 (en) * | 2003-12-18 | 2007-08-21 | Lsi Corporation | Method and system for maintaining a running count of events updated by two asynchronous processes |
US7770172B2 (en) * | 2004-09-01 | 2010-08-03 | Microsoft Corporation | Conditional variables without spinlocks |
US7844973B1 (en) * | 2004-12-09 | 2010-11-30 | Oracle America, Inc. | Methods and apparatus providing non-blocking access to a resource |
US20060143511A1 (en) * | 2004-12-29 | 2006-06-29 | Huemiller Louis D Jr | Memory mapped spin lock controller |
US7797704B2 (en) * | 2005-03-30 | 2010-09-14 | Hewlett-Packard Development Company, L.P. | System and method for performing work by one of plural threads using a lockable resource |
US20070044103A1 (en) * | 2005-07-25 | 2007-02-22 | Mark Rosenbluth | Inter-thread communication of lock protected data |
US7730491B2 (en) | 2005-08-30 | 2010-06-01 | Intel Corporation | Fair scalable reader-writer mutual exclusion |
US7962923B2 (en) * | 2005-12-30 | 2011-06-14 | Level 3 Communications, Llc | System and method for generating a lock-free dual queue |
-
2005
- 2005-08-30 US US11/215,863 patent/US7730491B2/en active Active
-
2006
- 2006-08-03 WO PCT/US2006/030521 patent/WO2007027365A1/en active Application Filing
- 2006-08-03 CN CN201210319993.XA patent/CN102880518B/zh active Active
- 2006-08-03 CN CN2006800314727A patent/CN101253482B/zh active Active
- 2006-08-03 EP EP06789441.0A patent/EP1920332B1/en active Active
-
2010
- 2010-05-18 US US12/782,394 patent/US8127303B2/en active Active
-
2012
- 2012-02-27 US US13/405,772 patent/US8707324B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
US8707324B2 (en) | 2014-04-22 |
EP1920332A1 (en) | 2008-05-14 |
US20100293553A1 (en) | 2010-11-18 |
WO2007027365A1 (en) | 2007-03-08 |
EP1920332B1 (en) | 2016-10-05 |
US7730491B2 (en) | 2010-06-01 |
US20120198471A1 (en) | 2012-08-02 |
CN101253482A (zh) | 2008-08-27 |
US8127303B2 (en) | 2012-02-28 |
US20070067774A1 (en) | 2007-03-22 |
CN102880518A (zh) | 2013-01-16 |
CN101253482B (zh) | 2012-11-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102880518B (zh) | 实现公平可缩放的读者写者互斥的方法和装置 | |
US8819684B2 (en) | Synchronizing multiple threads efficiently | |
CN100481012C (zh) | 数据库ram高速缓冲存储器 | |
US9400818B2 (en) | Highly scalable tree-based trylock | |
US9262234B2 (en) | Expedited module unloading for kernel modules that execute read-copy update callback processing code | |
Gelado et al. | Throughput-oriented GPU memory allocation | |
US20060069738A1 (en) | Multi-processor computer system | |
JPS5983249A (ja) | 待ち行列制御方法 | |
US20020029239A1 (en) | Method and system for enhanced concurrency in a computing environment | |
EP0533805A1 (en) | Method for efficient non-virtual main memory management | |
McKenney | Selecting locking primitives for parallel programming | |
CN101546275B (zh) | 一种获取多处理器硬件信号量的方法 | |
Cypher | The communication requirements of mutual exclusion | |
US7117496B1 (en) | Event-based synchronization | |
US6460121B1 (en) | Method for providing an atomic memory read using a compare-exchange instruction primitive | |
CN101135995A (zh) | 用于从别名地址池中移除别名地址的方法和设备 | |
Kirrmann et al. | Poolpo—a pool of processors for process control applications | |
David et al. | A secure two phase locking protocol | |
Allmaier et al. | Parallel shared-memory state-space exploration in stochastic modeling | |
US10983840B2 (en) | Consolidating read-copy update types having different definitions of a quiescent state | |
JPH01297760A (ja) | タスク制御方式及びオンライン・トランザクション・システム | |
CN102541743A (zh) | 用于存储管理的方法、设备和*** | |
CN106844242B (zh) | 一种数据交换方法和*** | |
US20050155010A1 (en) | Method, system and memory for replacing a module | |
Orlikowski | Single Producer–Multiple Consumers Ring Buffer Data Distribution System with Memory Management |
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 |