时钟同步

文档序号:958441 发布日期:2020-10-30 浏览:1次 >En<

阅读说明:本技术 时钟同步 (Clock synchronization ) 是由 M·卡斯特罗 D·纳拉亚南 A·德拉戈杰维克 M·伦泽尔曼 A·沙米斯 R·卡纳 S·诺 于 2019-03-13 设计创作,主要内容包括:在各种示例中,提供了由节点的集群中的节点执行以在集群中包括的节点的重新配置之后在新主节点处建立主时钟的方法,其中主时钟由旧主节点在重新配置之前提供,并且将从节点的本地时钟同步到新主节点的时钟。新主节点向从节点发送指导它们禁用它们相应的本地时钟的消息,接收本地时钟已经被禁用的确认,等待直到针对从集群被移除的任何节点的所有租用已经到期的时间,将其时钟的值设置为大于由旧主节点在租用到期时本来提供的最大值,并且向其他节点指示以重新启用它们的本地时钟。(In various examples, methods performed by a node in a cluster of nodes to establish a master clock at a new master node after reconfiguration of the nodes included in the cluster are provided, where the master clock is provided by an old master node prior to reconfiguration and a local clock of a slave node is synchronized to a clock of the new master node. The new master node sends messages to the slave nodes instructing them to disable their respective local clocks, receives confirmation that the local clocks have been disabled, waits until such time that all leases for any node removed from the cluster have expired, sets its clock to a value greater than the maximum value that would have been provided by the old master node at the time the lease expired, and indicates to the other nodes to re-enable their local clocks.)

时钟同步

背景技术

许多不同类型的应用可以被布置为运行在计算节点的集群上。通过将计算任务和数据存储拆分在集群的节点之间,应用可以通过包括集群内的附加节点而被更容易地扩展。然而,在这样的应用的设计中,有必要减轻可能由于集群内的节点的故障而产生的任何问题。这样的应用可以要求集群中的节点中的每个节点被同步使得可以认为存在集群内的操作可以相对于其被执行的主时钟。这样的应用的示例是分布式事务性存储器系统。在分布式事务性存储器系统中,有必要确保事务在集群内以严格顺序次序被执行使得存储器系统的完整性得以保留,即使其中事务由集群中的不同节点处理。类似地,与存储器系统有关的其他操作(诸如对象的历史版本的垃圾收集(其中存储器系统支持多版本))的计时也需要集群的节点之间的精确协同。用于使集群的节点同步的一个已知解决方案是向集群中的节点中的每个节点提供有复原能力(resilient)的(即,高度可靠的)主时钟信号。

下面描述的实施例不限于解决节点的已知集群的缺点中的任何或全部的实现。

发明内容

下文呈现了本公开内容的简化概要以便向读者提供基本理解。本发明内容不旨在标识要求保护的主题的关键特征或必要特征,也不旨在用于限制要求保护的主题的范围。其唯一目的是以简化的形式呈现本文公开的一系列构思作为对稍后呈现的更详细的描述的前序。

在各种示例中,提供了由节点的集群中的节点执行以在集群中包括的节点的重新配置之后在新主节点处建立主时钟的方法,其中,主时钟由旧主节点在重新配置之前提供,并且使从节点的本地时钟同步到新主节点的时钟。新主节点向从节点发送指导它们禁用它们相应的本地时钟的消息,接收本地时钟已经被禁用的确认,等待直到针对从集群移除的任何节点的所有租用已经到期的时间,将其时钟的值设置为大于由旧主节点在租用到期时本来提供的最大值,并且向其他节点指示重新启用它们的本地时钟。

随着通过结合附图参考以下详细描述,特征变得更好理解,伴随的特征中的许多特征将同样更易于理解。

附图说明

将根据鉴于附图的以下详细描述更好地理解本说明书,其中:

图1图示了系统和方法的实施例被实现在其中的示例性基于计算的设备。

图2A图示了系统和方法的实施例可以被实现在其上的计算节点的示例性集群;

图2B图示了在集群的示例性重新配置之后的图2A中示出的计算节点的示例性集群。

图3图示了由从节点执行使它们的本地时钟与主时钟同步的示例性方法;

图4图示了用于使从节点上的两个或更多个本地时钟与主时钟同步的示例性方法;

图5图示了在集群的重新配置之后要由集群的新主节点执行以建立主时钟的示例性方法;

图6图示了要由集群的从节点执行以使它的本地时钟与主时钟同步的示例性方法;

图7图示了用于执行包括在节点的集群上操作的分布式事务性存储器系统内的一个或多个读取操作的事务的示例性方法;

图8图示了用于执行包括在节点的集群上操作的分布式事务性存储器系统内的一个或多个写入操作的事务的示例性方法;

图9图示了用于在多版本事务性存储器系统中执行读取事务的示例性方法;

图10图示了用于在多版本事务性存储器系统中执行写入事务的示例性方法;并且

图11图示了用于对被存储在分布式多版本存储器系统中的节点处的对象的先前版本执行垃圾收集的示例性方法。

类似的附图被用于在附图中指代类似的部件。

具体实施方式

下面结合附图提供的详细描述旨在作为当前示例的描述,并且不旨在表示当前示例被构建或利用的唯一形式。描述阐述示例的功能和用于构建并操作示例的操作的序列。然而,相同的或等效的功能和序列可以由不同的示例实现。

下面阐述的示例中的一些示例允许主时钟由节点中的一个节点的本地时钟提供,从而避免更昂贵的有复原能力的时钟被连接到每个节点的需要。在正在提供主时钟的节点发生故障的情况下,这些示例使得集群中的新节点能够以保留由集群中的节点执行的、依赖于主时钟的任何动作的顺序次序的方式开始在其位置中提供主时钟。

尽管当前示例在本文被描述和图示为被实现在计算机系统中,但是所描述的系统被提供作为示例并且不是限制。如本领域技术人员将认识到的,当前示例适合于应用在各种不同类型的计算机系统中。

图1图示了示例性基于计算的设备100,其被实现为任何形式的计算和/或电子设备,并且其中本文公开的系统和方法的实施例被实现在一些示例中。

基于计算的设备100包括一个或多个处理器102,其是用于处理计算机可执行指令以控制设备的操作的微处理器、控制器或任何其他合适类型的处理器。在一些示例中,例如在片上系统架构被使用的情况下,处理器102包括一个或多个固定功能块(也被称为加速器),其以硬件(而非软件或固件)实现本文公开的各种方法的一部分。在一些示例中,处理器102中的一个或多个或全部分别包括两个或更多个核104,每个核具有它自己的相应的时钟106。两个或更多个核104能够独立于彼此处理指令,由此使得处理器102同时处理多个指令。核104中的每个核支持多线程,其中,通过在执行线程中的每个执行线程之间的核的快速上下文切换,由核处理的每个执行线程与彼此并行地被处理。核104中的每个核包括相应的时钟106,在该核上执行的线程可以参考其以获得表示当前时间的时间戳。

包括操作系统的平台软件或任何其他合适的平台软件被提供在基于计算的设备处以使得应用软件能够在设备上执行。

计算机可执行指令使用可由基于计算的设备100访问的任何计算机可读介质提供。计算机可读介质包括例如计算机存储介质,诸如存储器108,和通信介质。诸如存储器108的计算机存储介质包括以任何方法或技术实现的用于存储诸如计算机可读指令、数据结构、程序模块等的信息的易失性介质和非易失性介质、可移动介质和不可移动介质。计算机存储介质包括但不限于随机访问存储器(RAM)、只读存储器(ROM)、电可擦可编程只读存储器(EEPROM)、闪存或其他存储器技术、紧凑盘只读存储器(CD-ROM)、数字多用盘(DVD)或其他光学存储、磁带盒、磁带、磁盘存储装置或其他磁性存储设备、或者被用于存储用于由计算设备访问的信息的任何其他非传输介质。对比之下,通信介质将计算机可读指令、数据结构、程序模块等体现在诸如载波或其他传输机制的经调制的数据信号中。如本文中所限定的,计算机存储介质不包括通信介质。因此,计算机存储介质不应当被理解为传播信号本身。尽管计算机存储介质(存储器108)被示出在基于计算的设备100内,但是将认识到存储在一些示例中被分布或被远程定位并且经由网络或其他通信链路(例如,使用通信接口110)被访问。

