一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

处理环形缓冲器更新的制作方法

2021-11-05 18:39:00 来源:中国专利 TAG:

处理环形缓冲器更新
1.本公开涉及数据处理。更具体地讲,本公开涉及数据处理装置中环形缓冲器的管理。
2.各种数据处理上下文可生成要以特定顺序进行进一步处理的数据项,并且可对其进行管理的一种机制用于将那些生成的数据项保持在环形缓冲器中的排队序列中,其中将新生成的数据项添加到该排队序列的尾端,而从该排队序列的头端移除数据项以供进一步处理。保持在环形缓冲器中的该数据项排队序列可提供需要进一步处理的所生成的数据项的集中存储,在数据处理系统中操作的多个“生产者”可将所生成的数据项添加到该集中存储中,并且数据处理系统中的多个“消费者”可从该集中存储中移除数据项以供进一步处理。然而,多个生产者和消费者与环形缓冲器的这种交互可能意味着一个生产者或消费者相对于环形缓冲器的内容的动作可阻止其他生产者或消费者执行其自身与环形缓冲器的交互。在基于锁的方法中,一次只有一个生产者或消费者可访问环形缓冲器,并且因此这可能成为吞吐量的显著瓶颈。此外,即使在“无锁”环形缓冲器设计中,一个生产者或消费者仍可阻止其他生产者或消费者完成,这是由于以下约束条件,即其必须按照环形缓冲器获取顺序(即,按照数据项的排队序列的顺序)释放其对环形缓冲器的更新,以便保留环形缓冲器的正确排序和对其进行的更新。如果较早的生产者或消费者停下来(例如,在与另一个系统部件的交互中,例如高速缓存存储器未命中或被操作系统抢占),则较晚的生产者或消费者必须等待直到较早的生产者或消费者完成。这会产生非确定性(一个线程中的延迟和停顿可能传播到其他线程)并且还会产生可扩展性问题(因为多个线程正在它们之间有效地传递符号令牌以便完成,并且这会产生所有所涉及线程的序列化)。反之,将单个线程指定用于处理重新排序结果有可能导致单线程瓶颈。
3.在一个示例性实施方案中,存在一种装置,该装置包括:环形缓冲器存储电路,该环形缓冲器存储电路用于存储包括多个插槽的环形缓冲器以保持数据项的排队序列;数据处理电路,该数据处理电路用于执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽以及随后执行释放过程以释放该至少一个插槽;和环形缓冲器元数据存储电路,该环形缓冲器元数据存储电路用于存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示当前插槽的位置的当前插槽指示符和指示环形缓冲器的多个插槽中的一个或多个未决插槽的存在和位置的未决插槽指示符,并且该第二参考指示符包括指示当前插槽的预期位置的预期插槽指示符,一个或多个未决插槽已在当前插槽之后被获取,其中当该过程执行获取过程以获取环形缓冲器中的至少一个插槽时,预期插槽值是预期插槽指示符的值,其中释放过程包括尝试更新环形缓冲器的第一参考指示符,包括原子操作,在该原子操作中将过程的预期插槽值与当前插槽指示符进行比较,并且当当前插槽指示符匹配预期插槽值时,通过将当前插槽指示符的值修改预定值来更新至少当前插槽指示符,并且当当前插槽指示符不匹配预期插槽值时,通过修改未决插槽指示符的值来更新未决插槽指示符,以指示环形缓冲器的一个或多个未决插槽的存在和位置,而不更新当前插槽指示符。
4.在另一个示例性实施方案中,存在一种操作数据处理装置的方法,该方法包括以下步骤:为包括多个插槽的环形缓冲器分配存储装置以保持数据项的排队序列;执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中执行获取过程以获取环形缓冲器中的至少一个插槽,并且随后执行释放过程以释放该至少一个插槽;为环形缓冲器的元数据分配存储装置,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示当前插槽的位置的当前插槽指示符和指示环形缓冲器的多个插槽中的一个或多个未决插槽的存在和位置的未决插槽指示符,并且该第二参考指示符包括指示当前插槽的预期位置的预期插槽指示符,一个或多个未决插槽已在当前插槽之后被获取,其中当该过程执行获取过程以获取环形缓冲器中的至少一个插槽时,预期插槽值是预期插槽指示符的值,其中释放过程包括尝试更新环形缓冲器的第一参考指示符,包括原子操作,在该原子操作中将过程的预期插槽值与当前插槽指示符进行比较,并且当当前插槽指示符匹配预期插槽值时,通过将当前插槽指示符的值修改预定值来更新至少当前插槽指示符,并且当当前插槽指示符不匹配预期插槽值时,通过修改未决插槽指示符的值来更新未决插槽指示符,以指示环形缓冲器的一个或多个未决插槽的存在和位置,而不更新当前插槽指示符。
5.在另一个示例性实施方案中,存在一种装置,该装置包括:环形缓冲器存储电路,该环形缓冲器存储电路用于存储包括多个插槽的环形缓冲器以保持数据项的排队序列;指令解码器电路,该指令解码器电路用于对指令进行解码;数据处理电路,该数据处理电路用于执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽以及随后执行释放过程以释放该至少一个插槽;和环形缓冲器元数据存储电路,该环形缓冲器元数据存储电路用于存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示当前插槽的位置的当前插槽指示符和指示环形缓冲器的多个插槽中的一个或多个未决插槽的存在和位置的未决插槽指示符,并且该第二参考指示符包括指示当前插槽的预期位置的预期插槽指示符,一个或多个未决插槽已在当前插槽之后被获取,其中当该过程执行获取过程以获取环形缓冲器中的至少一个插槽时,预期插槽值是预期插槽指示符的值,其中指令解码器电路对要由数据处理电路执行的环形缓冲器释放指令做出响应,以控制数据处理电路执行释放过程,该释放过程包括以下步骤:尝试更新环形缓冲器的第一参考指示符,包括原子操作,在该原子操作中将过程的预期插槽值与当前插槽指示符进行比较,并且当当前插槽指示符匹配预期插槽值时,通过将当前插槽指示符的值修改预定值来更新至少当前插槽指示符,并且当当前插槽指示符不匹配预期插槽值时,通过修改未决插槽指示符的值来更新未决插槽指示符,以指示环形缓冲器的一个或多个未决插槽的存在和位置,而不更新当前插槽指示符。
6.在另一个示例性实施方案中,存在一种计算机程序,该计算机程序用于控制主机数据处理装置来提供指令执行环境,并且包括:环形缓冲器存储逻辑,该环形缓冲器存储逻辑用于存储包括多个插槽的环形缓冲器以保持数据项的排队序列;指令解码器逻辑,该指令解码器逻辑用于对指令进行解码;数据处理逻辑,该数据处理逻辑用于执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽
以及随后执行释放过程以释放该至少一个插槽;和环形缓冲器元数据存储逻辑,该环形缓冲器元数据存储逻辑用于存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示当前插槽的位置的当前插槽指示符和指示环形缓冲器的多个插槽中的一个或多个未决插槽的存在和位置的未决插槽指示符,并且该第二参考指示符包括指示当前插槽的预期位置的预期插槽指示符,一个或多个未决插槽已在当前插槽之后被获取,其中当该过程执行获取过程以获取环形缓冲器中的至少一个插槽时,预期插槽值是预期插槽指示符的值,其中指令解码器逻辑对要由数据处理逻辑执行的环形缓冲器释放指令做出响应,以控制数据处理逻辑执行释放过程,该释放过程包括以下步骤:尝试更新环形缓冲器的第一参考指示符,包括原子操作,在该原子操作中将过程的预期插槽值与当前插槽指示符进行比较,并且当当前插槽指示符匹配预期插槽值时,通过将当前插槽指示符的值修改预定值来更新至少当前插槽指示符,并且当当前插槽指示符不匹配预期插槽值时,通过修改未决插槽指示符的值来更新未决插槽指示符,以指示环形缓冲器的一个或多个未决插槽的存在和位置,而不更新当前插槽指示符。
7.在另一个示例性实施方案中,存在一种装置,该装置包括:环形缓冲器存储电路,该环形缓冲器存储电路用于存储包括多个插槽的环形缓冲器以保持数据项的排队序列;数据处理电路,该数据处理电路用于执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽;和环形缓冲器元数据存储电路,该环形缓冲器元数据存储电路用于存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示处于数据项排队序列的一端处的当前插槽的位置的当前插槽指示符,并且该第二参考指示符包括指示处于数据项排队序列的另一端处的当前插槽的预期位置的预期插槽指示符,其中数据项排队序列的该一端是数据项排队序列的头端或尾端,其中获取过程包括尝试更新环形缓冲器的第二参考指示符,包括原子操作,在该原子操作中将过程所请求获取的插槽的数量与当前插槽指示符和预期插槽指示符进行比较,并且当当前插槽指示符和预期插槽指示符指示环形缓冲器中的一个或多个插槽有资格用于获取时,通过修改预期插槽指示符的值来更新预期插槽指示符。
8.在另一个示例性实施方案中,存在一种操作数据处理装置的方法,该方法包括以下步骤:为包括多个插槽的环形缓冲器分配存储装置以保持数据项的排队序列;执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中执行获取过程以获取环形缓冲器中的至少一个插槽;为环形缓冲器的元数据分配存储装置,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示处于数据项排队序列的一端处的当前插槽的位置的当前插槽指示符,并且该第二参考指示符包括指示处于数据项排队序列的另一端处的当前插槽的预期位置的预期插槽指示符,其中数据项排队序列的该一端是数据项排队序列的头端或尾端,其中获取过程包括尝试更新环形缓冲器的第二参考指示符,包括原子操作,在该原子操作中将过程所请求获取的插槽的数量与当前插槽指示符和预期插槽指示符进行比较,并且当当前插槽指示符和预期插槽指示符指示环形缓冲器中的一个或多个插槽有资格用于获取时,通过修改预期插槽指示符的值来更新预期插槽指示符。
9.在另一个示例性实施方案中,存在一种装置,该装置包括:环形缓冲器存储电路,
该环形缓冲器存储电路用于存储包括多个插槽的环形缓冲器以保持数据项的排队序列;指令解码器电路,该指令解码器电路用于对指令进行解码;数据处理电路,该数据处理电路用于执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽;和环形缓冲器元数据存储电路,该环形缓冲器元数据存储电路用于存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示处于数据项排队序列的一端处的当前插槽的位置的当前插槽指示符,并且该第二参考指示符包括指示处于数据项排队序列的另一端处的当前插槽的预期位置的预期插槽指示符,其中数据项排队序列的该一端是数据项排队序列的头端或尾端,其中指令解码器电路对要由数据处理电路执行的环形缓冲器获取指令做出响应,以控制数据处理电路执行获取过程,该获取过程包括以下步骤:尝试更新环形缓冲器的第二参考指示符,包括原子操作,在该原子操作中将过程所请求获取的插槽的数量与当前插槽指示符和预期插槽指示符进行比较,并且当当前插槽指示符和预期插槽指示符指示环形缓冲器中的一个或多个插槽有资格用于获取时,通过修改预期插槽指示符的值来更新预期插槽指示符。
10.在另一个示例性实施方案中,存在一种计算机程序,该计算机程序用于控制主机数据处理装置来提供指令执行环境,并且包括:环形缓冲器存储逻辑,该环形缓冲器存储逻辑用于存储包括多个插槽的环形缓冲器以保持数据项的排队序列;指令解码器逻辑,该指令解码器逻辑用于对指令进行解码;数据处理逻辑,该数据处理逻辑用于执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽;和环形缓冲器元数据存储逻辑,该环形缓冲器元数据存储逻辑用于存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示处于数据项排队序列的一端处的当前插槽的位置的当前插槽指示符,并且该第二参考指示符包括指示处于数据项排队序列的另一端处的当前插槽的预期位置的预期插槽指示符,其中数据项排队序列的该一端是数据项排队序列的头端或尾端,其中指令解码器逻辑对要由数据处理逻辑执行的环形缓冲器获取指令做出响应,以控制数据处理逻辑执行获取过程,该获取过程包括以下步骤:尝试更新环形缓冲器的第二参考指示符,包括原子操作,在该原子操作中将过程所请求获取的插槽的数量与当前插槽指示符和预期插槽指示符进行比较,并且当当前插槽指示符和预期插槽指示符指示环形缓冲器中的一个或多个插槽有资格用于获取时,通过修改预期插槽指示符的值来更新预期插槽指示符。
11.将参考如附图所示的本技术的实施方案,仅以举例的方式进一步描述本技术,将结合以下描述来阅读这些实施方案,其中:
12.图1示意性地示出了根据本公开的实施方案的数据处理装置;
13.图2示意性地示出了根据本公开的实施方案的环形缓冲器以及由生产者和消费者参考头部指针和尾部指针从该环形缓冲器添加和移除数据项;
14.图3示意性地示出了生产者是如何因为先前的生产者尚未完成其更新的释放而可能被阻止释放其更新的;
15.图4a示出了根据本公开的实施方案的包括第一参考指示符和第二参考指示符的环形缓冲器元数据;
16.图4b示出了根据本公开的实施方案的用于跟踪数据项排队序列的尾端的环形缓冲器元数据;
17.图4c示出了根据本公开的实施方案的用于跟踪数据项排队序列的头端的环形缓冲器元数据;
18.图5示出了根据本公开的实施方案的环形缓冲器元数据;
19.图6示出了当系统部件执行原子获取操作时在一个实施方案的方法中采取的步骤的序列;
20.图7示出了当系统部件试图更新本技术的第二参考指示符时所采取的步骤的序列;
21.图8示出了当系统部件执行原子释放操作时在一个实施方案的方法中采取的步骤的序列;
22.图9示出了当系统部件试图更新本技术的第一参考指示符时所采取的步骤的序列;
23.图10示意性地示出了根据本公开的实施方案的数据处理装置;并且
24.图11示意性地示出了系统的部件,该系统在一个实施方案中提供模拟器具体实施。
25.至少一些实施方案提供了一种装置,该装置包括:环形缓冲器存储电路,该环形缓冲器存储电路用于存储包括多个插槽的环形缓冲器以保持数据项的排队序列;数据处理电路,该数据处理电路用于执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽以及随后执行释放过程以释放该至少一个插槽;和环形缓冲器元数据存储电路,该环形缓冲器元数据存储电路用于存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示当前插槽的位置的当前插槽指示符和指示环形缓冲器的多个插槽中的一个或多个未决插槽的存在和位置的未决插槽指示符,并且该第二参考指示符包括指示当前插槽的预期位置的预期插槽指示符,一个或多个未决插槽已在当前插槽之后被获取,其中当该过程执行获取过程以获取环形缓冲器中的至少一个插槽时,预期插槽值是预期插槽指示符的值,其中释放过程包括尝试更新环形缓冲器的第一参考指示符,包括原子操作,在该原子操作中将过程的预期插槽值与当前插槽指示符进行比较,并且当当前插槽指示符匹配预期插槽值时,通过将当前插槽指示符的值修改预定值来更新至少当前插槽指示符,并且当当前插槽指示符不匹配预期插槽值时,通过修改未决插槽指示符的值来更新未决插槽指示符,以指示环形缓冲器的一个或多个未决插槽的存在和位置,而不更新当前插槽指示符。
26.本技术认识到,在使用环形缓冲器作为排队序列的数据处理系统中,多个独立的行动者(例如线程)将要处理的数据项添加到排队序列(即是“生产者”)并且从排队序列中移除数据项以供处理(即是“消费者”),除非这些行动者仅相对于必须处理数据项序列的顺序以严格的按次序方式操作(如果试图允许越来越多的行动者与环形缓冲器交互,则这将导致显著的可扩展性问题),否则为了允许可扩展性,行动者需要能够无序地释放其更新。
27.一般来讲,存在用于将要处理的数据项添加到排队序列的尾端的3步入队操作和用于从排队序列的头端移除数据项以供进一步处理的3步出队操作。该3步入队操作通过以
下操作来执行:首先获取环形缓冲器中的插槽(或多个插槽),其次将元素写入所获取的插槽,并且再次释放所获取的插槽。类似地,该3步出队操作通过以下操作来执行:首先获取环形缓冲器中的插槽(或多个插槽),其次从所获取的插槽读取元素,并且再次释放所获取的插槽。这在具有单个生产者和单个消费者的系统中是相对简单的过程,在这种情况下自然是无锁的。然而,在包括多个生产者和多个消费者的系统的情况下,入队操作和出队操作需要与环形缓冲器交互的独立行动者之间的同步。具体地讲,在多个生产者(或消费者)各自与环形缓冲器交互以在排队序列的尾端(或头端)处添加(或移除)一个或多个数据项的情况下,每个生产者(或消费者)尝试在排队序列的尾端(或头端)处获取给定数量的插槽并且随后释放所获取的插槽。这样,一个生产者(或消费者)可能阻止其他生产者(或消费者)完成,这是由于以下约束条件,即其必须按照环形缓冲器获取顺序(即,按照数据项的排队序列的顺序)释放其对环形缓冲器的更新。
28.本技术利用环形缓冲器元数据来打破多个独立行动者之间的相互依赖关系,以允许多个独立行动者并行地执行并且相对于排队序列的顺序以无序方式释放其更新,同时保留数据项序列的顺序。为此,本技术提供了包括可通过原子操作访问的第一参考指示符和第二参考指示符的环形缓冲器元数据。多个独立行动者可各自以无序方式更新该环形缓冲器元数据,使得每个行动者可引起元数据的改变以标记其更新以供稍后释放。因此,环形缓冲器元数据可由已完成入队操作或出队操作的行动者更新,以便提供表明环形缓冲器中的哪些插槽是未决释放的指示,使得环形缓冲器元数据可随后按照根据获取插槽的顺序释放插槽的方式进行更新。该环形缓冲器元数据可允许独立的行动者相对于必须处理数据项序列的顺序按次序和无序地释放其更新,从而提供非阻止式环形缓冲器释放具体实施。相应的行动者可同时与环形缓冲器交互以释放其更新,并且可通过以原子方式更新第一参考指示符来保留数据项序列的排序,其中尝试释放更新(无论是按次序还是无序地)的行动者可更新第一参考指示符以修改与第一参考指示符相关联的至少一个值,使得每个行动者能够修改环形缓冲器元数据,即使该行动者正在以无序方式释放也如此。此外,本技术提供了环形缓冲器元数据存储装置,其用于将环形缓冲器的元数据存储在存储器中,该元数据可由处理器内核所执行的相应独立行动者通过基于“远”原子执行元数据操作来访问(“远”原子就其意义而言是指原子操作访问该存储器中或存储器系统中更远离内核的高速缓存存储器中的数据,而不是以原子方式访问紧密耦合的高速缓存存储器中的数据的“近”原子)。用于执行环形缓冲器元数据的原子存储器更新的此类“远”原子操作的具体实施意味着相应的行动者可同时尝试以减少与窥探相关联的延迟(即,窥探延迟)的方式更新环形缓冲器元数据,因为可避免或限制会引起窥探延迟增加的对元数据的“近”访问。这允许独立行动者更新环形缓冲器元数据,以便与环形缓冲器进行交互以释放更新,并且可减少由于多个行动者尝试同时访问元数据而由争夺环形缓冲器元数据而引起的延迟。此类“远”原子操作的具体实施可减少与窥探相关联的延迟,并且从而允许减少执行每个元数据操作所需的时间,使得元数据操作可由行动者以更大的频率执行,这改善了可扩展性,因为更多的内核可同时在环形缓冲器上操作。
29.第一参考指示符包括指示环形缓冲器的多个插槽中的当前插槽的位置的当前插槽指示符和指示环形缓冲器的多个插槽中的一个或多个未决插槽的存在和位置的未决插槽指示符,该一个或多个未决插槽已相对于排队序列的顺序在当前插槽之后被获取。当前
插槽指示符指示环形缓冲器中的位置,该位置表示数据项排队序列的尾端或头端的当前位置。例如,对于包括2
n
个插槽的环形缓冲器(即,具有2
n
个元素的环形缓冲器,其中n是整数),当前插槽指示符可用于提供表明环形缓冲器中哪个插槽对应于最旧数据项(在头端处)或环形缓冲器中哪个插槽对应于最新数据项(在尾端处)的指示。这样,当前插槽指示符可以是标量值,该标量值能够表示在给定时间环形缓冲器中的任何给定插槽的位置,这取决于排队序列的头端或尾端在环形缓冲器中的位置。应当理解,当前插槽指示符可通过指示可用于写入的空(未使用的)插槽的位置或者不可用于写入但可用于消费(读取)的非空(使用的)插槽的位置来指示环形缓冲器中的当前插槽的位置,以表示数据项排队序列的端部(头部或尾部)的位置。
30.此外,第一参考指示符包括指示环形缓冲器的多个插槽中的一个或多个未决插槽的位置的未决插槽指示符。未决插槽指示符可由无序地释放其更新的行动者更新,使得未决插槽指示符指示环形缓冲器中至少一个未决插槽的存在(可能不存在未决插槽)并且还在未决插槽被指示为存在时指示环形缓冲器中至少一个未决插槽的位置。未决插槽指示符可例如是标量值,该标量值指示插槽在环形缓冲器中的位置,针对该插槽,入队操作(头端)或出队操作(尾端)已由行动者完成并且已由行动者无序地释放并且由环形缓冲器未决释放。
31.这样,第一参考指示符提供:对环形缓冲器的当前插槽的位置的指示;关于是否存在已由与环形缓冲器交互的行动者无序地释放的一个或多个更新的指示;以及对环形缓冲器中对应于由与环形缓冲器交互的行动者无序地释放的一个或多个更新的一个或多个未决插槽的位置的指示。因此,第一参考指示符可例如用作数据项排队序列的当前插槽的头部指针或尾部指针,同时还指示排队序列的一个或多个未决插槽分别在头端或尾端处的存在和位置。当系统中的行动者希望释放更新(以在完成从插槽读取或向插槽写入之后释放所获取的插槽)时,环形缓冲器的元数据可由行动者以原子方式访问,并且第一参考指示符可被更新以允许行动者通过更新第一参考指示符的当前插槽指示符或未决插槽指示符来释放更新。这样,第一参考指示符可由相对于数据项排队序列的顺序按次序释放其更新的行动者以及也由相对于数据项排队序列的顺序无序地释放其更新的行动者更新,并且因此,行动者不局限于按照环形缓冲器获取顺序将其更新释放到环形缓冲器,并且因此可实现非阻止式环形缓冲器释放具体实施。
32.第二参考指示符包括指示环形缓冲器的当前插槽的预期位置的预期插槽指示符。与环形缓冲器交互的给定行动者可尝试更新第二参考指示符,以便获取环形缓冲器中的一个或多个插槽以写入(生产者)或从(消费者)读取。生产者或消费者可能希望获取环形缓冲器的一个或多个插槽并且将尝试更新第二参考指示符以获取一个或多个插槽,该尝试包括访问环形缓冲器元数据的原子操作(原子获取操作)。例如,生产者可能希望在排队序列的尾端处获取一个或多个插槽,并且因此将尝试访问环形缓冲器元数据并通过修改与第二参考指示符相关联的值来更新第二参考指示符以指向另一个插槽,使得随后尝试在排队序列的尾端处获取一个或多个插槽的其他生产者不能获取已经由第一生产者获取的插槽。当生产者或消费者执行获取过程并且成功地获取环形缓冲器中的一个或多个插槽时,为生产者或消费者返回预期插槽值。当生产者或消费者获取环形缓冲器中的一个或多个插槽时,预期插槽值是预期插槽指示符的值。这样,在过程获取环形缓冲器中的一个或多个插槽时指
示预期插槽指示符的值的预期插槽值可被保持用于该过程,并且当该过程随后尝试释放一个或多个插槽时,该预期插槽值可随后与第一参考指示符进行比较。这样,过程的预期插槽值与第一参考指示符的比较可提供表明该过程是试图相对于数据项排队序列的顺序以无序方式还是按次序方式释放所获取的插槽的指示。在一些示例中,过程可成功地获取环形缓冲器中的x个插槽(x>1),并且当该过程获取x个插槽时,预期插槽值可提供对预期插槽指示符的值的指示。这样,预期插槽值与当前插槽指示符的比较可以是范围比较,其中当前插槽指示符与由预期插槽值和所获取插槽的数量的组合给定的范围进行比较。例如,如果该过程获取两个插槽,并且在该过程获取两个插槽时预期插槽指示符的值为n,则由n和与由n指示的插槽相邻的插槽限定的范围可用于与当前插槽指示符进行比较。
33.本技术认识到,环形缓冲器元数据可被存储在存储器中并且由执行原子操作以获取和释放插槽的行动者访问,并且环形缓冲器元数据可保留排队序列的排序。虽然可通过访问和更新第二参考指示符来获取插槽,但是行动者完成并因此尝试释放其插槽的顺序可不同于获取插槽的顺序,并且行动者因此可尝试以访问和更新第二参考指示符的不同顺序访问和更新第一参考指示符。当行动者成功地更新第二参考指示符时,修改预期插槽指示符的值以指示该行动者已获取环形缓冲器中的一个或多个插槽。对应于在行动者获取一个或多个插槽时的预期插槽指示符的值的预期插槽值被返回给行动者并且由行动者在尝试释放所获取的插槽时用来查实行动者是按次序还是无序地释放(即,行动者所预期的插槽位置是基于在行动者获取一个或多个插槽时第二参考指示符的值)。当行动者完成对一个或多个所获取的插槽的写入或从一个或多个所获取的插槽的读取并且试图释放一个或多个所获取的插槽时,通过使用在获取插槽时为行动者返回的预期插槽值,行动者可尝试通过以原子方式访问环形缓冲器元数据并将预期插槽值与第一参考指示符的当前插槽指示符进行比较来更新环形缓冲器的第一参考指示符。因此,应当理解,原子释放操作包括行动者尝试更新第一参考指示符,其中行动者将预期插槽值与第一参考指示符进行比较。具体地讲,行动者尝试基于预期插槽值与当前插槽指示符的值的比较来以原子方式更新第一参考指示符,并且行动者更新第一参考指示符的方式取决于由预期插槽值指示的当前插槽的预期位置是否匹配由第一参考指示符的当前插槽指示符指示的当前插槽的位置。
34.在一些实施方案中,当当前插槽指示符不匹配预期插槽值并且预期插槽指示符指示当前插槽的相对于排队序列的顺序不处于由当前插槽指示符指示的当前插槽之后的预期位置时,不更新第一参考指示符。
35.本技术认识到,尽管过程尝试以原子方式访问和更新第一参考指示符,但其他过程可同时尝试以原子方式访问和更新第一参考指示符以释放插槽。当过程的预期插槽值不匹配第一参考指示符的当前插槽指示符的值时,这指示该过程尝试相对于数据项排队序列的顺序无序地释放插槽。当过程的预期插槽值不匹配当前插槽指示符的值并且预期插槽值还指示相对于数据项排队序列的排序不位于当前插槽的位置之后的插槽的位置时,这指示该过程未尝试释放相对于序列的排序在前面的插槽(该过程未尝试相对于序列的排序提早释放插槽)。在这种情况下,该过程在不更新第一参考指示符的情况下完成释放过程,因为该过程尝试释放相对于排队序列的排序“在后面”的插槽,并且插槽的释放已在第一参考指示符中得到反映。
36.在一些实施方案中,当当前插槽指示符不匹配预期插槽值时,通过修改未决插槽
指示符的值来更新未决插槽指示符,以指示环形缓冲器中的一个或多个未决插槽相对于由当前插槽指示符指示的当前插槽的存在和位置。
37.本技术认识到,当过程的预期插槽值不匹配第一参考指示符的当前插槽指示符的值并且预期插槽值还指示相对于数据项排队序列的排序位于当前插槽的位置之后的插槽的位置时,这指示该过程在尝试释放相对于序列的顺序是无序的且“在前面”的插槽。换句话讲,这指示该过程在另一个过程已释放了序列中早于该过程正在尝试释放的插槽的另一个插槽之前尝试释放该插槽。在这种情况下,当执行释放过程时,该过程以原子方式访问第一参考指示符并且更新未决插槽指示符以指示存在一个或多个未决插槽。
38.在一些实施方案中,未决插槽指示符包括极限指示符,该极限指示符指示相对于排队序列的顺序位于距环形缓冲器中的当前插槽最远的最远未决插槽的位置。
39.在一些实施方案中,未决插槽指示符包括变化指示符,该变化指示符的变化指示当前插槽与最远未决插槽之间的未决插槽的数量的变化。
40.本技术提供了未决插槽指示符,该未决插槽指示符包括极限指示符以指示环形缓冲器中最远未决插槽的位置。此外,未决插槽指示符可包括变化指示符,其中该变化指示符的变化指示存在于由当前插槽指示符指示的当前插槽与由极限指示符指示的最远未决插槽之间的未决插槽的数量的变化。过程可通过改变变化指示符来释放位于当前插槽与最远未决插槽之间的插槽,使得指示附加未决插槽的存在。
41.取决于在过程更新未决插槽指示符时未决插槽指示符的配置(例如,是否存在一个或多个未决插槽或者是否不存在未决插槽),可更新极限指示符或变化指示符或者可更新极限指示符和变化指示符两者。例如,排队序列的顺序可以是使得插槽a之后跟着插槽b,插槽b之后跟着插槽c,以此类推。在这种情况下,如果当前插槽指示符所指示的当前插槽是插槽a并且过程希望在插槽b或插槽c被释放之前释放插槽d,则该过程将更新极限指示符以将插槽d的存在和位置指示为未决插槽。这样,插槽d的位置可被指示为最远未决插槽。如果随后另一个过程希望释放插槽e,则可更新极限指示符以将插槽e的存在和位置指示为距当前插槽(插槽a)最远的未决插槽。这样,极限指示符可由无序地释放更新的过程来更新,以指示最远未决插槽的位置。
42.继续以上示例,如果极限指示符将插槽e的存在和位置指示为距当前插槽(插槽a)最远的未决插槽,并且随后另一个过程希望释放插槽c,则可更新变化指示符以指示当前插槽(插槽a)与最远未决插槽(插槽e)之间的未决插槽的数量的变化。这样,变化指示符可被更新以允许过程释放位于当前插槽与最远未决插槽之间的插槽。变化指示符的变化因此指示已释放了更新,针对该更新,可不更新极限指示符。照此,变化指示符的变化指示当前插槽与最远未决插槽之间的未决插槽的数量存在变化。这允许过程通过更新极限指示符或变化指示符或这两者来释放更新,并且过程因此可以是自由的,而不必等待较早的过程释放其更新。在一些示例中,极限指示符或变化指示符均取决于过程是否在尝试释放距当前插槽更远的插槽和由极限指示符指示的最远未决插槽来更新,如上所述。另选地,在一些示例中,可针对所释放的每个更新来更新变化指示符,使得变化指示符的变化可用于指示更新已由过程释放,并且极限指示符指示最远未决插槽的位置。
43.如上所述,可更新极限指示符以将插槽e的存在和位置指示为距当前插槽(插槽a)最远的未决插槽。当按次序过程尝试释放插槽b,使得过程尝试相对于数据项排队序列的顺
序按次序进行释放时,该按次序过程可执行从由当前插槽指示符指示的当前插槽一直到由极限指示符指示的最远未决插槽对环形缓冲器的扫描,使得该按次序过程可释放当前插槽与最远未决插槽之间的其他未决插槽。这样,该按次序过程可相对于排队序列的顺序按次序释放插槽b,并且该按次序过程可扫描当前插槽与最远未决插槽之间的环形缓冲器,以相对于数据项排队序列的顺序按次序识别和释放当前插槽与最远未决插槽之间的其他插槽。在过程针对未决更新执行对环形缓冲器的扫描之前的变化指示符的值可由该过程用来与在对环形缓冲器的扫描之后的变化指示符的值进行比较,以识别一个或多个更新是否已被无序地释放,针对该一个或多个更新,可不更新极限指示符。当变化指示符的旧值(在扫描之后)与该指示符的新值(在扫描之前)的比较指示更新已被无序地释放(针对该更新,可不更新极限指示符)时,按次序过程可再次扫描环形缓冲器以识别可按次序释放的其他插槽。
44.在一些示例中,未决插槽指示符可仅使用变化指示符而不使用极限指示符。在这种情况下,可针对被释放的每个插槽更新变化指示符,使得变化指示符被更新以指示未决插槽的数量的变化。按次序过程可执行在由当前插槽指示符指示的当前插槽处开始的扫描,并且该扫描将在该按次序过程识别到不是未决释放的插槽时结束。这样,该按次序过程可按次序释放插槽b,针对未决插槽扫描环形缓冲器以便释放作为未决释放的插槽c,并且该过程将在识别到非未决插槽时停止扫描(例如,非未决插槽可由空指针指示)。
45.在一些实施方案中,当当前插槽指示符不匹配预期插槽值时,通过修改极限指示符和变化指示符中的至少一者来更新未决插槽指示符。
46.在一些实施方案中,当预期插槽值指示相对于排队序列的顺序比由极限指示符指示的最远未决插槽位于距环形缓冲器中的当前插槽更远的插槽时,更新极限指示符。在一些实施方案中,基于预期插槽值的值来更新极限指示符,以指示最远未决插槽的不同位置。
47.当未决插槽指示符指示未决插槽的存在并且过程的预期插槽值指示比当前由极限指示符指示的最远未决插槽距当前插槽更远的插槽的位置时,该过程将通过更新极限指示符来更新未决插槽指示符,以指示对应于该过程在尝试释放的插槽的新的最远未决插槽。尝试以无序方式释放插槽的过程可更新极限指示符,使得极限指示符将另一个插槽指示为最远未决插槽。因此,当过程尝试相对于数据项排队序列的顺序按次序释放插槽时,该按次序过程可使用极限指示符来执行扫描以限定最远未决插槽,使得对环形缓冲器中的未决插槽的扫描是在当前插槽与最远未决插槽之间被执行。
48.在一些实施方案中,当预期插槽值指示位于当前插槽与最远未决插槽之间的插槽时,更新变化指示符而不更新极限指示符。由于插槽位于比最远未决插槽更靠近当前插槽,因此极限指示符将不被更新,并且相反,无序过程将通过更新变化指示符来释放其更新,以指示当前插槽与最远未决插槽之间的未决插槽的数量的变化。
49.当未决插槽指示符指示未决插槽的存在并且过程的预期插槽值指示不比当前由极限指示符指示的最远未决插槽距当前插槽更远的插槽的位置时,该过程将通过更新变化指示符来更新未决插槽指示符,以指示当前插槽与最远未决插槽之间的附加未决插槽的存在,而不更新极限指示符,因为最远未决插槽的位置未改变。这允许无序过程在要由该过程释放的插槽不比最远未决插槽距当前插槽更远时通过更新变化指示符来释放其更新。因此,当另一个过程尝试相对于数据项排队序列的顺序按次序释放插槽时,该按次序过程可根据极限指示符和变化指示符执行扫描,以允许相对于数据项排队序列的顺序按次序释放
其他未决插槽。通过将在释放按次序插槽之前的变化指示符与在释放按次序插槽之后的变化指示符进行比较,可识别变化指示符的变化,使得该过程可识别是否针对已在开始扫描和结束扫描之间被释放的一个或多个未决插槽执行对环形缓冲器的另一扫描。
50.当环形缓冲器中不存在未决插槽时,极限指示符将指示环形缓冲器中不存在任何未决插槽。照此,当过程尝试释放单个未决插槽并且极限指示符具有此类配置时,该过程可仅更新极限指示符以指示由该过程释放的单个插槽的存在和位置。另外,该过程还可更新变化指示符以指示已存在变化。在过程尝试释放多个未决插槽并且极限指示符指示不存在未决插槽的情况下,该过程将更新极限指示符和变化指示符两者,以指示最远未决插槽的存在和位置以及指示当前插槽与最远未决插槽之间的其他未决插槽的存在。
51.在一些实施方案中,当当前插槽指示符匹配预期插槽值并且未决插槽指示符指示环形缓冲器的一个或多个未决插槽的存在时,通过根据与当前插槽邻接的连续未决插槽的数量修改当前插槽指示符的值来更新当前插槽指示符。当预期插槽值匹配当前插槽指示符的值时,这提供表明该过程在尝试相对于数据项排队序列的顺序按次序进行释放的指示。在这种情况下,该过程可执行从由当前插槽指示符指示的插槽一直到由极限指示符指示的最远未决插槽对环形缓冲器的扫描,并且与当前插槽邻接的未决插槽可由该过程释放。这样,该过程可释放由该过程获取的一个或多个插槽,并且还释放与当前插槽邻接的一个或多个连续未决插槽。
52.在一些实施方案中,当前插槽指示符的值被修改以指示一个或多个连续未决插槽中的最远未决插槽,并且其中该最远未决插槽是一个或多个连续未决插槽中位于距环形缓冲器中的当前插槽最远的未决插槽。
53.本技术允许过程将预期插槽值与环形缓冲器元数据的当前插槽指示符的值进行比较,并且当当前插槽指示符匹配预期插槽值时,这指示该过程在尝试相对于数据项排队序列的顺序按次序释放插槽。当尝试相对于排队序列的顺序按次序释放插槽时,可读取未决插槽指示符以提供关于任何未决插槽的存在和(如果存在的话)其最远位置的指示。当未决插槽指示符指示不存在未决插槽(指示环形缓冲器中不存在未决插槽)时,可更新当前插槽指示符以修改当前插槽指示符的值,以指示排队序列中下一个插槽的位置。当未决插槽指示符指示环形缓冲器中的一个或多个未决插槽的存在时,可执行对环形缓冲器中位于当前插槽与由极限指示符指示的最远未决插槽之间的插槽的扫描,以识别是否存在与当前插槽邻接的一个或多个未决插槽。在存在与当前插槽邻接的一个或多个未决插槽的情况下,可更新当前插槽指示符以指示距当前插槽最远的最远未决插槽的位置,其中当前插槽与最远未决插槽之间的所有插槽是未决的插槽。这样,可读取未决插槽指示符并且可执行对环形缓冲器中给定数量的插槽的扫描,以识别当前插槽与由极限指示符指示的插槽之间的每个未决插槽的位置,并且当系统是按次序的时,可基于与当前插槽邻接的连续未决插槽的数量来更新第一参考指示符。在存在一个或多个未决插槽但这些未决插槽中没有一个与当前插槽邻接的情况下,可更新当前插槽指示符以修改当前插槽指示符的值,以指示排队序列中下一个插槽的位置,以便相对于数据项排队序列的顺序按次序释放插槽。
54.在一些实施方案中,当前插槽指示符指示处于数据项排队序列的头端或尾端处的当前插槽的位置,并且预期插槽指示符指示处于数据项排队序列的同一端处的当前插槽的预期位置。
55.在一些实施方案中,第一参考指示符是对于从排队序列中移除数据项的过程数据项排队序列的尾端的尾部指示符,并且第二参考指示符是对于将数据项添加到排队序列的过程数据项排队序列的尾端的尾部指示符。
56.在一些实施方案中,将数据项添加到排队序列的过程被布置成执行获取过程以获取环形缓冲器中的至少下一个空插槽,该获取过程包括尝试根据原子操作来更新第二参考指示符。
57.在一些实施方案中,第一参考指示符是对于将数据项添加到排队序列的过程数据项排队序列的头端的头部指示符,并且第二参考指示符是对于从排队序列中移除数据项的过程数据项排队序列的头端的头部指示符。
58.在一些实施方案中,从排队序列中移除数据项的过程被布置成执行获取过程以获取环形缓冲器中的至少下一个非空插槽,该获取过程包括尝试根据原子操作来更新第二参考指示符。
59.在一些实施方案中,当过程执行获取过程以获取环形缓冲器中的至少一个插槽时,通过根据由过程中的一个过程获取的插槽的数量修改预期插槽指示符的值来更新第二参考指示符。
60.在一些实施方案中,数据处理电路被布置成并行地执行将数据项添加到排队序列的过程,并且每个过程同时尝试根据原子操作来更新第一参考指示符。
61.在一些实施方案中,数据处理电路被布置成并行地执行从排队序列中移除数据项的过程,并且每个过程同时尝试根据原子操作来更新第一参考指示符。
62.至少一些实施方案提供了一种装置,该装置包括:环形缓冲器存储电路,该环形缓冲器存储电路用于存储包括多个插槽的环形缓冲器以保持数据项的排队序列;数据处理电路,该数据处理电路用于执行多个过程以将待处理的一个或多个数据项添加到该排队序列以及从该排队序列中移除一个或多个数据项以供处理,其中每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽;和环形缓冲器元数据存储电路,该环形缓冲器元数据存储电路用于存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符,该第一参考指示符包括指示处于数据项排队序列的一端处的当前插槽的位置的当前插槽指示符,并且该第二参考指示符包括指示处于数据项排队序列的另一端处的当前插槽的预期位置的预期插槽指示符,其中数据项排队序列的该一端是数据项排队序列的头端或尾端,其中获取过程包括尝试更新环形缓冲器的第二参考指示符,包括原子操作,在该原子操作中将过程所请求获取的插槽的数量与当前插槽指示符和预期插槽指示符进行比较,并且当当前插槽指示符和预期插槽指示符指示环形缓冲器中的一个或多个插槽有资格用于获取时,通过修改预期插槽指示符的值来更新预期插槽指示符。这提供了原子获取操作,该原子获取操作允许过程以原子方式访问和更新环形缓冲器元数据以获取环形缓冲器中的一个或多个插槽。
63.在一些实施方案中,第一参考指示符是对于从排队序列中移除数据项的过程数据项排队序列的尾端的尾部指示符,并且第二参考指示符是对于从排队序列中移除数据项的过程数据项排队序列的头端的头部指示符。在一些实施方案中,对于从排队序列中移除数据项的过程,有资格用于获取的插槽的数量对应于环形缓冲器中的占用插槽数量,并且其中环形缓冲器中的占用插槽数量是基于处于头端处的当前插槽的位置和处于尾端处的当
前插槽的位置来确定的。这样,对于从排队序列中移除数据项的消费者,可从对应于尾端的位置的索引中减去对应于头端的位置的索引(尾部

头部),以便计算环形缓冲器中的占用插槽的数量。
64.在一些实施方案中,第一参考指示符是对于将数据项添加到排队序列的过程数据项排队序列的头端的头部指示符,并且第二参考指示符是对于将数据项添加到排队序列的过程数据项排队序列的尾端的尾部指示符。在一些实施方案中,对于将数据项添加到排队序列的过程,有资格用于获取的插槽的数量对应于环形缓冲器中的未占用插槽数量,并且其中环形缓冲器中的未占用插槽数量是基于环形缓冲器中的插槽的总数量、处于头端处的当前插槽的位置和处于尾端处的当前插槽的位置来确定的。这样,对于将数据项添加到排队序列的生产者,可从对应于尾端的位置的索引中减去对应于头端的位置的索引(尾部

头部),以便计算环形缓冲器中的占用插槽的数量,并且可从环形缓冲器中的插槽的总数量中减去占用插槽的数量,以便计算环形缓冲器中的未占用插槽的数量(即,环形缓冲器大小

(尾部

头部)=环形缓冲器大小 头部

尾部=未占用插槽的数量),其中未占用插槽有资格用于由生产者获取。
65.现在参考附图描述一些具体实施方案。
66.图1示意性地示出了一个实施方案中的数据处理装置10。数据处理装置10包括第一内核12和第二内核14。这些内核中的每个内核设有其自身的私有l1高速缓存存储器,即分别为高速缓存存储器16和高速缓存存储器18。2级高速缓存存储器20被共享并且通向存储器22。数据处理装置10不仅是多核系统,还是多线程系统,这在图1中通过在内核12上执行的线程t024和t1 26以及在内核14上的线程t228和t330的表示来示出。以本领域普通技术人员将熟悉的方式,在给定处理器内核中执行的给定线程对从存储器22检索的数据执行数据处理操作,从存储器22检索的数据项的临时副本被高速缓存存储器在由相关居间高速缓存存储器级别形成的高速缓存存储器分级结构中。在图1的存储器22中示意性地示出了与本技术的一些实施方案特别相关的一些数据结构,即环形缓冲器存储装置32和环形缓冲器元数据存储装置34。环形缓冲器元数据存储装置34对应于存储器22中的多个存储位置,使得环形缓冲器元数据可被存储在这些存储位置处并且由在内核上执行的线程访问。因此,存储在存储器22中的存储位置处的环形缓冲器元数据的数据结构可由在内核13和14上执行的线程t0、t1、t2和t3以原子方式进行访问。将参考这些数据结构在以下附图中进一步解释本技术。
67.图2示意性地表示了以普通技术人员熟悉的方式缠绕的环形缓冲器50。存储在环形缓冲器存储装置32中以及因此逻辑上存储在图1所示的存储器22中的该环形缓冲器50由在内核12和14上执行的过程用来协调特定数据项的处理。一般来讲,可从两个方面观察环形缓冲器的使用,首先是系统中一个或多个“生产者”的那些使用,其生成存储在环形缓冲器50中的数据项,并且其次是“消费者”的那些使用,其从环形缓冲器50中移除数据项以进行进一步数据处理。环形缓冲器的关键特征在于其被布置成用于使得保持在环形缓冲器中的数据项处于排队(有序)序列中,使得生产者生成数据项的顺序也是它们被消费者消耗的顺序。实现这一点所根据的一般原理是,由生产者(参见图2中的项52)生成的下一个数据项(由图2中的阴影插槽表示)在所存储的序列的“尾部”处入队,而仍处于序列中的最旧数据项从其头端处出队以进行消费者处理(参见图2中的项54)。换句话讲,排队序列的头部处的
数据项是最旧数据项,并且排队序列的尾部处的数据项是最新数据项。为了跟踪环形缓冲器中的有效数据项的当前状态,系统存储四个指针,两个指针用于生产者,并且两个指针用于消费者。在本技术中,为这四个指针提供了环形缓冲器元数据,该环形缓冲器元数据可由独立的行动者以原子方式访问和更新。生产者头部指针56指示系统中生产者的排队序列的头部,而生产者尾部指针58指示系统中生产者的排队序列的尾部。类似地,消费者头部指针60指示系统中消费者的排队序列的头部,并且消费者尾部指针62指示系统中消费者的排队序列的尾部。在本上下文中值得注意的显著点是,如图2所示,生产者头部指针56、生产者尾部指针58、消费者头部指针60和消费者尾部指针62(在该示例中,它们各自由标量值表示)由存储在存储器22中的环形缓冲器元数据存储电路34中的元数据提供(如图1所示),并且环形缓冲器的元数据由行动者(例如,线程t024、t1 26、t228或t330根据原子操作访问。
68.现在参考图3,现在讨论上面提到的困难中关于在数据处理系统中协调使用环形缓冲器可能出现的一些困难,其中多个过程利用环形缓冲器,并且具体地涉及多个生产者和消费者。如前所述,通常存在利用环形缓冲器的3步入队和出队操作,并且在包括多个生产者和多个消费者的系统中,入队和出队需要生产者和消费者之间的同步。具体地讲,更新必须按照其获取顺序被释放(注意,术语“更新”涵盖读取和写入两者的释放)。重要的是使读取更新按次序进行释放,使得内容在被读取之前不会被覆写。因此,生产者或消费者可能必须等待较早的生产者或消费者完成这一操作。
69.图3示意性地示出了该相互依赖关系可自身显现的一种场景。在利用图3所示的环形缓冲器的系统中,限定有四个指针,即,生产者头部指针56、消费者头部指针60、生产者尾部指针58和消费者尾部指针62。在新生成的数据项在排队序列的尾端处进行添加的情况下,当生产者希望将利用环形缓冲器的新数据项入队时,其写入生产者尾部指针58和消费者尾部指针62。反之,当消费者希望使项出队时,其必须更新消费者头部指针60和生产者头部指针56。因此,在插槽a、b、c、d和e当前处于活动队列中并且生产者希望获取插槽f的所示情况下,该获取可能通过生产者更新生产者尾部指针58来实现(生产者更新生产者尾部指针58以获取插槽f是由从生产者尾部58指向插槽f的虚线箭头表示),但是当生产者试图更新消费者尾部指针62以指示数据项f时,这还不能在消费者侧发生,即,具体地讲,相对于消费者尾部指针62,其当前仍指向数据项d,这由从消费者尾部指针62指向插槽d的实线箭头表示。虽然作为入队操作的获取步骤的一部分,当前生产者已经将生产者尾部指针58更新为f,但是当前生产者被阻止更新消费者尾部指针62,这是因为更新必须按照其获取顺序来释放(即,消费者尾部指针62必须首先被更新为指向插槽e,其由虚线表示,并且然后被更新为指向插槽f,其由点线表示以按照其获取顺序释放更新),并且因此当前生产者必须等待消费者尾部指针62获得生产者尾部指针58的旧值,即f。
70.本技术通过使用环形缓冲器元数据的方法解决了该问题,环形缓冲器元数据包括存储在环形缓冲器元数据存储装置34中的第一参考指示符和第二参考指示符,这允许生产者和消费者按次序和无序地释放更新。图4a示意性地示出了该方法的具体实施,其使用环形缓冲器元数据,由此不会发生上述等待较早的生产者或消费者完成释放的情况。在利用图4a所示的环形缓冲器50的系统中,为排队序列的头端提供第一参考指示符66和第二参考指示符70,并且为排队序列的尾端提供第一参考指示符72和第二参考指示符68(注意,为排队序列的头端提供的第一参考指示符66基本上与为排队序列的尾端提供的第一参考指示
符72相同,不同的是第一参考指示符66由消费者更新并且第一参考指示符72由生产者更新)。将参考头部指示符和尾部指示符来描述本技术,该头部指示符是为数据项排队序列的头端提供的第一参考指示符的示例,该尾部指示符也是为数据项排队序列的尾端提供的第一参考指示符的示例。具体地讲,本技术提供头部指示符和尾部指示符,该头部指示符是排队序列的头端处的生产者的第一参考指示符66,该尾部指示符是排队序列的尾端处的消费者的第一参考指示符72。每个生产者可读取作为生产者的第一参考指示符66的头部指示符以识别对应于排队序列的头部的插槽位置,并且每个生产者可更新第二参考指示符68以获取环形缓冲器中的插槽并且更新第一参考指示符72以释放插槽。类似地,每个消费者可读取作为消费者的第一参考指示符72的尾部指示符以识别对应于排队序列的尾部的插槽位置,并且每个消费者可更新第二参考指示符70以获取环形缓冲器中的插槽并且更新第一参考指示符66以释放插槽。这样,为排队序列的头端提供的头部指示符提供:对排队序列的头端处的当前插槽在环形缓冲器中的位置的指示;关于是否存在已由在头端处与环形缓冲器交互的消费者无序地释放的一个或多个更新的指示;以及对环形缓冲器中对应于由在头端处与环形缓冲器交互的消费者无序地释放的一个或多个更新的一个或多个未决插槽的最远位置的指示。类似地,为排队序列的尾端提供的尾部指示符提供:对排队序列的尾端处的当前插槽在环形缓冲器中的位置的指示;关于是否存在已由在尾端处与环形缓冲器交互的生产者无序地释放的一个或多个更新的指示;以及对环形缓冲器中对应于由在尾端处与环形缓冲器交互的生产者无序地释放的一个或多个更新的一个或多个未决插槽的最远位置的指示。为了跟踪处于环形缓冲器中排队序列的头端处的有效数据项的当前状态,为生产者头部提供包括当前插槽指示符和未决插槽指示符的头部指示符(第一参考指示符)66,并且为消费者头部提供包括预期插槽指示符的第二参考指示符70,并且用于从排队序列的头端移除数据项以供进一步处理的出队操作是基于原子操作来执行,该原子操作访问头部指示符66和第二参考指示符70。类似地,为了跟踪处于系统的环形缓冲器中排队序列的尾端处的有效数据项的当前状态,为消费者尾部提供包括当前插槽指示符和未决插槽指示符的尾部指示符(第一参考指示符)72,并且为生产者尾部提供包括预期插槽指示符的第二参考指示符68,并且用于将数据项添加到排队序列的尾端的入队操作是基于原子操作来执行,该原子操作访问尾部指示符72和第二参考指示符68。
71.图4b示意性地示出了该方法的具体实施,对于排队序列的尾端,使用包括尾部指示符72和第二参考指示符68的环形缓冲器元数据。对于其中多个独立的行动者并行地与环形缓冲器交互的系统,第一生产者和第二生产者可各自尝试将数据项在排队序列的尾端处入队,其中每个生产者执行获取过程以便获取环形缓冲器的一个或多个插槽,该获取过程包括尝试基于原子操作(例如,用于允许每个生产者以原子方式访问环形缓冲器元数据以获取一个或多个插槽的原子获取操作)来更新为生产者尾部提供的第二参考指示符68。例如,第一生产者(生产者1)可通过将为生产者尾部提供的第二参考指示符68更新为指向插槽f(这在图4b中通过第一生产者更新第二参考指示符68来表示,使得标记为“a”的箭头指向插槽f)来执行获取过程以获取环形缓冲器中的插槽f,并且第二生产者(生产者2)可通过将为生产者尾部提供的第二参考指示符68更新为指向插槽g(参见图4b中指向插槽g的标记为“b”的箭头)来执行获取过程以获取环形缓冲器中的插槽g。对由行动者以原子方式访问和更新(递增)的该第二参考指示符68的提供因此提供了用于使变得可用的行动者能够获
取环形缓冲器中的插槽而不会对于任何给定插槽在各行动者之间发生冲突的机制。应当指出的是,“递增”在本文中旨在表示值的单位修改,并且按照惯例,这可以是通过加法(例如,加一)来实现。然而,增加不是必需的,并且这种“递增”可同样很好地被选择为通过减法(例如,减去一)来实现。
72.这样,每个生产者通过根据原子操作修改预期插槽指示符的值来更新第二参考指示符68以获取环形缓冲器中的一个或多个插槽,并且当生产者成功地获取环形缓冲器中的一个或多个插槽时,将预期插槽值返回给生产者。因此,成功地获取环形缓冲器中的插槽的每个生产者将具有对应于在生产者获取插槽时的预期插槽指示符的值的预期插槽值。当第一生产者成功地获取插槽f时,指示插槽f的位置的预期插槽值可被返回给第一生产者,并且当第二生产者成功地获取环形缓冲器中的插槽g时,指示插槽g的位置的另一个预期插槽值可被返回给第二生产者。第一生产者和第二生产者可同时分别写入所获取的插槽f和所获取的插槽g,并且随后第一生产者和第二生产者可各自执行释放过程,该释放过程包括尝试更新为消费者尾部提供的尾部指示符72,以便释放具有所写入数据的所获取的插槽。因此,每个生产者将尝试根据生产者的预期插槽值与尾部指示符72的当前插槽指示符的比较来释放由该生产者获取的插槽,并且当生产者更新尾部指示符72的尝试成功时,尾部指示符72的当前插槽指示符和未决插槽指示符中的至少一者将被更新。
73.在一些情况下,第一生产者可在第二生产者之前完成,并且第一生产者将在第二生产者尝试更新尾部指示符72以便释放插槽g之前,尝试更新尾部指示符72以便释放插槽f。在这种情况下,第一生产者将尝试根据原子操作来更新尾部指示符72,在该原子操作中第一生产者将预期插槽值(当根据原子操作更新第二参考指示符时返回给第一生产者的值)与尾部指示符72的当前插槽指示符进行比较。当执行释放过程时,第一生产者以原子方式访问尾部指示符72并且将预期插槽值与尾部指示符72的当前插槽指示符进行比较。当当前插槽指示符匹配预期插槽值时,这指示第一生产者在尝试相对于排队序列的顺序按次序释放插槽。照此,当当前插槽指示符的值匹配预期插槽值时,释放过程通过将当前插槽指示符的值修改预定量来以原子方式更新为消费者尾部提供的尾部指示符72的当前插槽指示符,以便指示插槽f的位置(这由指向插槽f的标记为“c”的箭头表示)。为了支持由过程对多个插槽进行的入队和出队,可使用范围比较来将预期插槽值与当前插槽指示符进行比较。通过以这种方式更新为消费者尾部提供的尾部指示符72的当前插槽指示符,第一生产者释放其更新。类似地,当第二生产者在第一生产者已通过更新尾部指示符72释放插槽f之后完成时,第二生产者将尝试更新尾部指示符72以便释放插槽g(这由指向插槽g的标记为“d”的箭头表示),并且将相对于排队序列的顺序按次序释放插槽。应当理解,这提供了第一生产者和第二生产者各自获取插槽并且各自更新尾部指示符72的当前插槽指示符以按次序释放更新的示例。
74.在一些情况下,第二生产者可在第一生产者之前完成,并且第二生产者将在第一生产者尝试更新尾部指示符72以便释放插槽f之前,尝试更新尾部指示符72以便释放插槽g。这是多个生产者与环形缓冲器交互并且相对于排队序列的顺序无序地释放其更新的示例。在这种情况下,第二生产者将尝试根据原子操作来更新尾部指示符72,在该原子操作中第二生产者将第二生产者的预期插槽值与尾部指示符72的当前插槽指示符进行比较。当执行释放过程时,第二生产者以原子方式访问尾部指示符72并且将预期插槽值与尾部指示符
72的当前插槽指示符进行比较。在这种情况下,由于第一生产者尚未释放插槽f并且第二生产者因此正在尝试更新尾部指示符72以相对于排队序列的顺序无序地释放插槽g,因此尾部指示符72的当前插槽指示符的值不匹配第二生产者的预期插槽值。当当前插槽不匹配预期插槽值时,这指示生产者在尝试相对于排队序列的顺序按次序释放插槽,并且因此通过修改未决插槽指示符的值来更新尾部指示符72的未决插槽指示符以指示环形缓冲器的未决插槽的存在和位置,而无需更新当前插槽指示符。具体地讲,对于第二生产者在第一生产者之前尝试释放其更新(即,无序地释放)的情况,第二生产者以原子方式访问尾部指示符72并且更新未决插槽指示符以指示插槽g是未决插槽。这样,生产者可通过更新未决插槽指示符来无序地释放更新以指示环形缓冲器中存在已经由生产者释放的插槽,而不必在释放更新之前等待由其他生产者释放任何较早获取的插槽。因此,实际上,未决插槽指示符可由无序地释放更新的生产者以原子方式进行更新,并且这允许此类生产者是自由的,而不必等待较早的生产者。
75.试图更新尾部指示符72的这种动作可按各种方式来实现,但是在一些实施方案中,尝试更新尾部指示符72包括原子比较与交换(cas)操作,该原子比较与交换(cas)操作以原子方式:从尾部指示符72读取当前插槽指示符的值;由执行原子操作的行动者将当前插槽指示符的值与行动者的预期插槽值进行比较;并且取决于这些值是否匹配,这指示行动者是在尝试按次序还是无序地释放更新。除了以原子方式读取当前插槽指示符的值之外,还可从尾部指示符72以原子方式读取未决插槽指示符的值,以基于与未决插槽指示符相关联的值来提供表明是否存在一个或多个未决更新的指示。
76.在由更新尾部指示符72的未决插槽指示符生产者进行的无序释放之后,系统中的其他生产者将通过尝试更新尾部指示符72来释放其更新,并且将在尾部指示符72的当前插槽指示符不匹配生产者的预期插槽值时继续进一步更新未决插槽指示符,以便指示附加未决插槽的存在和位置。当生产者尝试以原子方式更新尾部指示符72并且当前插槽指示符匹配生产者的预期插槽值,这指示生产者在尝试相对于排队序列的顺序按次序释放插槽,并且未决插槽指示符指示存在一个或多个未决插槽时,这指示环形缓冲器是按次序的并且存在一个或多个未决插槽。在这种情况下,由未决插槽指示符指示的一个或多个未决插槽被识别,并且通过根据由未决插槽指示符指示为与当前插槽邻接的连续未决插槽的数量修改当前插槽指示符的值来更新尾部指示符72,可释放与当前插槽邻接的连续未决插槽。这样,利用环形缓冲器的系统可识别系统何时与未决更新一致,并且尾部指示符72可被更新,使得对未决插槽指示符的先前更新被释放,这保留了数据项序列的顺序。照此,多个生产者可通过执行并发的入队操作来并行地执行以将要处理的数据项添加到排队序列,并且每个生产者可根据该生产者是在以按次序方式还是以无序方式进行释放来更新尾部指示符72的当前插槽指示符或未决插槽指示符。该技术允许控制对当前插槽指示符的更新,使得更新可无序地被释放,但是将数据项添加到排队序列的顺序则可被保留。
77.图4c示意性地示出了该方法的类似具体实施,对于排队序列的头端,使用包括头部指示符(第一参考指示符)66和第二参考指示符70的环形缓冲器元数据。对于其中多个独立的行动者并行地与环形缓冲器交互的系统,第一消费者和第二消费者可各自尝试使数据项在排队序列的头端处出队,其中每个消费者执行获取过程以便获取环形缓冲器的一个或多个插槽,该获取过程包括尝试基于原子操作(即,用于允许每个消费者以原子方式访问环
形缓冲器元数据以获取一个或多个插槽的原子获取操作)来更新为消费者头部提供的第二参考指示符70。例如,第一消费者(消费者1)可通过将为生产者尾部提供的第二参考指示符68更新为指向插槽a(参见图4c中标记为“w”的箭头)来执行获取过程以获取环形缓冲器中的插槽a,并且第二消费者(消费者2)可通过将为消费者头部提供的第二参考指示符70更新为指向插槽b(参见图4c中标记为“x”的箭头)来执行获取过程以获取环形缓冲器中的插槽b。对由消费者以原子方式读取和更新的该第二参考指示符70的提供因此提供了用于使变得可用的消费者能够获取环形缓冲器中的插槽而不会对于任何给定插槽在各消费者之间发生冲突的机制。
78.每个消费者可更新第二参考指示符70以获取环形缓冲器中的一个或多个插槽,并且将在消费者成功地获取环形缓冲器中的一个或多个插槽时具有被返回给消费者的预期插槽值。第一消费者和第二消费者可同时分别从所获取的插槽a和所获取的插槽b读取数据,并且随后第一消费者和第二消费者可各自执行释放过程,该释放过程包括尝试更新为生产者头部提供的头部指示符66以便释放所获取的插槽。
79.类似于上面参考图4b所提到的关于排队序列的尾端的技术,在一些情况下,第一消费者可在第二消费者之前完成(即,按次序序)或者第一消费者可在第二消费者之后完成(即,无序地),并且给定消费者可根据消费者是在以按次序方式还是以无序方式进行释放来更新头部指示符66的当前插槽指示符或未决插槽指示符,以便允许消费者释放其更新,同时保留排队序列的排序。当释放更新时,第一消费者尝试根据原子操作来更新头部指示符66,在该原子操作中第一消费者将预期插槽值与头部指示符66的当前插槽指示符进行比较。通过将预期插槽值与当前插槽指示符进行比较,第一消费者可识别第一消费者相对于排队序列的顺序是按次序的还是无序的。当当前插槽指示符匹配第一消费者的预期插槽值时,消费者释放过程通过修改当前插槽指示符的值来以原子方式更新为生产者头部提供的头部指示符66的当前插槽指示符,以指示插槽a的位置(由指向插槽a的标记为“y”的箭头表示)。通过以这种方式更新为生产者头部提供的头部指示符66的当前插槽指示符,第一消费者释放其对环形缓冲器元数据的更新。类似地,当第二消费者在第一消费者已通过更新头部指示符66释放插槽a之后完成时,第二生产者将尝试更新头部指示符66以便释放插槽b(这由指向插槽b的标记为“z”的箭头表示),并且因此将相对于排队序列的顺序按次序释放插槽。
80.在一些情况下,第二消费者可在第一消费者之前完成,在这种情况下,第二消费者将预期插槽值与头部指示符66的当前插槽指示符进行比较,并且所比较的值不匹配,因为第二消费者在尝试无序地更新头部指示符66。照此,第二消费者通过更新头部指示符66的未决插槽指示符来释放更新以指示插槽b是未决插槽。因此,实际上,未决插槽指示符可由无序地释放更新的消费者以原子方式进行更新,并且这允许此类消费者是自由的,而不必等待较早的消费者完成。
81.图5示意性地示出了由本技术提供以支持该方法的环形缓冲器元数据结构。环形缓冲器元数据存储装置34存储包括尾端元数据35和头端元数据36的元数据,该尾端元数据和该头端元数据分别用于跟踪排队序列的尾端和头端,其中尾端元数据35和头端元数据36由在内核12、14上执行的行动者(例如,线程)以原子方式进行更新。尾端元数据35包括第一参考指示符(尾部指示符)72、第二参考指示符68和环大小指示符73。类似地,头端元数据36
包括第一参考指示符(头部指示符)66、第二参考指示符70和环大小指示符67。生产者对尾端元数据35进行的更新允许系统跟踪入队操作,而消费者对头端元数据36进行的更新允许系统跟踪出队操作。在一些示例中,第一参考指示符66、72是64位标量值,其包括:分配给当前插槽指示符的32位;以及分配给未决插槽指示符的32位,并且第二参考指示符68、70可以是32位标量值,而环大小指示符73、67也可以是32位标量值。应当指出的是,针对用于跟踪环形缓冲器的标量值,也考虑了其他大小。例如,在一些情况下,第一参考指示符68、70可由包括多于64位的标量值表示,并且第一参考指示符68、70的未决插槽指示符可由包括多于32位的标量值表示。应当理解,如图5所示,按照使得能够对相应指示符进行原子访问的方式存储相应实例。
82.环形缓冲器元数据包括环大小指示符73,该环大小指示符可例如是32位标量值,其根据相应元素的数量指示环形缓冲器的大小。具有x个元素的环形缓冲器可用于实现在任何一个时刻最多占用x

1个元素的数据项排队序列,因为在环形缓冲器中始终存在至少一个空插槽,以便通过区分头端和尾端的位置来区分环形缓冲器何时已满以及环形缓冲器何时为空。另选地,具有x个元素的环形缓冲器可用于实现在任何一个时刻最多占用x个元素的数据项排队序列,只要提供了附加位以指示环形缓冲器是否被完全占用即可。在一些示例中,环形缓冲器具有由2
n
给出的多个元素(n是整数),并且每个元素在存储器22中具有存储位置。行动者与环形缓冲器进行交互以将新数据项在尾端处入队以及使旧数据项在头端处出队,并且按照使得头端和尾端的位置以循环方式围绕环形缓冲器移动的方式更新头部指针和尾部指针。通过访问环大小指示符73以及存储在环形缓冲器元数据存储装置34中的头部指针和尾部指针,可确定环形缓冲器中的占用(非空)插槽的数量以及因此还有未占用(空)插槽的数量。如稍后将参考图7所述,环大小指示符73可由行动者访问,以确保占用插槽在执行作为入队操作的一部分的获取过程时不会被覆写。
83.未决插槽指示符包括极限指示符,该极限指示符指示相对于排队序列的顺序位于距环形缓冲器中的当前插槽最远的最远未决插槽的位置。未决插槽指示符还包括变化指示符,该变化指示符的变化指示当前插槽与最远未决插槽之间的未决插槽的数量的变化。当行动者无序地释放更新时,未决插槽指示符由行动者以原子方式更新以修改与未决插槽指示符相关联的值。对未决插槽指示符的值的修改包括对极限指示符和变化指示符中的至少一者的修改。在不存在未决插槽的情况下,执行释放过程以释放无序更新的行动者将尝试以原子方式访问第一参考指示符66、72,并且当成功时,将更新未决插槽指示符的极限指示符以指示未决插槽的相对于由当前插槽指示符指示的当前插槽的位置的位置。换句话讲,当未决插槽指示符指示不存在未决插槽时,对未决插槽指示符的更新可修改极限指示符的值而不更新变化指示符。另选地,每当行动者释放无序更新时,可更新变化指示符,使得总是响应于无序行动者进行的释放而更新变化指示符。
84.在存在单个未决插槽的情况下,如未决插槽指示符的极限指示符所指示(如前面段落中所述),执行释放过程以释放无序更新的行动者将尝试以原子方式访问第一参考指示符,并且将通过取决于行动者正在尝试释放的插槽相对于由极限指示符指示的插槽的位置的位置修改极限指示符或变化指示符的值来更新未决插槽指示符。如果行动者在尝试释放位于比由极限指示符指示的未决插槽的位置距当前插槽更远的插槽,则行动者将通过修改极限指示符的值来更新未决插槽指示符以指示行动者在尝试释放的插槽的位置。如果行
动者在尝试释放不位于比由极限指示符指示的未决插槽的位置距当前插槽更远的插槽(即,行动者在尝试释放比由极限指示符指示的未决插槽更靠近当前插槽的插槽),则行动者将通过修改变化指示符的值来更新未决插槽指示符,而不更新极限指示符。因此,行动者将更新变化指示符以指示在当前插槽与由极限指示符指示的距当前插槽最远的未决插槽之间存在新的未决插槽。应当理解,相应行动者尝试以原子方式访问第一参考指示符以更新第一参考指示符,并且通过修改与第一参考指示符相关联的64位值的部分来更新未决插槽指示符。
85.图6示出了当执行原子获取过程时在一个实施方案中采取的步骤的示例性序列。该过程开始于步骤610,在此系统中的过程希望获取环形缓冲器中的一个或多个插槽。在步骤620处,该过程调用更新过程(将在下面相对于图7更详细地描述)以尝试以原子方式访问环形缓冲器元数据并且更新环形缓冲器元数据。具体地讲,该过程尝试以原子方式访问环形缓冲器元数据并且更新第二参考指示符。然后在步骤630处,确定在该本地处理继续进行的同时是否已经(通过另一个过程)进行了更新。当确定已经(通过另一个过程)进行了更新时,该流程返回到步骤620,并且该过程再次调用更新过程以尝试以原子方式访问环形缓冲器元数据并且更新环形缓冲器元数据。当在步骤630处确定在该本地处理继续进行的同时尚未对环形缓冲器元数据进行更新时,于是该流程前进至步骤640,在此获取过程完成。
86.在本技术的实施方案中,入队(生产者)操作和出队(消费者)操作可通过实施原子获取操作来获取环形缓冲器中的插槽,其中消费者和生产者均可使用共同的原子获取操作来在排队序列的头端或尾端处获取环形缓冲器中的插槽。照此,用于获取环形缓冲器中的插槽的原子操作可由生产者和消费者两者使用,其中入队获取操作与出队获取操作之间的差异在于,入队获取操作需要知道环大小以便获取环形缓冲器中的插槽,而出队获取操作不需要知道环大小以便获取环形缓冲器中的插槽。出现入队获取操作与出队获取操作之间的这种差异是因为出队获取操作只能使环形缓冲器中已被写入的插槽出队(即,出队不应被执行以获取环形缓冲器中的空(未占用)插槽并且应当仅被执行以获取与环形缓冲器中被占用的插槽一样多的插槽),而入队获取操作则被执行以获取环形缓冲器中的空插槽。换句话讲,确定环形缓冲器中对于入队操作有资格用于获取的插槽的数量需要进行计算,该计算确定环形缓冲器的大小(环形缓冲器大小是通过访问环形缓冲器元数据来获得,具体地讲是访问环大小指示符67、73以确定环形缓冲器的大小),并且计算头端和尾端的位置之间的差异以便查实获取环形缓冲器中的插槽的位置,而不会在内容应被读取之前将其覆写。作为入队获取操作的一部分,获取头端和尾端的位置,并且可基于以下计算来确定环形缓冲器中有资格用于获取的插槽的数量(即,空插槽的数量):有资格插槽的数量=环大小

(尾部位置

头部位置)。照此,可针对入队获取操作确定有资格插槽的数量,使得可由行动者获取的插槽的数量限于当前未占用插槽的数量。作为出队获取操作的一部分,获取头端和尾端的位置以确定环形缓冲器中占用插槽的位置和数量。对于出队获取操作,可基于以下计算来确定环形缓冲器中有资格用于获取的插槽的数量:有资格插槽的数量=尾部位置

头部位置。
87.消费者执行出队获取操作以尝试以原子方式访问和更新为排队序列的头端提供的第二参考指示符70(消费者),以获取排队序列的头端处的一个或多个插槽。类似地,生产者执行入队获取操作以尝试以原子方式访问和更新为排队序列的尾端提供的第二参考指
示符68,以获取排队序列的尾端处的一个或多个插槽。图7示出了当执行原子获取过程时,具体地讲(如第一步骤700所示)当过程希望尝试更新为头端(消费者)或尾端(生产者)提供的第二参考指示符时在一个实施方案中采取的步骤的序列。在这种情况下,排队序列的尾端的插槽位置指示符(其由生产者更新以指示尾端的位置)是第二参考指示符的一个示例,并且排队序列的头端的插槽位置指示符(其由消费者更新以指示头端的位置)是第二参考指示符的另一个示例。在步骤701处,通过该过程确定要获取的插槽的数量,并且该过程尝试通过以原子方式访问和更新环形缓冲器元数据来获取环形缓冲器中的插槽的数量。在步骤702处,确定该过程是否在尝试获取用于入队(即,在排队序列的尾端处)或用于出队(即,在排队序列的头端处)的插槽。当在步骤702处确定该过程在尝试获取用于入队的插槽时,该流程前进至步骤703,在此基于环大小(或环形缓冲器的容量)、头部的位置和尾部的位置来计算对于入队有资格用于获取的插槽的数量。环形缓冲器中的占用插槽的数量是由尾部

头部给出,并且因此在步骤703处,计算的环大小

(尾部

头部)用于计算对于入队有资格用于获取的插槽的数量。当在步骤702处确定该过程在尝试获取用于出队的插槽时,该流程前进至步骤704,在此基于头部的位置和尾部的位置使用计算的尾部

头部来计算对于出队有资格用于获取的插槽的数量。在步骤705处,将计算出的有资格插槽数量与该过程在尝试获取的插槽数量进行比较。当在步骤705处确定有资格插槽的数量大于该过程在尝试获取的插槽的数量时,该流程前进至步骤706,在此更新第二参考指示符以反映一个或多个插槽已由该过程获取。当在步骤705处确定有资格插槽的数量小于该过程在尝试获取的插槽的数量时,该流程前进至步骤707,在此确定有资格插槽的数量是否等于零,在这种情况下,该过程不可能获取环形缓冲器中的任何插槽。当在步骤707处确定有资格插槽的数量等于零时,该流程返回到步骤702以重新尝试获取插槽,或者任选地可将值返回到该过程,从而指示尚未获取任何插槽,并且该过程可决定是否重试在步骤700处开始的获取操作。当在步骤707处确定插槽的数量不等于零时,该流程前进至步骤706以更新第二参考指示符。这样,当环形缓冲器中的有资格插槽的数量小于该过程在尝试获取的插槽的数量时,该过程可获取环形缓冲器中的多个插槽,虽然该过程无法获取其所尝试获取的所有插槽。另选地,当该过程无法获取所请求获取的插槽的总数量时,该流程可返回到步骤702。一旦该过程在步骤706处根据环形缓冲器中要获取的插槽的数量更新第二参考指示符,该流程就前进至步骤708,在此确定在该过程被执行的同时第二参考指示符是否已改变。在步骤708处,当确定第二参考指示符在该处理期间已改变时,该流程返回到步骤702,使得对第二参考指示符的更新未完成并且因此失败,并且该过程重新尝试更新第二参考指示符(即,当第二参考指示符在该处理被执行的时间期间已由另一个过程改变时,则获取插槽的尝试失败)。照此,该过程将继续尝试更新第二参考指示符,直到在步骤708处确定第二参考指示符在该处理期间尚未改变。当在步骤708处确定第二参考指示符在该处理期间尚未改变时,该流程前进至步骤709,使得第二参考指示符以原子方式被更新,并且指示第二参考指示符的初始值的预期插槽值和指示由该过程获取的插槽数量的值被返回到该过程。照此,在步骤709处,两个值被返回到该过程,第一个值对应于在该过程获取一个或多个插槽时第二参考指示符的值并且因此指示环形缓冲器中可由该过程用于写入(入队)或读取(出队)的第一插槽的位置,并且第二个值指示由于原子获取操作而获取的插槽的数量。这意味着被返回到该过程的值可由该过程用于确定在环形缓冲器中的何处执行入队操作或出队操作,并且指示由该过程获
取的插槽数量的值可用于确定该过程是获取该过程所尝试获取的插槽中的全部还是一些。
88.图8示出了当执行非阻止式释放过程时在一个实施方案中采取的步骤的示例性序列。该过程开始于步骤810,在此系统中的过程希望释放一个或多个插槽。在步骤820处,该过程调用更新过程(将在下面相对于图9更详细地描述)以尝试以原子方式访问环形缓冲器元数据并且更新环形缓冲器元数据。具体地讲,当该过程获取一个或多个插槽时,该过程尝试以原子方式访问环形缓冲器元数据并且根据被返回到该过程的预期插槽值(如先前相对于图6和图7所讨论的)更新第一参考指示符。该过程更新第一参考指示符的这种尝试是“关键部分”,该关键就其意义而言是指必须以原方式来执行,因为不同的过程能够同时尝试以原子方式访问和更新第一参考指示符。因此,在该“关键部分”中执行的操作可使用比较与交换(cas)操作来实现,使得这些过程可以原子方式访问和更新环形缓冲器元数据并且当这些过程均同时尝试更新第一参考指示符时,另一个过程可以暂时被阻止释放其由另一个过程进行的更新。换句话讲,这些过程可以原子方式访问和更新环形缓冲器元数据,并且如果另一个过程在同时尝试更新第一参考指示符,则一个过程可能必须重试释放其更新。这可能意味着一个过程可被另一个过程阻止,然而,每个过程在该“关键部分”中限于较短交互,并且在该部分期间一个过程被另一个过程的阻止并不构成显著的时间约束。在步骤830处,确定在该本地处理继续进行的同时是否已经(通过另一个过程)进行了更新。当确定已经(通过另一个过程)进行了更新时,该流程返回到步骤820,并且该过程再次调用更新过程以尝试以原子方式访问环形缓冲器元数据并且更新环形缓冲器元数据。当在步骤830处确定在该本地处理继续进行的同时尚未对环形缓冲器元数据进行更新时,于是该流程前进至步骤840,在此释放过程完成。
89.图9示出了当执行原子释放过程时,具体地讲(如第一步骤900所示)当过程希望尝试更新第一参考指示符时在一个实施方案中采取的步骤的序列。在这种情况下,第一参考指示符提供:对环形缓冲器的当前插槽的位置的指示;关于是否存在已由与环形缓冲器交互的行动者无序地释放的一个或多个更新的指示;以及对环形缓冲器中对应于由与环形缓冲器交互的行动者无序地释放的一个或多个更新的一个或多个未决插槽的位置的指示。因此,指示当前插槽的位置并且还指示排队序列的一个或多个未决插槽的存在和位置的头部指示符或尾部指示符是第一参考指示符的示例,该第一参考指示符可由相对于数据项排队序列的顺序按次序或无序地释放更新的行动者更新。作为第一参考指示符的示例的头部指示符或尾部指示符包括三个相应的指示符:当前插槽指示符、变化指示符和极限指示符。照此,希望尝试更新头部指示符或尾部指示符的过程将根据图9所示的处理尝试更新当前插槽指示符、变化指示符和极限指示符中的至少一者。
90.当过程已完成入队操作或出队操作的写入阶段或读取阶段时,该过程开始释放过程,并且因此希望在步骤900处尝试更新第一参考指示符。在步骤901处,当该过程获取一个或多个插槽时被返回到该过程的预期插槽值由该过程保持以用于与环形缓冲器元数据进行比较。在步骤902处,确定由该过程保持的预期插槽值是否匹配第一参考指示符的当前插槽指示符的值。如所讨论的,可基于原子比较与交换(cas)操作来实现更新环形缓冲器元数据的该尝试。当预期插槽值不匹配当前插槽指示符的值,这指示该过程在尝试相对于数据项排序序列无序地释放更新(即,该过程在相对于数据项排队序列的顺序“在前面”或“在后面”释放更新)时,该流程前进至步骤903,在此确定该过程是否在尝试按照在数据项排序序
列的“前面”的方式释放更新。在步骤903处,将预期插槽值与当前插槽指示符的值进行比较,并且当预期插槽值指示不在当前插槽指示符所指示的插槽位置前面(即,不在前面并且不匹配当前值,并且因此必定在其“后面”)的插槽时,于是该流程前进至步骤911而不更新环形缓冲器元数据。在步骤911处,将值返回到该过程以指示该过程已完成释放非阻止式过程。这样,当该过程在尝试相对于排队序列的顺序“在后面”释放更新时,值可被返回到该过程,并且在这种情况下,该过程可完成非阻止式释放过程而不更新第一参考指示符。
91.当在步骤903处确定预期插槽值指示处于由当前值指示的插槽位置的前面的插槽时,于是该流程前进至步骤904,在此通过该过程更新第一参考指示符的未决插槽指示符,以指示对应于该过程在尝试释放的更新的一个或多个未决插槽的存在和位置。应当理解,该过程将在步骤903处取决于由预期插槽值指示的相对于由当前插槽指示符的值指示的位置的位置并且还取决于一个或多个未决插槽当前是否已经由未决插槽指示符指示,按照先前所描述的方式更新未决插槽指示符的极限指示符和变换指示符中的至少一者。一旦该过程在步骤904处更新了未决插槽指示符,该流程就前进至步骤910,在此确定在该过程被执行的同时第一参考指示符是否已经改变(即,第一参考指示符的当前插槽指示符或未决插槽指示符在该处理被执行的时间期间是否已经改变)。在步骤910处,当确定第一参考指示符在该处理期间已经改变时,该流程返回到步骤901,使得对第一参考指示符的更新失败(在步骤904处对未决插槽指示符的更新未完成并且因此失败),并且该过程重新尝试更新第一参考指示符。因此,该过程将继续尝试更新第一参考指示符,直到在步骤911处返回值。当在步骤910处确定第一参考指示符在该处理期间尚未改变时,该流程前进至步骤911,使得第一参考指示符以原子方式进行更新并且值在步骤911处被返回到该过程,从而指示该过程已完成释放非阻止式过程。
92.再次参考步骤902,当确定预期插槽值确实匹配当前插槽指示符的值,这指示该过程在尝试相对于数据项排序序列按次序释放更新时,该流程于是前进至步骤905,在此该过程确定未决插槽指示符是否指示环形缓冲器中是否存在一个或多个未决插槽。当在步骤905处确定不存在未决插槽时,该流程前进至步骤907,在此该过程更新当前插槽指示符以根据预期值修改当前插槽指示符的值。当在步骤907处已经更新当前插槽指示符时,该流程前进至步骤910,在此确定在该过程被执行的同时第一参考指示符是否已经改变,并且当确定第一参考指示符在该处理被执行的时间期间已经改变时,该流程返回到步骤901,使得对第一参考指示符的更新失败(即,在步骤907处对当前插槽指示符的更新未完成并且因此失败)。当在步骤905处确定未决插槽指示符指示一个或多个未决插槽的存在时,该流程前进至步骤906,在此确定一个或多个未决插槽中的任何一个插槽是否与当前值所指示的插槽邻接。通过使用未决插槽指示符来扫描位于当前插槽与由极限指示符指示的最远未决插槽之间的未决插槽,可实现这点。按次序过程可执行对位于当前插槽与最远插槽之间的未决插槽的扫描。在一些示例中,当变化指示符的值在扫描期间改变时,这指示当前插槽与最远未决插槽之间的未决插槽的数量已经改变,并且因此该过程可在当前插槽与最远未决插槽之间重新扫描环形缓冲器以识别是否存在可按次序释放的未决插槽。当存在一个或多个未决插槽,其中没有一个与当前值所指示的插槽邻接时,该流程前进至步骤907,在此更新当前插槽指示符。然而,当在步骤906处确定未决插槽中的一个或多个未决插槽与当前值所指示的插槽邻接时,该流程前进至步骤908,在此通过该过程更新当前插槽指示符的值。应当
理解,当前插槽指示符的值是在步骤908处根据被确定为与当前插槽邻接的连续未决插槽的数量来更新,如前所述。当在步骤908处更新当前插槽指示符时,该流程前进至步骤909,在此根据在步骤908处对当前插槽指示符进行的更新来更新未决插槽指示符。照此,在步骤909处,在当前插槽指示符已在步骤908处被更新之后,更新未决插槽指示符以指示环形缓冲器中的一个或多个未决插槽的存在和位置。这样,可在步骤909处更新未决插槽指示符,使得在步骤908处被确定为不与当前值所指示的插槽邻接的一个或多个未决插槽可由未决插槽指示符指示。在所有未决插槽均在步骤906处被确定为与当前值所指示的插槽邻接的情况下,对未决插槽指示符909的更新可以是使得未决插槽指示符被更新以指示不存在未决插槽。当未决插槽指示符已在步骤909处被更新时,该流程前进至步骤910,在此使用例如原子比较与交换(cas)操作来确定在该过程被执行的同时第一参考指示符是否已经改变。当在步骤910处确定第一参考指示符在该处理期间已经改变时,该流程返回到步骤901,使得对第一参考指示符的更新失败并且该过程重新尝试更新第一参考指示符。当在步骤910处确定第一参考指示符在该处理期间尚未改变时,该流程前进至步骤911,并且值被返回到该过程,从而指示该过程已完成非阻止式释放过程。
93.图10示意性地示出了可体现本技术的各种示例的数据处理装置100。该装置包括数据处理电路120,该数据处理电路响应于其执行的指令序列而对数据项执行数据处理操作。例如,数据处理电路120可包括图1所示的内核12和14,线程t0、t1、t2和t3在该内核上执行。从数据处理电路120能够访问的存储器140检索指令,并且按照本领域普通技术人员熟悉的方式,为此目的提供提取电路160。需注意,数据处理装置能够访问的存储器140可包括图1和图5所示的环形缓冲器存储装置32和环形缓冲器元数据存储装置34。此外,由提取电路160检索的指令被传递到指令解码器电路180,该指令解码器电路生成控制信号,该控制信号被布置成控制处理电路120以及寄存器组200和加载/存储单元220的配置和操作的各个方面。一般来讲,数据处理电路120可按流水线方式进行布置,但其细节与本技术无关。本领域的普通技术人员将熟悉图10表示的一般配置,并且仅出于简洁的目的,在此省略对其的进一步详细描述。如在图10中可见,寄存器200各自包括用于多个数据元素的存储装置,使得处理电路120可将数据处理操作应用于指定寄存器内的指定数据元素,或者可将数据处理操作应用于指定寄存器内的指定数据元素组(“向量”)。
94.数据处理电路120在执行指令时所需的数据值以及作为这些数据处理指令的结果而生成的数据值借助于加载/存储单元220被写入存储器140和从存储器140读取。还需注意,图1中的存储器140通常可被视为计算机可读存储介质的示例,在该计算机可读存储介质上可存储本技术的指令,通常作为处理电路随后执行的预定义指令序列(“程序”)的一部分。然而,处理电路可经由网络接口等从各种不同的来源(诸如在ram中、在rom中)访问此类程序。本公开提供了指令,处理电路120可执行该指令以便以原子方式访问和更新环形缓冲器元数据34,如图5所示。这样,系统中的行动者可执行指令以访问元数据34,该元数据包括用于跟踪排队序列的尾端和头端的尾端元数据35和头端元数据36。提供了指令,该指令可由行动者执行以便以原子方式获取环形缓冲器中的插槽以及以原子方式释放环形缓冲器中的插槽。
95.因此,本技术提供了环形缓冲器获取指令,并且这些指令可形成从存储器140检索的并且由处理电路120执行的指令序列的一部分,如上所述。因此,应当理解,在此类示例
中,上述行动者被体现为在处理电路120中执行的过程,并且它们可利用所定义的环形缓冲器获取指令,以便通过以原子方式访问和更新环形缓冲器元数据34来执行原子获取操作以获取环形缓冲器中的一个或多个插槽。
96.如在下面的示例中,环形缓冲器获取指令可包括环形缓冲器获取指令的三个变体:获取次序(a);释放次序(l);以及获取和释放次序(al)。因此,这些变体可被表示为:
97.rbacq[e,d]{a,l,al}<xs>,<wt>,[<xn|sp>],
[0098]
其中e指示指令用于入队,并且d指示指令用于出队。在这些示例中,指令中指定的寄存器是:
[0099]
<wt>

32位通用寄存器,其中所请求的项数被编码在目标寄存器字段中。
[0100]
<xs>

64位通用寄存器,将加载有所得起始索引和被编码在源寄存器字段中的实际项数。
[0101]
<xn|sp>

64位基址寄存器或sp,被编码在附加寄存器字段中。
[0102]
因此,32位通用寄存器<wt>指定行动者所请求获取的插槽的数量。64位通用寄存器<xs>加载有用于环形缓冲器的起始索引和由行动者获取的插槽数量。需注意,该32位通用寄存器<wt>、该64位通用寄存器<xs>和该64位基址寄存器<xn|sp>是环形缓冲器获取指令的专性参数。
[0103]
类似地,本公开提供了环形缓冲器释放指令,并且这些指令也可形成从存储器140检索的并且由处理电路120执行的指令序列的一部分,如上所述。因此,应当理解,在此类示例中,上述行动者被体现为在处理电路120中执行的过程,并且它们可利用所定义的环形缓冲器释放指令,以便通过以原子方式访问和更新环形缓冲器元数据34来执行原子获取操作以释放环形缓冲器中的一个或多个插槽。
[0104]
例如,环形缓冲器释放指令可包括环形缓冲器获取指令的三个变体:获取次序(a);释放次序(l);以及获取和释放次序(al)。因此,这些变体可被表示为:
[0105]
rbrel{a,l,al}<xs>,<xt>,[<xn|sp>]。
[0106]
在这些示例中,指令中指定的寄存器是:
[0107]
<xt>

64位通用寄存器,其中起始索引和要释放的项数被编码在源寄存器字段中。
[0108]
<xs>

64位通用寄存器,将加载有当前:未决的旧值。
[0109]
<xn|sp>

64位基址寄存器或sp,被编码在附加寄存器字段中。
[0110]
因此,64位通用寄存器<xt>指定环形缓冲器的起始索引和要由行动者释放的插槽的数量。64位通用寄存器<xs>加载有预期插槽指示符的预期值。64位通用寄存器<xt>、<xs>和<xn|sp>是环形缓冲器释放指令集的专性参数。
[0111]
因此,应当理解,在支持上述环形缓冲器获取指令和环形缓冲器释放指令的系统中,解码电路(诸如图10的示例中的项180)被配置为识别这些指令以及断言适当的控制信号(例如,用于图10的示例中的处理电路100、寄存器200和加载/存储单元220)以使得执行上述获取和释放过程。
[0112]
图11示出了可使用的模拟器具体实施。虽然先前所述的实施方案在用于操作支持所涉及的技术的特定处理硬件的装置和方法方面实现了本发明,但也可以提供根据本文所述的实施方案的指令执行环境,该指令执行环境是通过使用计算机程序来实现的。此类计算机程序通常被称为模拟器,在一定程度上是因为此类计算机程序提供硬件架构的基于软
件的具体实施。模拟器计算机程序的种类包括仿真器、虚拟机、模型和二进制转换器,其包括动态二进制转换器。通常,模拟器具体实施可在支持模拟器程序710的主机处理器730上运行,该主机处理器任选地运行主机操作系统720。在一些布置中,在硬件和所提供的指令执行环境和/或在同一主机处理器上提供的多个不同指令执行环境之间可存在多个模拟层。在历史上,需要强大的处理器来提供以合理速度执行的模拟器具体实施,但这种方法在某些情况下可能是合理的,诸如当出于兼容性或重复使用原因而希望运行另一个处理器本地的代码时。例如,模拟器具体实施可向指令执行环境提供主机处理器硬件不支持的附加功能,或者提供通常与不同硬件架构相关联的指令执行环境。模拟概述在以下文献中给出:“some efficient architecture simulation techniques”,robert bedichek,winter 1990usenix conference,第53

63页。
[0113]
就先前已参考特定硬件构造或特征描述了实施方案而言,在模拟的实施方案中,等效功能可由合适的软件构造或特征提供。例如,特定电路可在模拟的实施方案中被实现为计算机程序逻辑。类似地,存储器硬件诸如寄存器或高速缓存存储器可在模拟的实施方案中被实现为软件数据结构。在先前所述的实施方案中参考的硬件元件中的一个或多个硬件元件存在于主机硬件(例如,主机处理器730)上的布置中,在合适的情况下,一些模拟的实施方案可利用主机硬件。
[0114]
模拟器程序710可被存储在计算机可读存储介质(其可为非暂态介质)上,并且向目标代码700提供程序接口(指令执行环境),该程序接口与模拟器程序710正在建模的硬件架构的应用程序接口相同。因此,可使用模拟器程序710从指令执行环境内执行目标代码700的程序指令(包括上述环形缓冲器获取指令和环形缓冲器释放指令),使得实际上不具有上述装置的硬件特征的主机计算机730可模仿这些特征。
[0115]
简而言之,提供了装置、方法、程序以及环形缓冲器获取和释放指令。公开了环形缓冲器存储电路,该环形缓冲器存储电路存储包括多个插槽的环形缓冲器以保持数据项的排队序列。数据处理电路执行多个过程以将待处理的一个或多个数据项添加到排队序列以及从排队序列中移除一个或多个数据项以供处理。每个过程被布置成执行获取过程以获取环形缓冲器中的至少一个插槽以及随后执行释放过程以释放该至少一个插槽。环形缓冲器元数据存储电路存储环形缓冲器的元数据,该元数据包括第一参考指示符和第二参考指示符。第一参考指示符包括指示当前插槽的位置的当前插槽指示符和指示环形缓冲器的多个插槽中的一个或多个未决插槽的存在和位置的未决插槽指示符。第二参考指示符包括指示当前插槽的预期位置的预期插槽指示符,一个或多个未决插槽已在当前插槽之后被获取,当过程执行获取过程以获取环形缓冲器中的至少一个插槽时,该过程具有指示预期插槽指示符的值的预期插槽值。释放过程包括尝试更新环形缓冲器的第一参考指示符,包括原子操作,在该原子操作中将过程的预期插槽值与当前插槽指示符进行比较。当当前插槽指示符匹配预期插槽值时,通过将当前插槽指示符的值修改预定值来更新至少当前插槽指示符。当当前插槽指示符不匹配预期插槽值时,通过修改未决插槽指示符的值来更新未决插槽指示符,以指示环形缓冲器的一个或多个未决插槽的存在和位置,而不更新当前插槽指示符。
[0116]
在本技术中,字词“被配置为...”用于意指装置的元件具有能够执行所限定的操作的配置。在该上下文中,“配置”意指硬件或软件的互连的布置或方式。例如,该装置可具
有提供所限定的操作的专用硬件,或者可对处理器或其他处理设备进行编程以执行该功能。“被配置为”并不意味着装置元件需要以任何方式改变以便提供所限定的操作。
[0117]
虽然本文已结合附图详细描述了示例性实施方案,但应当理解,本发明并不限于那些精确的实施方案,并且在不脱离所附权利要求书所限定的本发明的范围的前提下,本领域的技术人员可在其中实现各种变化、添加和修改。例如,在不脱离本发明的范围的情况下,从属权利要求的特征可与独立权利要求的特征一起进行各种组合。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献