基于计算的设备100还包括被布置为将显示信息输出到显示设备114(其可以与基于计算的设备100分离或集成)的输入/输出控制器112。显示信息可以提供图形用户界面。输入/输出控制器112还被布置为接收并处理来自一个或多个设备(诸如用户输入设备116(例如,鼠标、键盘、相机、麦克风或其他传感器)的输入。在一些示例中,用户输入设备116检测语音输入、用户手势或其他用户动作并且提供自然用户接口(NUI)。在实施例中,显示设备114还用作用户输入设备116(如果它是触敏显示设备的话)。在一些示例中,输入/输出控制器112将数据输出到除了显示设备之外的设备,例如本地连接的打印设备(未示出在图1中)。

输入/输出控制器112、显示设备114和用户输入设备116中的任何可以包括NUI技术,其使得用户能够以自然的方式与基于计算的设备交互,免受由输入设备(诸如鼠标、键盘、远程控制等)施加的人为约束。在一些示例中提供的NUI方法的示例包括但不限于依赖于语音和/或话音识别、触摸和触笔识别(触敏显示器)、在屏幕上的并且邻近屏幕的手势识别、空中手势、头和眼跟踪、语音和话音、视觉、触摸、手势和机器智能的那些。在一些示例中使用的NUI技术的其他示例包括意图和目标理解系统、使用深度相机(例如立体相机系统、红外相机系统、红绿蓝(rgb)相机系统和这些的组合)的运动手势检测系统、使用加速度计/陀螺仪的运动手势检测、面部识别、三维(3D)显示、头、眼和凝视跟踪、身临其境的增强现实和虚拟现实系统以及用于使用电场感测电极来感测大脑活动的技术(脑电图(EEG)和相关的方法)。

在一些示例中,基于计算的设备100用作无头(headless)服务器并且不包括任何显示设备114或用户输入设备116。代替地,在这样的示例中,基于计算的设备100利用通信接口110以接收指令并跨网络(未示出在图1中)将响应提供到其他基于计算的设备。

图2A图示了在一些示例中本文公开的系统和方法的实施例可以被实现于其上的计算节点的示例性集群200。

计算节点的集群200(其也可以被简单地称为集群)包括多个计算节点210(或简单地节点)。多个计算节点210被布置为经由网络220与彼此通信。在图2A中图示的示例性集群200中,集群200包括四个节点210(1)、210(2)、210(3)和210(4)。然而,将认识到,在其他示例中,更大或更少数量的节点210可以被包括在集群200中。网络220还使得节点210能够与被连接到其的其他基于计算的设备100进行通信。

计算节点的集群200能够在其操作期间改变配置。为了确定配置何时应当被改变并且新配置应当是什么,各种现有配置协议可以被使用。在一些示例中,配置协议允许集群200中的节点210自选择负责确定集群200的新配置的配置主节点。例如,在图2A中图示的集群中,节点210(1)用作针对集群200的配置主节点并且将节点210(1)、210(2)、210(3)和210(4)标识为属于集群200。然而,在其他示例中,集群200中的其他节点210中的任一个可以用作针对集群200的配置主节点。在一些示例中,在Dragojevic、Narayanan、Nightingale、Renzelmann、Shamis、Badam和Castro的微软研究文章“No compromises:distributedtransaction with consistency,availability,and performance”(可从https://dl.acm.org/citation.cfm?id=2815425处获得副本)中描述的配置协议可以被使用。

图2B图示了在集群200的示例性重新配置之后的图2A中示出的计算节点200的示例性集群200。作为集群200的重新配置的部分,节点210(1)已经从集群200移除,并且新节点210(5)(其先前不是集群200的部分)已经被添加到集群200。因此,在集群200的示例性重新配置之后,集群200包括节点210(2)、210(3)、210(4)和210(5)。

集群200的重新配置可以被周期性地执行,以按要求移除降低集群200的性能的任何节点210和/或将附加节点210添加到集群200。备选地或额外地,集群200的重新配置可以由于集群200中的节点210中的一个或多个节点变得不可用(例如由于硬件故障或日常维护)而被执行。在用作针对集群200的主配置节点的节点210在其重新配置之后(诸如以在主配置节点的故障之后为例)从集群200被移除的情况下,在一些示例中使用的配置协议提供用于允许新主配置节点210针对集群200被确定的机制。例如,在图2B中图示的集群200的重新配置期间对先前主配置节点210(1)的移除之后,节点210(2)可以被确定为针对集群200的新主配置节点。新主配置节点210(2)可以然后通知节点210(3)、210(4)和210(5)在重新配置之后集群200包括节点210(2)、210(3)、210(4)和210(5)。

节点210中的每个节点包括至少一个本地时钟230,利用该至少一个本地时钟该节点确定执行可以被分配给该节点的各种计算任务的合适时间。然而,可以在计算节点210的集群200上运行的许多应用要求由在集群200的不同节点210上运行的过程采取的动作跨整个集群200被协同。这意味着有必要使节点210的本地时钟230被同步使得它们提供与彼此大致相同的时间。

在图2A和图2B中图示的示例性集群中,这通过将节点中的一个节点提名为用作针对集群200的主时钟来实现。也就是说,节点210中的一个节点提供其他节点可以同步到的参考时钟(即,主时钟)。其他节点可以然后同步到由该节点提供的主时钟。这意味着集群200的节点不要求对提供起来比较昂贵的可靠外部时钟(诸如GPS或原子时钟)的访问。在一些示例中,针对集群200的配置协议可以指示集群200的配置的管理和主时钟的提供由相同的主节点210(其是配置主节点,并且用于提供主时钟的主节点是相同的)执行。

在提供针对集群200的主时钟的上下文中,提供主时钟的节点210可以被称为主节点210,而其他节点可以被称为从节点(尽管在可以在集群200内被执行的其他功能的上下文中,其他节点210可以被认为是主节点)。

如将认识到的,由从节点生成的本地时间戳将不可避免地为主时钟的近似,即使当它们与主时钟定期同步时。这是由于几个因素。首先,除了在跨网络的时间戳从主节点到从节点的传输中引入的计时不确定性之外,存在在生成/处理远程时间戳中由每个节点执行的处理引入的一些计时不确定性。这意味着远程时间戳将不可避免地表示相比于其被从节点接收的时间点的先前的时间点。其次,每个节点210利用在它们相应的处理器102内提供的本地时钟。由于每个处理器内的时钟速度(或振荡)之间的差异,本地时钟230将遭受相对于集群200中的其他时钟的时钟漂移现象。该现象意味着即使集群中的两个时钟在相同时间点以相同值开始,那些时钟的值将由于时钟中的一个时钟比另一个时钟更快地运行而随时间出现分歧(diverge)。在从节点中的每个从节点上的本地时钟与主节点的主时钟上的值之间的这种潜在差异可以被封装在由从节点中的每个从节点维持的不确定性度量中。不确定性度量提供可以存在于由从节点的本地时钟产生的特定时间戳(其可以被称为本地时间戳)与由主时钟提供的时间戳(其可以被称为全局时间戳)之间的潜在差异的指示。具体地,不确定性度量提供远程主时钟在本地时间戳从本地时钟被测量到的时间点处的可能的最小值和最大值两者的指示。这对于可以在集群200(诸如下面讨论的分布式事务性存储器系统)上运行的某些应用是需要的,其要求保证主时钟将不大于(或在其他情形中小于)在给定时间点处的特定值。也就是说,某些应用要求保证集群中的节点的时钟中没有一个将具有落入由针对每个节点的本地时钟的不确定性度量指示的范围之外的值。

在本文讨论的示例中,时钟随着时间的推移而递增。也就是说,时钟的较低值比时钟的较高值表示更早的时间点。因此,由不确定性度量表示的主时钟的最大值将是大于由本地时钟提供的本地时间戳的值,并且由不确定性度量表示的主时钟的最小值将是低于本地时间戳的值。然而,将认识到,时钟可以以高的值开始并且随着时间的推移而递减。在这样的示例中,较高时钟值比时钟的较低值表示更早的时间点。类似地,由不确定性度量表示的主时钟的最大值将是低于由本地时钟提供的本地时间戳的值,并且由不确定性度量表示的主时钟的最小值将是高于本地时间戳的值。在任一情况下,主时钟的最小值可以被认为是由主时钟指示的时间与本地时钟的值相比可以早多少,同时主时钟的最大值可以被认为是由主时钟指示的时间与本地时钟的值相比可以迟多少。

图3图示了由从节点210执行以使它们的本地时钟230同步到由主节点210提供的主时钟的方法300。

在操作310处,方法300存储表示本地时钟的当前值的第一值。

在操作320处,方法300从主节点210接收指示远程时钟的当前值的远程时间戳(或主时间戳),主节点210的远程时钟用作针对集群的主时钟。

在操作330处,方法300存储表示在远程时间戳被接收到时本地时钟230的当前值的第二值。在操作330处被存储的第二值表示已知迟于远程时间戳被生成的时间的时间点(即,当远程时间戳被接收到时)。

在操作310处存储的第一值表示已知早于远程时间戳被生成的时间的时间点。在一些示例中,从节点可以将同步请求发送给主节点请求远程时间戳。在这样的示例中,第一值可以表示请求被发送给主节点的时间点。在其他示例中,主节点可以周期性地将远程时间戳发送给从节点。在这样的示例中,第一值可以表示先前同步消息被接收时的时间戳。在另外的其他示例中,混合方法可以被采用,其中主节点周期性地发送远程时间戳并且从节点根据需要发送同步请求。为了最小化在从节点处围绕主时钟值的不确定性,期望第一值表示在远程时间戳被生成之前已知已经出现的最新时间点。

在操作340处,方法300基于远程时间戳将本地时钟230设置为远程时钟的当前值。本地时钟的值将因此大致表示远程时钟的值(在以上讨论的不确定性的边界内)。

将认识到,设置时钟230的值是抽象操作并且不涉及改变时钟的实际值。代替地,来自同步操作的信息被存储,其允许时间戳从时钟生成使得它们大致表示主时钟的时间戳。作为示例,设置时钟230的值可以通过改变在从节点处存储的表示本地时钟值与(如由主时间戳所指示的)主时钟之间的差的偏移值来实现。在这样的示例中,偏移值用于当本地时间戳被生成时调节本地时钟的值。

在操作350,如果确定同步应当继续,那么方法300返回到操作310。否则,方法300结束。

图4图示了用于使从节点210上的两个或更多个本地时钟与主时钟230同步的示例性方法400。本地时钟的每个由与从节点210的处理器102的不同处理核104相关联的相应的时钟106提供。本地时钟中的每个通过与该时钟所属于的处理核104相关联的线程(或者,在一些示例中,多个线程)来同步。这些线程可以被称为同步线程。同步线程中的每个执行以上参考图3描述的方法300以在线程正在被处理时使处理核心104的时钟106同步。

在操作410处,方法400使用由每个线程存储的第一值来确定针对每个线程的远程时钟的相应的最大值。远程时钟的相应的最大值基于被接收到的远程时间戳、和从节点的本地时钟与远程主时钟之间的预定最大时钟漂移速率、以及当前时间与第一存储的值之间过去的时间量来确定。具体地,自第一值(其是两个存储的值中的较早者)被存储之后过去的时间可以被计算并且乘以最大时钟漂移速率以计算自远程时间戳被接收到之后可能已经发生的时钟漂移的最大量。该时钟漂移然后被添加到远程时间戳以确定主时钟在该时间点处可能是的最大值。

在操作420处,方法400使用由每个线程存储的第二值来确定针对每个线程的远程时钟的相应的最小值。远程时钟的相应的最小值基于被接收到的远程时间戳、和从节点的本地时钟与远程主时钟之间的预定最小时钟漂移速率、以及当前时间与第二存储的值之间过去的时间量来确定。具体地,自第二值(其是两个值中的较迟者)之后过去的时间可以被计算并且乘以自远程时间戳被接收到之后可能已经发生的最小时钟漂移速率。该时钟漂移然后被添加到远程时间戳以确定主时钟在该时间点处可能是的最小值。

在一些示例中,远程时钟的最小值和最大值可以针对每个线程由线程本身确定。备选地,在其他示例中,这些确定可以由在从节点210上运行的其他过程执行。

已经基于已经由每个线程执行的同步来确定了最小值和最大值,方法400将这些值作为整体整合为针对从节点210的远程时钟的单个最小值和最大值。具体地,方法400从针对每个线程确定的最大值之中选择远程时钟的最低(即,最早)的最大值。类似地,方法400从针对每个线程确定的最小值之中选择远程时钟的最大(即,最迟)的最小值。

在操作430处,方法400提供最低的最大值和最大的最小值的指示作为针对由从节点上的相应的本地时钟中的每个本地时钟提供的针对本地时间戳的不确定性度量。通过以这种方式整合来自跨多个线程的最小值和最大值,更好的、更准确的不确定性度量可以被提供用于在从节点210处的远程时钟。这是因为不同处理核104上的不同线程可以实现与远程时钟的更好的同步。这可以例如由于缓慢运行的线程中的一个或多个线程。在一些示例中,同步线程中的一个或多个经由与由其他线程使用的通信协议不同的通信协议从主节点接收远程时间戳。由于不同的通信协议可以更好地适合于不同网络条件,所以针对由从节点遇到的给定一组网络条件,通信协议之一可以比其他网络协议提供更好的同步。额外地或备选地,在其他示例中,同步线程中的一个或多个可以经由与由其他线程使用的通信介质不同的通信介质接收远程时间戳。由于不同的通信介质具有不同的属性,所以到主时钟的同步可以经由通信介质之一比经由另一个通信介质更有效地被执行。最低的最大值和最大的最小值可以分别由两个不同的同步线程提供。被确定为不对最低的最大值和最大的最小值作出贡献的任何同步线程可以被停止,使得同步使用仅仅更有效地同步的那些线程继续。没有通过相应的同步线程被直接同步到主时钟的任何本地时钟可以代替地被同步到其他本地时钟中的一个本地时钟(使用针对处理器102内的不同核104的时钟106之间的内部时钟漂移的指定容差)。

在一些示例中,从节点可以监测其经历的相对于主时钟的实际时钟漂移速率,并且如果实际时钟漂移速率超过预定最小或最大时钟漂移速率,可以离开集群200(即,停止参与到其中)。这通过查看来自与主时钟的两个单独的同步的被存储的值来确定。具体地,较早同步的第一存储的值与较迟同步的第二存储的值之间的范围被计算为两个同步之间的最大时钟差,并且较早同步的第二存储的值与较迟同步的第一存储的值之间的范围被计算为最小时钟差。如果两个同步之间的时间除以所计算的最大时钟差超过预定最大时钟漂移速率,或者如果两个同步之间的时间除以最小时钟差小于预定最小时钟漂移速率,那么实际时钟漂移速率被认为超过预定最小或最大时钟漂移速率。在一些示例中,预定最小和最大时钟漂移速率可以在该确定期间通过安全因子来调节以确保时钟漂移安全落入由预定最小和最大时钟漂移速率指定的边界内。

在操作440处,方法400可以重新迭代以执行另外的同步。由于时钟漂移量依赖于在同步之间过去的时间,期望方法400定期重复使得任何两个同步之间的时间保持很低。

图5图示了要由节点的集群200的新主节点210执行以通过使用其本地时钟来建立主时钟的示例性方法500。该方法500在集群中包括的节点210的重新配置之后被执行。在重新配置之前,主时钟由旧主节点210提供,集群200中的其他节点210将它们的本地时钟230同步到该主时钟。在一些示例中,集群200的重新配置涉及从集群200添加和/或移除节点210。例如,旧主节点210可能已经从集群200移除,使新主时钟的建立成为必需。当然,在其他示例中,集群的重新配置可以提名新主节点210提供针对集群200的主时钟,即使旧主节点210还没有被移除。在一些示例中,新主节点210可以是已经被添加到集群200的节点210。也就是说,新主节点210在重新配置之前可能还没有存在于节点的集群中。一般,术语“旧”旨在指示在集群的重新配置之前正在执行特定作用的特定节点,而术语“新”旨在指示在集群的重新配置之后正在执行特定作用的特定节点。

在操作510处,方法500将消息发送到节点的集群中的其他节点以指导它们禁用它们相应的本地时钟。在它们的本地时钟被禁用的情况下,其他节点将导致要求来自本地时钟的时间戳的任何处理(例如,分布式存储器中的事务)被暂停。

在操作520处,方法500等待直到其已经从节点的集群中的所有其他节点接收到指示它们相应的本地时钟已经被禁用的确认。.

在操作530处,方法500标识通过重新配置从节点的集群200已经移除的任何节点210的所有租用将已经到期的时间,并且等待直到所标识的时间已经经过。由于这些节点210在重新配置之后不再处于集群200中,所以它们将不能接收到禁用它们的本地时钟的指令并且将继续在重新配置之前已经接收到的任何处理(例如,分布式存储器中的事务),包括从它们的本地时钟获得时间戳。在它们的租用到期之后,这些节点210将不再能够与集群200交互,意味着在此刻之后没有来自这些节点的时间戳将能够存在于集群200中。

在操作540处,方法500确定由旧主节点210提供的主时钟在从集群200移除的节点210的租用到期的时间处本来可以是的最大值。该值是由这些节点的本地时钟本来可以提供的、直到它们的租用到期的时刻的最大值。在一些示例中,该最大值可以通过简单地将相对“大”预定量添加到先前主时钟上来确定。该“大”量可以比时钟上的正常操作的量度大一个数量级或更多,以确保其很可能大于由集群200中的节点210先前可能发出的任何时间戳。然而,在其他示例中,集群200的节点210维持关于它们与旧主时钟的同步的不确定性度量,如早前所描述的。这些不确定性度量基于预定最大时钟漂移速率和自该节点210与主时钟的上次同步之后过去的时间量来指示主时钟的最大值。新主节点210可以因此将在租用到期的时间处旧主时钟的最大值确定为由在重新配置之后仍然在集群中的节点(并且其因此被同步到旧主时钟)中的任一个指示的最大(即最近)值。在一些示例中,节点可以提供主时钟的最大值的指示以及它们的本地时钟已经在接收到在操作510中发送的消息之后被禁用的确认。这减少在集群200中的节点210之间需要发送的消息的数量。

在操作550处,方法500将其本地时钟设置为大于最大值,有效地,将主时钟向前“跳”到针对集群的保证的“新”值。如早前所讨论的,本地的“设置”是抽象操作,其影响由时钟生成的时间戳,而不是时钟本身的实际底层值。使该“跳”尽可能小,同时仍然保证没有指示在新主时钟值之后出现的时间的时间戳将可能被发出是有利的。这是因为,当时间在计算机系统中被表示为固定数量的位时,仅仅存在可以被表示的某些时间范围。通过保持“跳”最小,其最大化在主时钟溢出发生之前可用的时间量。

在操作560处,方法500向从节点210指示它们的本地时钟230可以被重新启用。这意味着从节点210将同步到新主时钟并且继续在本地时钟被禁用的情况下先前可能已经被暂停的任何处理。在一些示例中,主节点210可以将消息发送到从节点以显式地指导它们重新启用它们的本地时钟230。在其他示例中,指示可以被隐式地给出。例如,从节点210可以被布置为在它们的本地时钟230已经被禁用之后定期尝试它们与新主节点210的重新同步。重新启用时钟的指示可以因此通过对来自从节点210的同步请求做出响应(其中在先前,主节点210不对那些请求做出响应或以错误响应)而由新主节点210提供。

图6图示了要由节点的集群200的从节点210执行以使其本地时钟同步到由节点的集群中的主节点提供的主时钟的示例性方法600。

在操作610处,方法600将本地时钟同步到集群200的主节点。该同步可以以以上关于图3和图4描述的方式来执行(即,使用或不使用多个本地时钟和线程)。

在操作620处,方法600接收针对集群的新配置的指示,新配置210指示针对集群200的新主节点210。新配置的指示可以使用针对集群200的现有配置协议来指示。

在可选操作630处,方法600维持在集群200的重新配置之前针对所执行的与主节点(即先前主节点)的同步的不确定性度量。该不确定性度量基于预定最大时钟漂移速率和自从与主时钟(同样,其是先前主时钟)的上次同步之后过去的时间量来指示主时钟(即,先前主时钟)的最大值。

在操作640处,方法600从新主节点接收消息,指导从节点禁用本地时钟。在一些示例中,消息被隐式地提供。也就是说,时钟的禁用可以由从节点响应于接收到其中新节点正在提供主时钟的新配置的指示而执行。

在操作650处,方法600禁用本地时钟。禁用本地时钟230意味着从节点210停止提供针对正被执行的任何处理的时间戳。在正被执行的处理要求时间戳的情况下,对本地时钟230的禁用因此导致处理被暂停,直到本地时钟230被重新启用并且时间戳可以被获得。

在操作660处,方法600将指示本地时钟230已经被禁用的消息发送到新主节点210。

在可选操作670处,方法600向新主节点210提供来自在操作620处维持的不确定性度量的先前主时钟的最大值的指示。在一些示例中,该指示被包括于在操作650处被发送的消息中,其指示在操作640处被发送的本地时钟230已经被禁用。

在操作680处,方法600从新主节点210接收本地时钟应当被重新启用的指示。在一些示例中,从节点可以定期尝试同步到主节点210。本地时钟应当被重新启用的指示在主节点210以针对新主时钟的时间戳对同步尝试之一做出响应时被接收。在其他示例中,指示可以简单地为指示本地时钟230应当被重新启用的消息,在其之后,从节点210可以开始尝试在操作690处同步到由新主节点210提供的主时钟。在时钟重新启用并被同步到新主时钟的情况下,被分配给从节点210的要求时间戳的任何处理可以被继续进行。

在一些示例中,在从节点210与新主节点之间的同步所需的消息(诸如指导从节点禁用本地时钟的消息、来自从节点的指示本地时钟已经被禁用的消息、以及从新主节点210到从节点210的本地时钟230应当被重新启用的指示)通过将附加信息***到用作针对集群的配置协议的部分的现有消息中来提供。这减少在集群200中的节点210之间发送附加消息以将本地时钟同步到主时钟的需要。

通过上述技术,节点的集群200可以允许应用跨集群200的节点210同步动作而不要求昂贵的外部的有复原能力(或可靠)的时钟,诸如GPS或原子时钟。另外,即使集群200内提供主时钟的节点可以发生故障,集群200也可以以保证针对集群内的动作的时间线的完整性的方式重新同步来自新主节点的主时钟。由这些技术提供的属性有用于可以在集群200上运行的各种各样的应用。要求这样的特征的应用的一个示例是分布式事务性存储器系统。

分布式事务性存储器系统是可以在节点的集群200上运行的应用的示例。分布式存储器系统将对象存储在集群内的节点210上,并提供用于访问那些对象的单个全局地址空间(即针对存储在分布式存储器系统中的所有对象的单个地址空间,不管它们当前驻存于哪个节点210上)。这使得对象能够在无需知道对象驻存于节点210中的哪个节点上的情况下被访问。

在一些示例中,分布式存储器系统复制被存储在集群200的节点210之间的对象,使得特定对象的相同副本由集群200中的至少两个节点210存储。在这样的示例中,副本之一可以被标识为对象的主副本或权威副本,而其他被标识为备份副本。通过复制对象的副本,分布式存储器系统可以在集群200的节点210中的一个或多个节点变得不可用(诸如以由于硬件故障为例)的情况下继续操作而没有任何数据损失。

将数据读取和/或写入到分布式存储器系统的事务也被分布在集群200的节点210之间并且被并行执行。这提供了针对分布式存储器系统的可扩展性,从而允许更大的事务的吞吐量。然而,当事务由集群200的不同节点210并行执行时,有必要确保事务的正确串行化(以及在一些情况下严格串行化)。

图7图示了用于执行在节点的集群200上操作的分布式事务性存储器系统内的、包括一个或多个读取操作的事务的示例性方法700。

在可选操作710处,方法700确定在当前时间处主时钟的最大值。在一些示例中,这通过参考(如以上关于图3和图4所讨论的)由节点210维持的针对主时钟的不确定性度量来实现。然而,在其他示例中,不同技术被使用,诸如假设针对时钟同步中的错误的预定“大”值(其不是基于自上次同步之后过去的时间)。

在可选操作720处,方法700等待直到(如由不确定性度量所指示的)主时钟的当前最小值在操作710中确定的最大值之后(即迟于其)。

可选操作710和720一起使得方法700能够提供读取事务的严格串行化。然而,在一些示例中,可选操作710和720不被执行,方法700在操作730处开始。即使操作710和720不被执行,方法700仍然保证读取事务的正确串行化(但不保证严格)。

在操作730处,方法700生成早于在当前时间处的主时钟的最小值的读取时间戳。当可选操作710和720被执行时,所生成的读取时间戳也在操作710中确定的主时钟的最大值之后(或等于其)。该读取时间戳指示读取事务被认为发生的时间点,其将早于可以由集群200中的节点210中的任一个提供的任何可能的当前时间戳。如下面进一步所讨论的,读取时间戳也可以在存储器系统是多版本存储器系统的情况下确定对象的哪个版本被读取。

在操作740处,方法700从对象驻存于其上的集群200的相应的节点210读取对象。在一些示例中,对象可以使用远程直接存储器访问(RDMA)来读取,使得对象位于其上的节点210的处理器在读取对象中不被涉及。被读取的对象中的每个对象与指示对象何时被创建的时间戳(其是写入对象的事务的写入时间戳)相关联。

在操作750处,方法700核实与对象中的每个对象相关联的时间戳早于针对事务的读取时间戳。如果与读取对象相关联的时间戳中的任一个表示在读取时间戳之后的时间,那么这意味着对象已经通过后续事务被写入。

因此,在操作760,如果与读取对象相关联的时间戳中的任一个指示在读取时间戳之后的时间,那么方法700执行针对读取事务的错误处理,因为如果事务要使用读取对象来完成,则无效结果将被提供。在一些示例中,错误处理简单地涉及中止事务。在其他示例中,错误处理涉及尝试找到对象的先前版本,该先前版本以其在由针对事务的读取时间戳指示的时间处存在的形式。事务可以然后使用对象的先前版本来完成。这在下面关于下面的图10更详细地讨论,该图提供了用于读取对象的特定版本的方法,并且可以用于找到当其在针对事务的读取时间戳的时间处存在的对象的版本。

然而,如果与读取对象相关联的时间戳中没有一个迟于读取时间戳,那么方法700继续使用已经被读取的对象来完成读取事务。

图8图示了用于执行在节点的集群200上操作的分布式事务性存储器系统内包括一个或多个写入操作的事务的示例性方法。

在操作810处,方法800读取要被写入的对象。如关于图7所讨论的,RDMA读取可以用于读取驻存于集群200中的其他节点210上的对象。在读取要被写入的对象中,操作810在一些示例中创建对象的临时副本,在完成事务之前在其上进行写入操作。

在操作820处,方法800锁定要被写入的对象中的每个对象。用于锁定对象的任何常规技术可以被使用。

在操作830处,方法800等待直到对象中的每个对象已经被锁定。一旦对象被锁定,在此刻之后在对象上操作的其他事务将看见锁定并且能够确定对象可能将要被写入,即使其他事务在该事务被提交之前被处理。

在操作840处,方法800检查要被写入的对象中的任何对象自从它们被读取和锁定之后是否已经改变。这通过检查与每个对象相关联的时间戳自从它在操作810处被读取之后还没有改变来实现。

如果对象中的任何对象自从它在操作810处被读取之后已经改变,那么方法800在在操作850处执行错误处理并中止事务。

否则,如果对象中没有一个对象自从它们在操作810处被读取之后已经改变,那么方法800在操作860处生成针对事务的写入时间戳。写入时间戳表示事务被认为发生的时间点。写入时间戳被生成使得其在主时钟的最大值(在所有要被写入的相应的对象已经被锁定的时间点处)之后。这可以使用在节点210处维持的不确定性度量来确定。

在操作870处,方法800等待直到(如由节点维持的不确定性度量所指示的)主时钟的当前最小值在写入时间戳之后。

在操作880处,方法800在要被写入的对象上执行写入操作,由此完成事务。

通过以这种方式生成写入时间戳(使得写明确地在相对于锁定被获得的时间处的主时钟的未来)并且然后等待直到写入时间戳明确地在相对于主时钟的过去(使用不确定性度量),集群200中的节点210之间的事务的正确序列化可以得到保证。

将认识到,图8中图示的方法800可以与图7中图示的方法700相组合以处理包括读取操作和写入操作两者的事务。在这么做时,附加检查被执行以核实检查已经被读取(但未被写入)的对象自从读取时间戳之后还没有改变。该检查是对在方法700的操作750处的执行期间执行的检查的附加。该附加检查就在图8的操作880之前发生(即,在等待主时钟的当前最小值迟于写入时间戳之后)。因此,对于被读取但未被写入的对象,两个检查被执行以检查对象还没有改变,一个在事务的执行期间被执行,一个在事务被提交之前立即被执行。

以上关于图7和图8描述的方法允许乐观并发控制被使用在分布式事务性存储器系统中。这意味着能够受益于使用远程直接存储器访问(RDMA)读取来在集群200中的另一节点210处读取驻存于一个节点210上的对象,因为对RDMA读取的使用防止对悲观并发控制的使用。使用RDMA读取来访问对象帮助改进对象能够由集群内的节点210访问的速度,并且帮助防止瓶颈(因为远程节点210可以读取驻存于另一节点210上的对象而不涉及其他节点210的处理器)。

在一些示例中,分布式事务性存储器系统是多版本存储器系统。这意味着存储器系统可以存储其存储的对象的先前版本。对象的先前版本中的每个与指示对象的该版本被初始创建的时间的版本时间戳(即,创建对象的该版本的事务的写入时间戳,而不是覆写其的事务的写入时间戳)相关联。

图9图示了用于在多版本事务性存储器系统中执行读取事务的示例性方法900。读取事务可以要求要被读取的对象的特定版本。特定版本表示当其在特定时间点处存在的对象。具体地,读取事务具有与其相关联的读取时间戳,要求当其在由要被读取的读取事务指示的时间点处存在的对象的版本。

在操作910处,方法900从存储器系统中取回对象的最新版本。在每个节点210中被分配用于存储对象的当前版本的存储器可以与被分配用于存储对象的先前版本的存储器分离。

在操作920处,方法900确定所取回的对象的版本的版本时间戳是否比读取时间戳更旧。如果它是的话,那么对象的该版本是存在于由读取时间戳指示的时间处的对象的版本,并且在操作930处,对象的该版本被提供。否则,对象的更旧版本被需要。

在操作940处,方法900确定针对所取回的对象的版本历史是否已经被截断。在一些示例中,对象的每个版本与指示对象的先前版本的存储器地址的指针相关联。在这样的示例中,空指针值指示版本历史已经被截断。然而,在其他示例中,用于(诸如在存储器分配表中使用位标志)指示版本历史的截断的不同技术被代替地使用。

如果版本历史已经被截断,那么当对象的先前版本对于事务是需要的但是不可用时则遇到错误。因此,在操作950处,方法900中止读取事务。

然而,如果版本历史还没有被截断,那么方法900前进到在操作960处取回对象的先前版本。这例如通过跟随指示先前版本的存储器位置的、与对象的当前版本相关联的指针来实现。方法重新迭代回到操作920以评价先前版本是否是对于读取事务所需要的对象的版本。

图10图示了用于在多版本事务性存储器系统中执行写入事务的示例性方法1000。

在操作1010处,方法1000确定是否存在足够的存储器来存储对象的新版本和对象的当前版本两者。在一些示例中,被分配用于存储对象的当前版本的存储器不同于被分配用于存储先前版本的存储器。因此,确定是否存在足够的存储器涉及确定在存储器中是否存在足够的空间被分配用于存储先前版本用于存储对象的当前版本的副本并且确定在存储器中是否存在足够的空间用于通过覆写当前版本来存储新版本。

如果不存在足够的存储器来存储对象的两个版本,那么方法1000在操作1020处截断针对对象的版本历史。在一些示例中,多版本存储器系统中的对象的每个版本与指示对象的先前版本被存储于其处的存储器位置的指针相关联。在这样的示例中,截断针对对象的版本历史通过在新对象中将该指针设置为空来实现。

否则,如果存在足够的存储器来存储对象的两个版本,那么方法1000在操作1030处分配用于存储对象的当前版本的副本的存储器。方法然后在操作1040处在所分配的存储器中创建对象的副本,并且将对象的当前版本的副本的位置的指示与要被写入的对象的新版本相关联。在一些示例中,该指示由指针提供。

在操作1060处,方法1000将关于版本历史是否已经被截断的指示与对象的新版本相关联。该指示可以例如通过将与对象相关联的标志设置为合适值来提供。备选地,该指示可以通过用于指示对象的当前(很快为先前)版本的位置的相同指针来提供。具体地,指针可以被设置为空以指示版本历史已经被截断并且被设置为任何其他值以指示版本历史已经被维持。

在操作1070处,方法1000将对象的新版本写入到存储器系统,由此替换当前版本。在一些示例中,对象的新版本被覆写在对象的当前版本之上(即,使得其占用相同的存储器地址)。对象的先前版本然后由(在新存储器地址处的)副本来提供。这在远程直接存储器访问(RDMA)读取用于由另一节点访问驻存于一个节点上的对象时是有利的,因为其意味着针对对象的当前版本的全局地址保持不变。然而,其他示例(诸如不利用RDMA读取来读取对象的那些)可以将对象的新版本写入到新分配的存储器(具有与对象的当前版本不同的存储器地址)。

在一些示例中,方法900和1000与以上结合图7和图8描述的用于分别执行涉及读取操作和写入操作的事务的方法相组合。然而,在其他示例中,方法900和100可以独立于这些方法700和800来执行。在任一情况下,方法900和1000提供用于即使在不存在足够的空间来存储对象的先前版本的副本的情况下写入操作继续的能力。这意味着没有必要使写入操作等待直到存储副本的足够的空间变得可用。代替地,写入操作可以写入对象并且简单地截断其版本历史。在其中对象的版本历史被截断的这样的情形中,存在历史的截断将不会影响任何未来事务的可能性。也就是说,存在没有未来事务将要求已经被截断的对象的版本的可能性。然而,即使它们要求,用于读取对象的方法900也可以检测到版本历史已经被截断并且简单地中止事务,由此防止无效数据被读取。另外,通过允许事务优雅地处理其中读取操作遇到针对其的先前版本的对象被需要但是版本已经被截断的情形,方法900和1000使得分布式存储器系统能够仅仅保持相同节点210上的对象的先前版本保持为对象的主要版本而无需将对象的先前版本复制到存储对象的备份副本的节点210。这是因为,如果节点要发生故障,那么对象的备份副本可以被视为它们的版本历史已经被截断,其可以由读取事务优雅处理。因此,将对象的先前版本维持在分布式多版本存储器系统中所需要的存储器量以及处理和通信开销可以被大大减少。

在多版本存储器系统中,期望仅保持对象的先前版本可用直到使得它们将不再被在系统中运行的任何事务需要的时间。否则,存储将不被使用的对象的先前版本用尽存储器。标识并释放由将不再被使用的对象的先前版本使用的存储器的过程被称为垃圾收集。为了帮助垃圾收集,存储在存储器系统中的对象的每个先前版本与两个时间戳相关联,第一时间戳和第二时间戳,第一时间戳是与对象的版本相关联的时间戳(也就是说,从该时间戳开始,对象的版本是当前的,并且任何更早时间戳在对象创建之前或者与对象的先前版本相关联),第二时间戳是将对象的副本创建为对象的先前版本的事务的写入时间戳(也就是说,对象的版本是当前的最新时间戳,并且任何后续时间戳与对象的更新的版本相关)。尽管第一时间戳被用于确定对象的版本是否是针对特定时间戳的期望版本,但是是第二时间戳被用于确定是否要垃圾收集对象的版本。

分布式多版本存储器系统支持分布式事务。也就是说,节点210中的一个可以以特定读取时间启动事务并且通过将其提供给多个其他节点用于处理来“扇出(fan-out)”事务。

图11图示了用于在分布式多版本存储器系统中对节点210处存储的对象的先前版本执行垃圾收集的示例性方法1100。

在操作1110处,方法1100维持指示当前正在由节点210处理的最旧事务的读取时间的第一本地时间戳。当旧事务在节点210上被完成时,该本地时间戳被更新以反映新的最旧事务的读取时间戳。尽管节点210可以保证在节点上没有事务将需要比该第一本地时间戳更旧的对象的任何先前版本,但是可能的是,当前正在由其他节点210中的节点处理的事务可能仍然要求访问那些先前版本。

在操作1120处,方法1100将第一本地时间戳提供到针对集群200的主节点210。主节点210根据从从节点210接收到的时间戳中的每个来确定针对集群200的最旧活动事务(active transaction)并且将针对集群200的该最旧活动事务的读取时间戳作为第一全局时间戳提供回到从节点210。

在操作1130处,方法1100从主节点210接收第一全局时间戳。第一全局时间戳对应于由集群200中的任何节点210记录的最早的第一本地时间戳(即,第一全局时间戳提供集群中的最旧活动事务的读取时间戳)。

在操作1140处,方法1100存储第一全局时间戳。被存储的第一全局时间戳是最近接收到的、覆写任何先前接收到的第一全局时间戳的第一全局时间戳。

在操作1150处,方法1100拒绝具有比第一全局时间戳更旧的读取时间戳的任何事务。

在操作1160处,方法1100将当前存储的第一全局时间戳提供到主节点210。主节点210确定仍然由集群中的节点210中的任何节点存储的最早的第一全局时间戳并将针对集群200的该最早的第一全局时间戳作为第二全局时间戳提供回到从节点210。

在操作1170处,方法1100从主节点210接收第二全局时间戳。第二全局时间戳可以早于已经在该节点处存储的第一全局时间戳。具体地,这可以在集群200中的节点210中的一个(或多个)节点在当前第二全局时间戳被生成时还没有接收到更新的第一全局时间戳时发生。

在操作1180处,方法1100存储第二全局时间戳。被存储的第二全局时间戳是最近接收到的、覆写任何先前接收到的第二全局时间戳的第二全局时间戳。

在操作1190处,方法1100执行对具有小于被存储的第二全局时间戳的写入时间戳(也就是说,针对在覆写其之前创建对象的副本作为先前版本的事务的写入时间戳)的对象的任何先前版本的垃圾收集。本质上,对先前版本的垃圾收集解除分配被分配为存储那些先前版本的存储器,从而使其可用于未来使用。这意味着重要的是,确保先前版本在其已经被垃圾收集之后不被读取,因为数据可能已经通过对解除分配的存储器空间的后续写入而被损坏。

应当指出,尽管第一全局时间戳可以用作不支持跨集群的事务的并行执行的存储器系统中的垃圾收集点,但是其不足以确保当跨集群的事务的并行运行被支持时,没有仍然可能被需要的先前版本被垃圾收集。这是因为,当具有特定读取时间戳的分布式事务在系统内被创建时,发送事务的节点可以将事务传送到另一机器以用于执行并且可能在事务由其他机器接收之前发生故障。这意味着第一全局时间戳可以在其被其他机器接收之前进行到分布式事务的读取时间戳以外,因为在启动节点已经发生故障之后在集群中的其余节点中没有一个知道针对分布式事务的读取时间戳。这意味着集群中的节点中的一些节点可以开始对具有迟于分布式事务的读取时间戳的时间戳的对象的先前版本执行垃圾收集。同时,分布式事务可以随后在由其他节点接收新的第一全局值之前由其他节点接收(对事务的接收可以被推迟,例如由于网络拥塞)。由于其他节点还不知道新的第一全局值,所以其不能拒绝分布式事务。然而,由于系统中的其他节点可能已经垃圾收集了分布式事务所依赖于的对象的先前版本,所以处理分布式事务的结果将是不正确的。因此,有必要如以上所描述的生成第二全局时间戳以防止这种情况发生。

将认识到,针对集群的第一全局时间戳和第二全局时间戳的生成正在进行中,使得当前第一全局时间戳和第二全局时间戳将随着事务在集群200内被完成而前进。

在一些示例中,方法1100可以结合以上关于图9和图10描述的用于将对象的先前版本写入和读取到分布式多版本存储器系统的方法来执行。然而,在其他示例中,方法1100可以独立于那些方法900和1000来执行。方法1100允许对象的先前版本在最早时机(由此节省存储器)在存储器系统内被垃圾收集,同时保证没有当前在分布式系统中正在处理的事务仍然可能需要访问它们。

备选地或另外,本文描述的功能至少部分地由一个或多个硬件逻辑组件来执行。例如但不限于,可选地使用的说明性类型的硬件逻辑组件包括现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑器件(CPLD)、图形处理单元(GPU)等。

作为对本文描述的其他示例的备选或添加,示例包括以下编号的段落(NP)的任何组合:

NP1.一种方法,由节点的集群中的新主节点执行以在集群中包括的节点的重新配置之后,使用新主节点上的本地时钟来建立主时钟,其中集群中的节点中的每个节点包括被同步到主时钟的相应的本地时钟,主时钟由旧主节点在重新配置之前提供,方法包括:向节点的集群中的其他节点发送指导它们禁用它们相应的本地时钟的消息;从节点的集群中的其他节点接收指示它们相应的本地时钟已经被禁用的相应的确认;标识通过重新配置已经从节点的集群被移除的任何节点的所有租用将已经到期的时间;等待直到所标识的时间已经经过;确定由旧主节点提供的主时钟在所标识的时间处本来是的最大值;将本地时钟设置为大于最大值;以及向节点的集群中的其他节点指示以重新启用它们相应的本地时钟。

NP2.根据NP1的方法,其中:集群中的节点中的每个节点还维持针对它们相应的本地时钟的相应的不确定性度量,相应的不确定性度量指示基于时钟漂移的预定最大速率和自从相应的本地时钟与主时钟的上次同步之后过去的时间量的主时钟的最大值;并且确定由旧主节点提供的主时钟在所标识的时间处本来是的最大值包括:从由在重新配置之前存在于集群中、并且在重新配置之后仍然在集群中节点中的所有节点根据在重新配置之前与旧主节点的同步而维持的相应的不确定性度量之中确定最大值。

NP3.根据NP2的方法,其中,从节点的集群中的其他节点接收到的指示它们相应的本地时钟已经被禁用的确认包括:基于当节点在重新配置之前存在于集群中时由该节点根据在重新配置之前与旧主节点的同步而维持的不确定性度量的主时钟的最大值的相应的指示。

NP4.根据NP1-3中的任一项的方法,其中,新主节点在重新配置之前不存在于节点的集群中。

NP5.根据NP1-4中的任一项的方法,其中,向节点的集群中的其他节点指示以重新启用它们相应的本地时钟包括:向节点的集群中的其他节点发送指导它们重新启用它们相应的本地时钟的消息。

NP6.根据NP1-4中的任一项的方法,其中,向节点的集群中的其他节点指示以重新启用它们相应的本地时钟包括:对来自其他节点的要与主时钟同步的请求做出响应。

NP7.一种由节点的集群中的从节点执行以使从节点的本地时钟与针对节点的集群的主时钟同步的方法,主时钟由节点的集群的主节点提供,方法包括:使本地时钟与主节点同步;接收针对集群的新配置的指示,新配置指示针对集群的新主节点;从新主节点接收指导从节点禁用本地时钟的消息;禁用本地时钟;向新主节点发送指示本地时钟已经被禁用的消息;从新主节点接收本地时钟应当被重新启用的指示;以及基于从新主节点接收到的时间戳来同步本地时钟。

NP8.根据NP7的方法,其中,方法还包括:维持针对本地时钟的不确定性度量,不确定性度量指示基于时钟漂移的预定最大速率和自从相应的本地时钟与主时钟的上次同步之后过去的时间量的主时钟的最大值;以及向所述新主节点提供由根据与主节点的同步而被维持的不确定性度量指示的主时钟的最大值的指示。

NP9.根据NP8的方法,其中,被发送给新主节点的、指示本地时钟已经被禁用的消息包括主时钟的最大值的指示。

NP10.根据NP7-9中的任一项的方法,其中,方法还包括:从主节点接收指导从节点重新启用本地时钟的消息。

NP11.根据NP7-9中的任一项的方法,其中,方法还包括:向新主节点发送一个或多个同步请求,其中,本地时钟应当被重新启用的指示由主节点对同步请求中的一个同步请求做出响应而提供。

NP12.根据NP7-12中的任一项的方法,其中,节点的集群利用配置协议用于重新配置节点的集群并且选择用于管理节点的集群的配置的节点,其中,主时钟由被选择用于管理集群的配置的节点提供。

NP13.根据NP12的方法,其中通过将附加信息***到配置协议的消息中来提供以下各项中的一项或多项或全部:来自新主节点的指导从节点禁用本地时钟的消息;从从节点到新主节点的指示本地时钟已经被禁用的消息;以及从新主节点到从节点的本地时钟应当被重新启用的指示。

NP14.根据NP8的方法,其中,从节点包括两个或更多个线程,每个线程与相应的本地时钟相关联,并且使本地时钟同步到主节点包括:在每个线程中通过以下操作来使每个相应的本地时钟与远程时钟同步:存储针对线程的本地时钟的第一值;从主节点接收指示远程时钟的当前值的远程时间戳;在远程时间戳被接收时存储针对线程的本地时钟的第二值;并且基于远程时间戳来将针对线程的本地时钟设置为远程时钟的当前值;其中,方法还包括:针对线程中的每个线程,基于由该线程接收到的远程时间戳、自从根据相应的本地时钟针对该线程被存储的第一值过去的时间量、以及时钟漂移的预定最大速率来确定远程时钟的相应的最大值;针对线程中的每个线程,基于由该线程接收到的远程时间戳、自从根据相应的本地时钟针对该线程被存储的第二值过去的时间量、以及时钟漂移的预定最小速率来确定远程时钟的相应的最小值;从针对线程中的每个线程而被确定的相应的最大值之中,确定远程时钟的最低的最大值;从针对线程中的每个线程而被确定的相应的最小值之中,确定远程时钟的最大的最小值;以及将远程时钟的最低的最大值和最大的最小值的指示提供为针对由相应的本地时钟中的每个相应的本地时钟提供的本地时间戳的不确定性度量。

NP15.根据NP14的方法,其中,线程中的一个或多个线程经由与由其他线程使用的通信协议不同的通信协议从主节点接收远程时间戳。

NP16.根据NP14或NP15的方法,其中,线程中的一个或多个线程经由与由其他线程使用的通信介质不同的通信介质从主节点接收远程时间戳。

NP17.根据NP14-16中的任一项的方法,其中,使每个相应的本地时钟与远程时钟同步还包括:从主节点请求远程时钟的时间戳,其中,被存储的本地时钟的第一值是在请求被发送给主节点时本地时钟的值。

NP18.根据NP14-17中的任一项的方法,其中,方法还包括:针对每个线程,基于与两个单独的同步相关联的被存储的第一值和第二值来确定由本地时钟经历的漂移的实际速率是否超过漂移的预定最大速率或预定最小速率;以及响应于确定所接收的远程时间戳低于针对线程的远程时钟的所确定的最大的最小值或高于所确定的最低的最大值,禁用从节点。

NP19.一种用于在节点的集群中使用的系统,系统包括:本地时钟;以及时钟同步模块,其被布置为同步到由节点的集群中的主节点提供的针对节点的集群的主时钟,其中,在接收到指示新主节点的针对集群的新配置之后,时钟同步模块被布置为:响应于从新主节点接收指导从节点禁用本地时钟的消息而禁用本地时钟;向所述新主节点发送指示本地时钟已经被禁用的消息;响应于从新主节点接收到本地时钟应当被重新启用的指示而重新启用本地时钟;以及基于从主节点接收到的时间戳来同步本地时钟。

NP20.根据NP19的系统,其中,系统还包括两个或更多个处理核,每个核具有相应的本地时钟,并且时钟同步模块包括两个或更多个同步线程,两个或更多个同步线程被布置为在两个或更多个处理核中的相应的处理核上执行以通过以下操作来同步针对两个或更多个处理核中的相应的处理核的相应的本地时钟:存储针对线程的本地时钟的第一值;从主节点接收指示远程时钟的当前值的远程时间戳;在远程时间戳被接收时存储针对线程的本地时钟的第二值;并且基于远程时间戳来将针对线程的本地时钟设置为远程时钟的当前值,其中,时钟同步模块还被配置为:针对线程中的每个线程,基于由该线程接收到的远程时间戳、自从根据相应的本地时钟针对该线程被存储的第一值过去的时间量、以及时钟漂移的预定最大速率来确定远程时钟的相应的最大值;针对线程中的每个线程,基于由该线程接收到的远程时间戳、自从根据相应的本地时钟针对该线程被存储的第二值过去的时间量、以及预定时钟漂移的最小速率来确定远程时钟的相应的最小值;从针对线程中的每个线程而被确定的相应的最大值之中,确定远程时钟的最低的最大值;从针对线程中的每个线程而被确定的相应的最小值之中,确定远程时钟的最大的最小值;并且将远程时钟的最低的最大值和最大的最小值的指示提供为针对由相应的本地时钟中的每个相应的本地时钟提供的本地时间戳的不确定性度量。

NP21.一种用于在节点的集群中的节点处执行事务的方法,事务包括读取分布式事务性存储器系统中的相应的对象的一个或多个读取操作,其中,节点包括与节点的集群的主时钟同步的本地时钟,并且维持指示主时钟的当前最小值和当前最大值的不确定性度量,方法包括:生成表示早于主时钟的当前最小值的时间点的读取时间戳,读取时间戳表示事务的读取操作被认为发生的时间点;执行一个或多个读取操作以读取相应的对象;针对相应的对象中的每个相应的对象,确定表示该对象被写入的时间点的、与该对象相关联的时间戳是否指示在由读取时间戳表示的时间之后的时间;响应于确定与相应的对象中的一个相应的对象相关联的时间戳指示在由读取时间戳表示的时间之后的时间,执行针对该对象的错误处理过程。

NP22.根据NP21的方法,还包括在生成读取时间戳之前:基于不确定性度量来确定在当前时间点处主时钟的最大值;并且等待直到由不确定性度量指示的主时钟的当前最小值在主时钟的先前确定的最大值之后,其中,由所生成的读取时间戳表示的时间点在主时钟的所确定的最大值之后或者等于在主时钟的所确定的最大值。

NP23.根据NP21或NP22的方法,其中,错误处理过程包括中止事务。

NP24.根据NP21或NP22的方法,其中,存储器系统是多版本存储器系统,并且错误处理过程响应于确定对象与指示由分布式事务性存储器系统存储的对象的先前版本的位置的指针相关联:从由指针指示的位置读取对象的先前版本;响应于确定与对象的先前版本相关联的时间戳指示在由读取时间戳表示的时间之前或等于由读取时间戳表示的时间的时间,使用对象的先前版本来完成事务;并且响应于确定与对象的先前版本相关联的时间戳指示在由读取时间戳表示的时间之后的时间,关于对象的先前版本重新执行错误处理过程。

NP25.根据NP21-24中的任一项的方法,其中,由读取操作读取的相应的对象中的一个或多个对象被本地存储在节点上。

NP26.根据NP21-25中的任一项的方法,其中,由读取操作读取的相应的对象中的一个或多个对象被远程存储在节点的集群中的另一节点上。

NP27.根据NP21-26中的任一项的方法,其中,存储器系统是多版本存储器系统,并且读取操作被布置为读取被存储在多版本存储器系统中的对象的特定版本,特定版本表示当其存在于特定时间点时的对象,方法还包括:基于与所取回的对象的版本相关联的时间戳指示在特定时间点之后的时间点来确定需要对象的先前版本;确定针对所取回的对象的版本的版本历史是否已经被截断;响应于确定针对所取回的对象的版本的版本历史已经被截断,提供错误;响应于确定针对所取回的对象的版本的版本历史还没有被截断,取回对象的先前版本并关于对象的先前版本重复先前步骤,直到具有与指示在特定时间点之前或等于特定时间点的时间点相关联的时间戳的对象的版本被取回或者错误被提供。

NP28.根据NP27的方法,其中:对象的每个版本与指示对象的先前版本的位置的相应的指针相关联;并且确定针对所取回的对象的版本的版本历史是否已经被截断包括确定针对所取回的对象的版本的相应的指针的值是否为空。

NP 29.一种用于在节点的集群中的节点处执行事务的方法,事务包括写入分布式事务性存储器系统中的相应的对象的一个或多个写入操作,其中,节点包括与节点的集群的主时钟同步的本地时钟并且维持指示主时钟的当前最小值和当前最大值的不确定性度量,方法包括:读取要被写入的相应的对象;锁定要由一个或多个写入操作写入的相应的对象;针对相应的对象中的获得针对其的锁定的每个对象,确定与该对象相关联的表示时间点的时间戳自从它被读取之后还没有改变;基于不确定性度量生成表示事务的写入操作被认为发生的时间点的写入时间戳,由写入时间戳表示的时间点在要被写入的所有相应的对象已经被锁定的时间点处的主时钟的最大值之后;等待直到由不确定性度量指示的主时钟的当前最小值在由写入时间戳表示的时间之后;对要被写入的相应的对象执行一个或多个写入操作,并且通过解锁相应的对象来提交事务,其中执行一个或多个写入操作包括将要被写入的相应的对象与写入时间戳相关联。

NP30.根据NP29的方法,其中,存储器系统是多版本存储器系统,并且方法还包括:基于是否存在可用于存储对象的新版本和对象的当前版本两者的足够的存储器来确定针对对象的版本历史是否应当被截断;将关于针对对象的版本历史是否已经被截断的指示与对象的新版本相关联;并且当针对对象的版本历史不应当被截断时,将对象的当前版本的副本的位置的指示与对象的新版本相关联;将对象的新版本写入多版本事务性存储器系统。

NP31.根据NP30的方法,其中,关于针对对象的版本历史是否已经被截断的指示包括指针,当版本历史要被维持时,指针提供对象的当前版本的副本的位置的指示,或者当版本历史要被截断时,指针提供空值。

NP32.根据NP30或NP31的方法,还包括响应于确定针对对象的版本历史应当被维持:分配用于存储对象的当前版本的副本的存储器;并且在所分配的存储器中创建对象的当前版本的副本,其中,新版本被覆写在对象的当前版本上并且对象的当前版本的副本的位置的指示指示所分配的存储器。

NP33.根据NP32中的任一项的方法,其中,集群中的每个节点被布置为执行远程直接存储器访问读取以读取和写入被存储在集群中的其他节点上的对象。

NP34.根据NP21-33中的任一项的方法,其中,存储器系统是多版本存储器系统,并且方法还包括:维持指示当前由节点处理的最旧事务的读取时间的第一本地时间戳;将第一本地时间戳提供到节点的集群中的主节点;从主节点接收与由主节点从集群中的节点接收到的最早第一本地时间戳相对应的第一全局时间戳;存储第一全局时间戳,被存储的第一全局时间戳是最近接收到的第一全局时间戳;拒绝包括指示比被存储的第一全局时间戳更旧的时间的读取时间戳的任何事务;将被存储的第一全局时间戳提供到主节点;从主节点接收与由主节点从集群中的节点接收到的最早被存储的第一全局时间戳相对应的第二全局时间戳;存储第二全局时间戳,被存储的第二全局时间戳是最近接收到的第二全局时间戳;并且当与先前版本相关联的相应的写入时间戳小于被存储的第二全局时间戳时,对被存储在节点上的对象的多个先前版本中的每个先前版本执行垃圾收集。

NP35.一种用于用作形成分布式事务性存储器系统的节点的集群中的节点的系统,系统包括:本地时钟;时钟同步模块,其被配置为使本地时钟与节点的集群的主时钟同步并且维持指示主时钟的当前最小值和当前最大值的不确定性度量;以及事务处理模块,其被布置为通过以下操作来执行包括读取分布式事务性存储器系统中的相应的对象的一个或多个读取操作的事务:生成来自本地时钟的表示早于主时钟的当前最小值的时间点的读取时间戳,读取时间戳表示事务的读取操作被认为发生的时间点;执行一个或多个读取操作以读取相应的对象;针对相应的对象中的每个相应的对象,确定表示该对象被写入的时间点的、与该对象相关联的时间戳是否指示在由读取时间戳表示的时间之后的时间;并且响应于确定与相应的对象中的一个相应的对象相关联的时间戳指示在由读取时间戳表示的时间之后的时间,执行针对该对象的错误处理过程。

NP36.根据NP35的系统,其中,在生成读取时间戳之前,事务处理模块还被布置为:基于不确定性度量来确定在当前时间点处主时钟的最大值;并且等待直到由不确定性度量指示的主时钟的当前最小值在主时钟的先前确定的最大值之后,其中,由所生成的读取时间戳表示的时间点在主时钟的所确定的最大值之后或者等于在主时钟的所确定的最大值。

NP37.根据NP35或NP36的方法,其中,存储器系统是多版本存储器系统,并且事务处理模块还被布置为通过以下操作来执行错误处理过程:响应于确定对象与指示由分布式事务性存储器系统存储的对象的先前版本的位置的指针相关联:从由指针指示的位置读取对象的先前版本;响应于确定与对象的先前版本相关联的时间戳指示在由读取时间戳表示的时间之前或等于由读取时间戳表示的时间的时间,使用对象的先前版本来完成事务;以及响应于确定与对象的先前版本相关联的时间戳指示在由读取时间戳表示的时间之后的时间,关于对象的先前版本重新执行错误处理过程。

NP38.根据NP35-37中的任一项的系统,其中,事务处理模块还被布置为通过以下操作来处理读取操作,读取操作读取被存储在多版本存储器系统中的对象的特定版本,特定版本表示当其存在于特定时间点时的对象:基于与所取回的对象的版本相关联的时间戳指示在特定时间点之后的时间点来确定需要对象的先前版本;确定针对所取回的对象的版本的版本历史是否已经被截断;响应于确定针对所取回的对象的版本的版本历史已经被截断,提供错误;以及响应于确定针对所取回的对象的版本的版本历史还没有被截断,取回对象的先前版本并关于对象的先前版本重复先前步骤,直到具有指示在特定时间点之前或等于特定时间点的时间点的相关联的时间戳的对象的版本被取回或者错误被提供。

NP39.根据NP35-38中的任一项的系统,其中,事务处理模块还被布置为通过以下操作来执行包括写入分布式事务性存储器系统中的相应的对象的一个或多个写入操作的事务:读取要被写入的相应的对象;锁定要由一个或多个写入操作写入的相应的对象;针对相应的对象中的获得针对其的锁定的每个对象,确定与该对象相关联的表示的时间点的时间戳自它被读取之后还没有改变;基于不确定性度量生成表示事务的写入操作被认为发生的时间点的写入时间戳,由写入时间戳表示的时间点在要被写入的所有相应的对象已经被锁定的时间点处的主时钟的最大值之后;等待直到由不确定性度量指示的主时钟的当前最小值在由写入时间戳表示的时间之后;在等待直到主时钟的当前最小值在由写入时间戳表示的时间之后,确定与由一个或多个读取操作读取的相应的对象中的每个相应的对象相关联的相应的时间戳仍然在由读取时间戳表示的时间之后;对要被写入的相应的对象执行一个或多个写入操作并且通过解锁相应的对象来提交事务,其中,执行一个或多个写入操作包括将要被写入的相应的对象与写入时间戳相关联。

NP40.根据NP35-39中的任一项的系统,其中,存储器系统是多版本存储器系统,并且系统还包括垃圾收集模块,垃圾收集模块被布置为通过以下操作来释放由被存储在存储器系统中的对象的先前版本使用的存储器:维持指示当前正在由节点处理的最旧事务的读取时间的第一本地时间戳;将第一本地时间戳提供到节点的集群中的主节点;从主节点接收与由主节点从集群中的节点接收到的最早第一本地时间戳相对应的第一全局时间戳;存储第一全局时间戳,被存储的第一全局时间戳是最近接收到的第一全局时间戳;拒绝包括指示比被存储的第一全局时间戳更旧的时间的读取时间戳的任何事务;将所被存储的第一全局时间戳提供到主节点;从主节点接收与由主节点从集群中的节点接收到的最早被存储的第一全局时间戳相对应的第二全局时间戳;存储第二全局时间戳,被存储的第二全局时间戳是最近接收到的第二全局时间戳;并且当与先前版本相关联的相应的写入时间戳小于被存储的第二全局时间戳时,对被存储在节点上的对象的多个先前版本中的每个先前版本执行垃圾收集。

NP41.一种用于在分布式多版本事务性存储器系统中执行垃圾收集的方法,分布式多版本事务性存储器系统由节点的集群提供,方法包括在集群中的节点处:维持指示当前正在由节点处理的最旧事务的读取时间的第一本地时间戳;将第一本地时间戳提供到节点的集群中的主节点;从主节点接收与由主节点从集群中的节点接收到的最早第一本地时间戳相对应的第一全局时间戳;存储第一全局时间戳,被存储的第一全局时间戳是最近接收到的第一全局时间戳;拒绝包括指示比被存储的第一全局时间戳更旧的时间的读取时间戳的任何事务;将被存储的第一全局时间戳提供到主节点;从主节点接收与由主节点从集群中的节点接收到的最早被存储的第一全局时间戳相对应的第二全局时间戳;存储第二全局时间戳,被存储的第二全局时间戳是最近接收到的第二全局时间戳;并且当与先前版本相关联的相应的写入时间戳小于被存储的第二全局时间戳时,对被存储在节点上的对象的多个先前版本中的每个先前版本执行垃圾收集。

NP42.一种用于在多版本存储器系统中写入对象的新版本的方法,方法包括:基于是否存在可用于存储对象的新版本和对象的当前版本两者的足够的存储器来确定针对对象的版本历史是否应当被截断;将关于针对对象的版本历史是否已经被截断的指示与对象的新版本相关联;并且当针对对象的版本历史不应当被截断时,将对象的当前版本的副本的位置的指示与对象的新版本相关联;将对象的新版本写入多版本事务性存储器系统。

NP43.根据NP42的方法,其中,关于针对对象的版本历史是否已经被截断的指示包括指针,当版本历史要被维持时,指针提供对象的当前版本的副本的位置的指示,或者当版本历史要被截断时,指针提供空值。

NP44.根据NP42或NP43的方法,还包括响应于确定针对对象的版本历史应当被维持:分配用于存储对象的当前版本的副本的存储器;并且在所分配的存储器中创建对象的当前版本的副本,其中,新版本被覆写在对象的当前版本上并且对象的当前版本的副本的位置的指示指示所分配的存储器。

NP45.一种用于读取被存储在多版本存储器系统中的对象的特定版本的方法,特定版本表示当其存在于特定时间点处时的对象,方法包括:基于与所取回的对象的版本相关联的时间戳指示在特定时间点之后的时间点来确定需要对象的先前版本;确定针对所取回的对象的版本的版本历史是否已经被截断;响应于确定针对所取回的对象的版本的版本历史已经被截断,提供错误;响应于确定针对所取回的对象的版本的版本历史还没有被截断,取回对象的先前版本并关于对象的先前版本重复先前步骤,直到具有指示在特定时间点之前或等于特定时间点的时间点的相关联的时间戳的对象的版本被取回或者错误被提供。

NP46.根据NP45的方法,其中:对象的每个版本与指示对象的先前版本的位置的相应的指针相关联;并且确定针对所取回的对象的版本的版本历史是否已经被截断包括确定针对所取回的对象的版本的相应的指针的值是否为空。

NP47.一种用于使节点的集群中的从节点与在节点的集群中的主节点处的远程时钟同步的方法,从节点包括两个或更多个线程,每个线程与相应的本地时钟相关联,方法包括:在每个线程中通过以下操作来使每个相应的本地时钟与远程时钟同步:存储针对线程的本地时钟的第一值;从主节点接收指示远程时钟的当前值的远程时间戳;在远程时间戳被接收时存储针对线程的本地时钟的第二值;并且基于远程时间戳来将针对线程的本地时钟设置为远程时钟的当前值;针对线程中的每个线程,基于由该线程接收到的远程时间戳、自从根据相应的本地时钟针对该线程被存储的第一值过去的时间量、以及时钟漂移的预定最大速率来确定远程时钟的相应的最大值;针对线程中的每个线程,基于由该线程接收到的远程时间戳、自从根据相应的本地时钟针对该线程被存储的第二值过去的时间量、以及时钟漂移的预定最小速率来确定远程时钟的相应的最小值;从针对线程中的每个线程而被确定的相应的最大值之中,确定远程时钟的最低的最大值;从针对线程中的每个线程而被确定的相应的最小值之中,确定远程时钟的最大的最小值;并且将远程时钟的最低的最大值和最大的最小值的指示提供为针对由相应的本地时钟中的每个相应的本地时钟提供的本地时间戳的不确定性度量。

NP48.根据NP47的方法,其中,线程中的一个或多个线程经由与由其他线程使用的通信协议不同的通信协议从主节点接收远程时间戳。

NP49.根据NP47或NP48的方法,其中,线程中的一个或多个线程经由与由其他线程使用的通信介质不同的通信介质从主节点接收远程时间戳。

NP50.根据NP47-49中的任一项的方法,其中,使每个相应的本地时钟与远程时钟同步还包括:从主节点请求远程时钟的时间戳,其中,被存储的本地时钟的第一值是在请求被发送给主节点时本地时钟的值。

NP51.根据NP47-50中的任一项的方法,其中,方法还包括:针对每个线程,基于与两个单独的同步相关联的被存储的第一值和第二值来确定由本地时钟经历的漂移的实际速率是否超过漂移的预定最大速率或预定最小速率;以及响应于确定所接收的远程时间戳低于针对线程的远程时钟的所确定的最大的最小值或高于所确定的最低的最大值,禁用从节点。

术语“计算机”或“基于计算机的设备”在本文用于指代具有处理能力使得其执行指令的任何设备。本领域技术人员将意识到,这样的处理能力被并入许多不同设备中并且因此术语“计算机”和“基于计算的设备”均包括个人计算机(PC)、服务器、移动电话(包括智能电话)、平板计算机、机顶盒、媒体播放器、游戏控制台、个人数字助理、可穿戴计算机以及许多其他设备。

在一些示例中,本文描述的方法通过有形存储介质上的以机器可读形式的软件被执行,例如以计算机程序的形式,计算机程序包括当程序在计算机上运行时被适配以执行本文描述的方法中的一个或多个的所有操作的计算机程序代码模块,并且其中计算机程序可以被体现在计算机可读介质上。软件适合于在并行处理器或串行处理器上执行,以使得方法操作可以以任何合适的顺序或同时被执行。

这确认软件是有价值的可单独交易的商品。旨在涵盖在“哑(dumb)”或标准硬件上运行或控制“哑”或标准硬件以执行期望功能的软件。还旨在涵盖描述或限定硬件的配置的软件,例如被用于设计硅芯片或用于将通用可编程芯片配置为执行期望的功能的HDL(硬件描述语言)软件。

本领域技术人员将意识到用于存储程序指令的存储设备可选地跨网络分布。例如,远程计算机能够将所描述的过程的示例存储为软件。本地或终端计算机能够访问远程计算机并下载软件的部分或全部以运行程序。备选地,本地计算机可以根据需要下载软件的片段,或者在本地终端处执行一些软件指令并且在远程计算机(或计算机网络)处执行一些软件指令。本领域技术人员还将意识到通过利用本领域技术人员已知的常规技术,软件指令的全部或部分可以由专用电路(诸如数字信号处理器(DSP)、可编程逻辑阵列等)执行。

本文给出的任何范围或设备值可以在不丧失寻求的效果的情况下被扩展或更改,如技术人员将显而易见的。

尽管已经以特定于结构特征和/或方法动作的语言描述了本主题,但是应理解在权利要求中限定的主题不必限于以上描述的特定特征或动作。相反,以上描述的特定特征和动作被公开为实现权利要求的示例形式。

将理解,以上描述的益处和优点可以涉及一个实施例或者可以涉及若干实施例。实施例不限于解决所陈述的问题中的任何或全部的那些或具有所陈述的益处和优点中的任何或全部的那些。还将理解,对“一个”项的引用指代那些项中的一个或多个。

本文描述的方法的操作可以以任何合适的顺序被执行或在合适的情况下同时被执行。额外地,个体的框可以在不脱离本文描述的主题的范围的情况下从方法中的任何方法被删除。以上描述的示例中的任何的方面可以与所描述的其他示例中的任何的方面相组合以形成另外的示例而不丧失所寻求的效果。

术语“包括”在本文用于意指包括标识的方法框或元件,但是这样的框或元件不包括排他性列表并且方法或装置可以包含附加框或元件。

将理解,以上描述仅仅通过举例的方式给出,并且可以由本领域技术人员进行各种修改。以上说明、示例和数据提供对示例性实施例的结构和使用的完整描述。尽管以上已经以某种程度的特殊性或参考一个或多个个体实施例描述了各种实施例,但是本领域技术人员能够在不脱离本说明书的范围的情况下对所公开的实施例进行许多更改。

39页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:基于设备配置的热管理控制

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!