用于非均匀存储器访问的可缩放自旋锁的制作方法

文档序号:17185323发布日期:2019-03-22 21:18阅读:154来源:国知局
用于非均匀存储器访问的可缩放自旋锁的制作方法

多插槽非均匀存储器访问(numa)系统包括具有本地附连存储器的多个处理器插槽。在这些numa多插槽系统中,系统存储器分布在多个处理器插槽之中,并且每个处理器插槽管理整个系统存储器池的个体子集(例如,局部附连存储器)。系统存储器的分布式特性的结果是存储器可能具有访问存储器的不同等待时间或“时间成本”。即,与访问非处理器本地的存储器(例如,附连至不同处理器的存储器)相比,处理器内的处理核可对处理器本地的存储器(附连至该处理器的存储器)具有较低等待时间访问。

许多企业应用(诸如,关系数据库管理系统(rdbms))被安装在具有2至4个处理器插槽的系统上。对增加处理的要求已产生对扩展高计数多插槽系统(例如,具有8、16、32和更多处理器插槽的系统)的应用的需求。

附图说明

所附附图不旨在按比例绘制。在附图中,在各图中例示的每个相同或几乎相同的组件由相的数字表示,如在上下文中阅读时将理解的那样。

图1例示出根据本文所描述的至少一些实施例来布置的多插槽系统中的可缩放自旋锁的示例部署。

图2例示出根据本文所描述的至少一些实施例来布置的图1中多插槽系统的所选组件。

图3例示出根据本文所描述的至少一些实施例来布置的全局自旋锁结构的所选字段。

图4是例示出根据本文所描述的至少一些实施例来布置的用于部署可缩放自旋锁以保护可共享资源的示例过程的流程图。

图5a和5b是例示出根据本文所描述的至少一些实施例来布置的用于获取保护可共享资源的全局自旋锁的示例过程的流程图。

图6例示出根据本文所描述的至少一些实施例的可被用于执行如本公开以不同方式描述的技术中任一项的示例计算系统的所选组件。

在以下详细描述中,对所附附图进行参考,所附附图形成本文的一部分。在附图中,除非上下文另有指示,否则类似的符号通常标识类似的组件。在具体实施方式、附图和权利要求中描述的示例性实施例并不意味着限制。在不脱离本文所呈现主题的精神或范围的情况下,可使用其他实施例,并且可进行其他改变。如本文中一般描述的以及在附图中例示的本公开的方面能以各种不同配置来布置、替换、组合、分开和设计,本文中明确预期了上述各种配置。

具体实施方式

锁(锁存器)可被用于控制对可共享资源的访问。锁是用于对可共享资源执行访问限制的同步机制,并且被设计成执行互斥并发控制策略。例如,锁可被采用来保护可共享资源的完整性。需要访问受保护资源的进程(或线程)在访问受保护资源之前获取锁。一旦进程已获取锁,受保护资源就变为“锁定”(锁被锁定),并且向该进程提供对受保护资源的独占访问。需要访问锁定的受保护资源的任何其他进程必须等待。当不再需要对锁定受保护资源的独占访问时,“持有”锁的进程(即,获取锁的进程)释放锁,这“解锁”受保护资源(解锁该锁)。其他进程随后可获取锁,以便获得对受保护资源的独占访问。自旋锁是导致试图获取自旋锁的进程简单地在循环(例如,自旋)中等待同时重复检查以察看自旋锁是否可用的锁。由于进程保持活跃(例如,消费进程在其上运行的处理核的大百分比)但是在自旋的同时并不执行有用任务,因此自旋锁适用于其中预期等待(自旋)时间非常短(例如,纳秒级)的实例。

如前所述,在高计数多插槽系统中,插槽上的处理核能访问核本地的存储器,或者也能以较高等待时间访问远程(不同)核的存储器。对于在这些较高多插槽系统上缩放的应用,必须跨多个插槽来成功同步对可共享资源的访问。在具有大插槽计数的系统上,在等待时间上可能存在相当的差异。不同等待时间的结果是,与运行在非自旋锁本地的插槽上的处理核相比,运行在自旋锁本地的插槽上的处理核享有对自旋锁的本地优待。这会导致运行在非自旋锁本地的插槽上的处理核在增加自旋锁争用的时段期间处于自旋锁“匮乏”(并且可共享资源正受自旋锁保护)。因此,存在当不同插槽上的处理核试图获取同一自旋锁时的自旋锁迁移的挑战,这导致跨系统的高速缓存线的转移,以及试图获取同一自旋锁的处理核上高速缓存线的无效。这会导致高计数多插槽系统上自旋锁争用的增加,并最终导致可缩放性的缺乏,其中此争用和/或匮乏是关于对可缩放性十分重要的可共享资源的。对自旋锁的缩放是在高计数多插槽系统上缩放应用(包括企业应用)的关键方面。

为此,公开了为非均匀存储器访问(numa)提供可缩放自旋锁的技术。可缩放性通过用多个局部自旋锁包围全局自旋锁来实现,这些局部自旋锁中的每一个被配置成控制对全局自旋锁的访问。以此方式,全局自旋锁受多个局部自旋锁保护。例如,在numa架构中,全局自旋锁被分配在numa插槽中的一个上,并且受多个局部自旋锁保护。在一些实施例中,在每个numa插槽上分配一个局部自旋锁。在其他实施例中,多个局部自旋锁可均等地分布在numa插槽上。与自旋锁的当前实现类似,进程可在未首先获取局部自旋锁的情况下继续直接获取全局自旋锁。当自旋锁不忙碌时(对自旋锁的争用较低),这确保了与当前实现相同水平的性能。一旦进程直接获取全局自旋锁,进程就置位一标记,该标记用于指示全局自旋锁被直接获取,而未通过保护全局自旋锁的局部自旋锁中的一个。例如,可置位指示“全局获取”的标记来指示全局自旋锁被直接获取。试图获取全局自旋锁的其他进程可读取指示全局自旋锁被全局获取的标记。在此状态下(其中全局自旋锁被直接获取),其他进程也可试图直接获取全局自旋锁。然而,一旦进程已自旋预定次数来试图获取全局自旋锁而没有成功,该进程就随后试图获取保护全局自旋锁的局部自旋锁中的一个。此局部自旋锁(即,进程试图获取的局部自旋锁)是随机选取的,并且不一定是进程在其上执行的同一插槽上的局部自旋锁。对局部自旋锁的随机选择确保不会向运行在与全局自旋锁相同的插槽(例如,全局自旋锁被分配在其上的插槽)上的进程给予优待。如果进程未能获取局部自旋锁,则进程试图获取保护全局自旋锁的另一局部自旋锁。此局部自旋锁也可被随机地选取。一旦进程获取并持有保护全局自旋锁的局部自旋锁,进程就可随后试图获取全局自旋锁。如果进程成功获取全局自旋锁,则进程设置一标记,该标记用于指示全部自旋锁被获取且由局部自旋锁持有者持有。例如,指示“局部获取”的标记可被设置成指示全局自旋锁被局部自旋锁持有者获取(通过保护全局自旋锁的局部自旋锁来获取)。检查全局自旋锁并读取指示全局自旋锁由局部自旋锁持有者持有(全局自旋锁被局部获取)的任何进程随后试图首先获取局部自旋锁而不试图直接获取全局自旋锁。在一些实施例中,全局自旋锁可被配置成尽可由局部自旋锁持有者获取。例如,如果已知系统运行在高全局自旋锁争用的条件下,则系统管理员可将系统配置成要求进程在试图获取全局自旋锁之前获取局部自旋锁。

许多技术优点中的一个是,一旦工作负荷缩放并导致系统中的全局自旋锁争用,系统就地在如何获取全局自旋锁上自动适应其办法。例如,在没有全局自旋锁争用的情形中,系统以类似于当前解决方案的方式操作。然而,一旦检测到对全局自旋锁的争用,系统就通过要求对局部自旋锁的获取以减少对全局自旋锁的争用来自动适应。在其中在每个numa插槽上分配一个局部自旋锁的情形中,这确保不多于与numa插槽相等数量的进程将在同一时间试图获取全局自旋锁。此外,由于局部自旋锁是随机选取的,因此没有进程会因运行在与全局自旋锁相同的插槽上而被提供优待访问。如果已知系统运行在高锁存器争用的情形中(诸如,8个或更多个插槽),则系统可通过系统参数容易地被适配成其中局部自旋锁总是在全局自旋锁之前被获取的系统。

现转向附图,图1例示出根据本文所描述的至少一些实施例来布置的多插槽系统100中的可缩放自旋锁的示例部署。多插槽系统100是其中存储器访问时间取决于存储器相对于处理器的位置或距离的numa系统。如所描绘的,多插槽系统100包括八个插槽102a-102h。插槽102a-102h在本文中可被统称为插槽102,或在本文中被单独称为插槽102。插槽102可彼此通信地耦合。例如,每个插槽102可经由点对点快速路径互连(qpi)链路来连接至其他插槽102中的每一个。qpi是一种合适的互连架构,并且可预想其他互连架构,诸如其他点对点架构、环架构以及总线架构,这里仅举几例。多插槽系统100中所描绘插槽的数量仅用于例示,并且本领域技术人员将理解,可存在不同数量的插槽。例如,多插槽系统100可包括较小数量的插槽(诸如,六个、四个或更少)或较大数量的插槽(诸如,十六个、三十二个或更多)。

多插槽系统100还可包括全局自旋锁104和八个局部自旋锁106a-106h。局部自旋锁106a-106h在本文中可被统称为局部自旋锁106,或者在本文中被单独称为局部自旋锁106。全局自旋锁104被分配在插槽102中的一个上(具体地,插槽102a上)以控制对可共享资源的访问。每个局部自旋锁106被分配在相应插槽102上,以控制对全局自旋锁106的访问。在操作中,全局自旋锁104受局部自旋锁106保护,如将在下文中更详细解释的那样。根据各实施例,全局自旋锁104和局部自旋锁106能以硬件、软件或硬件和软件两者的组合来实现。在一些实施例中,全局自旋锁104和局部自旋锁106各自是的测试与测试并置位(test-and-set)自旋锁。测试与测试并置位自旋锁利用入口协议(entryprotocol)(例如,测试)来等待锁变为自由。一旦入口协议指示锁是自由的,就利用测试并置位操作来试图获取锁。测试与测试并置位自旋锁的目标不是在测试并置位中自旋,而是通过利用入口协议来增加成功的测试并置位的可能性。在其他实施例中,全局自旋锁104和局部自旋锁106各自是测试并置位自旋锁。测试并置位自旋锁利用单个共享存储器位置来同步。测试并置位指令是用于在单个原子操作中将“1”写(置位)入存储器位置,并返回来自存储器位置的值的指令。如果从存储器位置返回的值是“0”,则获取锁,否则,进入循环(例如,自旋)同时等待获取锁。

图2例示出根据本文所描述的至少一些实施例来布置的图1中多插槽系统100的所选组件。如所描绘的,插槽102各自被通信地耦合至互连202。如以上所描述的,互连202可以是点对点qpi链路。插槽102a-102h分别包括处理器204a-204h。处理器204a-102h在本文中可被统称为处理器204,或在本文中被单独称为处理器204。处理器204a-204h被通信地耦合至相应的存储器控制器206a-206h,该存储器控制器206a-206h被通信地耦合至相应的本地存储器208a-208h。存储器控制器206a-206h在本文中可被统称为存储器控制器206,或者在本文中被单独称为存储器控制器206。同样,存储器208a-208h在本文中可被统称为存储器208,或者在本文中被单独称为存储器208。在各实施例中,可采用附加组件(未例示)或所例示组件的子集而不背离所公开实施例的范围。

处理器204可包括适用于在多插槽系统中使用的任何处理单元,诸如奔腾d处理器、至强处理器或任何其他合适的单核或多核处理器。处理器204可包括任何数量的处理器和/或处理器核,这些处理器和/或处理器核被配置成单独地或共同地执行或指导本公开中描述的任何数量的操作的执行。存储器控制器206可被配置成控制和管理来往于通信耦合的存储器208的数据流。存储器控制器206可被集成至相应处理器204中并成为相应处理器204的一部分。例如,存储器控制器206a可被集成至处理器204a中并成为处理器204a的一部分,存储器控制器206b可被集成至处理器204b中并成为处理器204b的一部分,等等。存储器208是插槽本地存储器,因为存储器208被本地附连至相应插槽102。例如,存储器208a被本地附连至插槽102a,存储器208a被本地附连至插槽102b,等等。存储器208可包括易失性存储器、非易失性存储器、或者易失性和非易失性存储器的组合。存储器208可以是整体系统存储器的一部分。

存储器206a可包括自旋锁利用模块210。自旋锁利用模块210可以是利用自旋锁来控制对可共享资源的访问的软件应用,诸如数据库服务器应用。在如本文所描述的可缩放自旋锁的示例操作中,作为处理器204a上的进程来运行的自旋锁利用模块210确定存在八个插槽102a-102h,并将被配置成控制访问的全局自旋锁104分配至插槽上存储器208a的特定区域。这通过全局自旋锁104被包括在存储器208a中来示出。与全局自旋锁104的分配同时,自旋锁利用模块210在每个插槽102上分配一个局部自旋锁106。这通过局部自旋锁106a-106h分别被包括在存储器208a-208h中来示出。每个局部自旋锁106被配置成控制对全局自旋锁104的访问。本领域技术人员将理解,除全局自旋锁104和相关联局部自旋锁106之外,自旋锁利用模块210可分配一个或多个其他全局自旋锁(包括与每个全局自旋锁相关联的局部自旋锁)以保护其他可共享资源。类似地,一个或多个其他进程可同样各自分配一个或多个全局自旋锁(包括与每个全局自旋锁相关联的局部自旋锁)以保护多插槽系统100上的可共享资源。因此,全局自旋锁104和相关联局部自旋锁106被提供作为用于保护多插槽系统100上的一个可共享资源的一个可缩放自旋锁的示例,并且除全局自旋锁104和相关联局部自旋锁106之外,多插槽系统100可包括大量全局自旋锁和相关联局部自旋锁。

在诸如多插槽系统100之类的numa系统中,运行在插槽(例如,插槽102a)中核上的进程可访问多插槽系统100中的所有存储器。然而,此进程可更快地访问附连至进程在其上运行的插槽的本地存储器(例如,由插槽102a上存储器控制器206a管理的存储器208a)。如果此进程访问远程存储器(例如,附连至不同插槽的存储器),则进程需要经由另一插槽上的存储器控制器来访问远程存储器,这增加了额外的计算工作并使得访问较慢。

图3例示出根据本文所描述的至少一些实施例来布置的示例全局自旋锁结构300的所选字段。全局自旋锁结构300通过用指示全局自旋锁被全局获取还是被局部获取的指示符来扩充。如所描绘的,全局自旋锁结构300可包括自旋锁id302、全局获取标记304、以及局部获取标记306。自旋锁id302是唯一标识全局自旋锁实例的标识符。全局获取标记304是在置位时指示全局自旋锁被直接获取而不通过局部自旋锁的标记。被全局获取的全局自旋锁被进程直接获取,其中该进程不必首先获取局部自旋锁。局部获取标记306是在置位时指示全局自旋锁被局部自旋锁持有者获取的标记。被局部获取的全局自旋锁由进程通过首先获取保护全局自旋锁的局部自旋锁来间接获取。全局自旋锁结构300可包括其他信息,诸如关于全局自旋锁是被“锁定”还是被“解锁”的信息、关于全局自旋锁是否正由任何进程持有的信息、以及关于全局自旋锁是否正由当前进程持有的信息,这里仅举几例。

图4是例示出根据本文所描述的至少一些实施例来布置的用于为可共享资源部署可缩放自旋锁的示例过程的流程图400。在一些实施例中,由流程图400的示例过程例示的操作、功能或动作可由多插槽系统100执行,并且更具体地,由图2的自旋锁利用模块210执行。示例过程的相应框中描述的操作、功能或动作还可作为计算机可执行指令被存储在计算机可读介质(诸如,插槽102的存储器208)中。然而,将理解,流程图400的示例过程可由除自旋锁利用模块210之外的进程执行。

如流程图400所描绘的,用于部署可缩放自旋锁以保护可共享资源的示例过程可始于框402,其中自旋锁利用模块210(自旋锁利用模块210的正执行进程)确定自旋锁利用模块210在其中运行的多插槽系统中插槽的数量。例如,可使用由多插槽系统提供的底层服务来确定插槽的数量。

框402可由框404跟随,其中自旋锁利用模块210分配被配置成控制对可共享资源的访问的全局自旋锁。可共享资源的示例包括而不限于存储器位置、接口、设备等。在一些实施例中,自旋锁利用模块210可将全局自旋锁分配在自旋锁利用模块210在其上运行的插槽上。在其他实施例中,自旋锁利用模块210可将全局自旋锁分配在与自旋锁利用模块210在其上运行的插槽不同的插槽上。在更一般的意义上,全局自旋锁可被分配在插槽中的任一个上。

框404可由框406跟随,其中自旋锁利用模块210分配与所分配全局自旋锁相关联的多个局部自旋锁。多个局部自旋锁中的每一个被配置成控制对相关联全局自旋锁的访问。在一些实施例中,自旋锁利用模块210分配与插槽数量相等数量的自旋锁,并且在多插槽系统的每个槽上分配一个局部自旋锁。例如,在多插槽系统100的情形中,自旋锁利用模块210分配八个局部自旋锁,每个插槽102上一个局部自旋锁。在一些实施例中,自旋锁利用模块210可分配与插槽的数量不同的数量的自旋锁,并将多个自旋锁分布在插槽之间。例如,自旋锁利用模块210可将局部自旋锁均等地分布在插槽之间。自旋锁利用模块210可适当地迭代框402和404来分配可缩放自旋锁(全局自旋锁以及相关联的多个局部自旋锁)以控制对其他可共享资源的访问。

本领域技术人员将理解,对于本文公开的这个和其他过程和方法,在过程和方法中执行的功能能以不同顺序来实现。附加地或替代地,两个或更多个操作可在同一时间被执行。此外,概述的动作和操作仅作为示例被提供,并且动作和操作中的一些可以是任选的、可被组合成更少的动作和操作、或者被扩展成附加的动作和操作而不偏离所公开的实施例的本质。

图5a和5b是例示出根据本文所描述的至少一些实施例来布置的用于获取针对可共享资源的全局自旋锁的示例过程的流程图500。在一些实施例中,由流程图500的示例过程例示的操作、功能或动作可由多插槽系统100执行,并且更具体地,由图2的自旋锁利用模块210执行。示例过程的相应框中描述的操作、功能或动作还可作为计算机可执行指令被存储在计算机可读介质(诸如,插槽102的存储器208)中。然而,将理解,流程图500的示例过程可由除自旋锁利用模块210之外的进程执行。

如由流程图500所描绘的,用于获取保护可共享资源的全局自旋锁的示例过程可始于框502,其中自旋锁利用模块210(自旋锁利用模块210的正执行进程)试图获取(全局获取)全局自旋锁。例如,全局自旋锁可正控制对可共享资源的访问,并且自旋锁利用模块210可试图获取全局自旋锁以便访问可共享资源。

框502之后可跟随判决框504,其中自旋锁利用模块210进行检查以确定自旋锁利用模块210是否获取(全局获取)全局自旋锁。如果自旋锁利用模块210确定其已获取全局自旋锁,则判决框504之后可跟随框506,其中自旋锁利用模块210置位全局获取标记来指示全局自旋锁被直接获取而不必首先获取相关联局部自旋锁中的一个。在此实例中,全局自旋锁被锁定,并且自旋锁利用模块210获取对可共享资源的独占使用。当自旋锁利用模块210不再需要对可共享资源的独占使用时,自旋锁利用模块210可释放全局自旋锁。

否则,如果在判决框504处,自旋锁利用模块210确定其未获取全局自旋锁(自旋锁利用模块210未成功获取全局自旋锁),则判决框504之后可跟随由框508,其中自旋锁利用模块210针对全局自旋锁进行自旋。即,自旋锁利用模块210自旋,同时重复地试图获取全局自旋锁。

因此,框508之后可跟随判决框510,其中自旋锁利用模块210检查全局自旋锁的全局获取标记和局部获取标记。如果,在判决框510中,自旋锁利用模块210确定全局获取标记被置位(全局自旋锁正被直接获取全局自旋锁的进程持有),则判决框510之后可跟随判决框512,其中自旋锁利用模块210进行检查以确定自旋锁利用模块210是否已自旋特定次数x来试图获取全局自旋锁。特定数量x指定进程可试图直接获取全局自旋锁而进行的自旋的数量的限制。特定数量x充当一限制,该限制使得进程不会无限期地自旋来试图直接获取全局自旋锁。特定数量x可由用户(诸如,自旋锁利用模块210的程序员)设置。

如果,在判决框512处,自旋锁利用模块210确定其未自旋超过所分派特定数量x,则判决框512之后可跟随框508,其操作在上文描述过。在此实例中,自旋锁利用模块210可继续针对全局自旋锁进行自旋(继续自旋来试图获取全局自旋锁)。否则,如果自旋锁利用模块210确定其已自旋超过所分派特定数量x,则判决框512之后可跟随框514,其中自旋锁利用模块210试图获取与全局自旋锁相关联的局部自旋锁。在此实例中,自旋锁利用模块210可不再继续针对全局自旋锁进行自旋(不可继续自旋来试图获取全局自旋锁),但需要首先获取与全局自旋锁相关联的局部自旋锁中的一个。与全局自旋锁相关联的局部自旋锁被配置成保护对全局自旋锁的访问。在一些实施例中,局部自旋锁是从与全局自旋锁相关联的多个局部自旋锁中间随机选择的。例如,自旋锁利用模块210在其上执行的处理器可提供一处理器指令(cpu指令),该处理器指令可被用来随机选择局部自旋锁中的一个。

再次参看判决框510,如果自旋锁利用模块210确定局部获取标记被置位(全局自旋锁正被首先获取与全局自旋锁相关联的局部自旋锁中一个的进程持有),则判决框510之后可跟随框514,其中自旋锁利用模块210试图获取与全局自旋锁相关联的局部自旋锁。在此实例中,自旋锁利用模块210已知其在试图获取全局自旋锁之前需要首先获取与全局自旋锁相关联的局部自旋锁中的一个。正被置位的局部获取标记向自旋锁利用模块210指示对全局自旋锁的争用较高,且全局自旋锁仅可被局部自旋锁持有者获取。

再次参看判决框510,如果自旋锁利用模块210确定全局获取标记和局部获取标记未被置位(全局自旋锁可用),则判决框510之后可跟随判决框516,其中自旋锁利用模块210进行检查以确定自旋锁利用模块210是否获取全局自旋锁。在此实例中,自旋锁利用进行自旋来试图获取全局自旋锁时。而且,除自旋锁利用模块210之外的其他进程可能一直在试图获取全局自旋锁。如果自旋锁利用模块210确定其已获取全局自旋锁,在判决框516之后可跟随框506,其中自旋锁利用模块210置位全局获取标记来指示全局自旋锁被直接获取而不必首先获取相关联局部自旋锁中的一个。否则,如果自旋锁利用模块210确定其未获取全局自旋锁(自旋锁利用模块210未成功获取全局自旋锁),则判决框516之后可跟随判决框512,其中自旋锁利用模块210进行检查以确定自旋锁利用模块210是否已自旋超过所分派特定数量x来试图获取全局自旋锁。

再次参看框514,框514之后可跟随判决框516,其中自旋锁利用模块210进行检查以确定自旋锁利用模块210是否已获取局部自旋锁。如果自旋锁利用模块210确定其已获取局部自旋锁,则判决框516之后可跟随判决框518,其中自旋锁利用模块210检查全局自旋锁(正受局部自旋锁保护的全局自旋锁)的全局获取标记和局部获取标记。如果,在判决框518处,自旋锁利用模块210确定全局获取标记被置位(全局自旋锁被直接获取全局自旋锁的进程持有)或局部获取标记被置位(全局自旋锁被首先获取与全局自旋锁相关联的局部自旋锁中一个的进程持有),则判决框518之后可跟随判决框520,其中自旋锁利用模块210进行检查以确定自旋锁利用模块210是否已自旋特定次数y来试图获取全局自旋锁。特定数量y指定持有局部自旋锁的进程可试图获取全局自旋锁而进行的自旋的数量的限制。特定数量y充当一限制,该限制使得持有局部自旋锁的进程不会作为局部自旋锁持有者无限期地自旋来试图来获取全局自旋锁。特定数量y可由用户(诸如,自旋锁利用模块210的程序员)设置。

如果,在判决框520处,自旋锁利用模块210确定其未自旋超过所分派特定数量y,则判决框520之后可跟随判决框518,其操作在上文进行了描述。在此实例中,自旋锁利用模块210可继续自旋来检查全局自旋锁的全局获取标记和局部获取标记。否则,如果自旋锁利用模块210确定其已自旋超过所分派特定数量y,则判决框520之后可跟随框522,其中自旋锁利用模块210释放被自旋锁利用模块210获取且持有的局部自旋锁。在此实例中,自旋锁利用模块已作为局部自旋锁持有者自旋所分派次数来尝试获取全局自旋锁,并且不能作为局部自旋锁持有者进行更多尝试来试图获取全局自旋锁。

框522之后可跟随框524,其中由于不能作为局部自旋锁持有者获取全局自旋锁,自旋锁利用模块210睡眠(进入睡眠状态)。睡眠状态可通过一段时间或时钟周期来定义。睡眠状态还可涉及退避算法,即,如果先前已发生睡眠,则自旋锁利用模块210将在后续睡眠中睡眠更长的时间段。

否则,如果在判决框518处,自旋锁利用模块210确定全局获取标记和局部获取标记未被置位(全局自旋锁可用),则判决框518之后可跟随判决框526,其中自旋锁利用模块210进行检查以确定自旋锁利用模块210是否获取(局部获取)全局自旋锁。在此实例中,自旋锁利用正进行自旋来试图作为局部自旋锁持有者获取(局部获取)全局自旋锁。而且,除自旋锁利用模块210之外的其他进程可能一直在试图获取全局自旋锁。如果自旋锁利用模块210确定其已获取全局自旋锁,则判决框526之后可跟随框528,其中自旋锁利用模块210置位局部获取标记来指示全局自旋锁未被直接获取,但通过首先获取相关联局部自旋锁中的一个而被获取。即,全局自旋锁被局部自旋锁持有者获取。框528之后可跟随框530,其中自旋锁利用模块210释放被自旋锁利用模块210获取并持有的局部自旋锁。自旋锁利用模块210可释放局部自旋锁,因为自旋锁利用模块210已成功获取全局自旋锁。

否则,如果在判决框526处,自旋锁利用模块210确定其未获取全局自旋锁(自旋锁利用模块210作为局部自旋锁持有者未成功获取全局自旋锁),则判决框526之后可跟随判决框520,其中自旋锁利用模块210,其操作在上文进行了描述。在此实例中,自旋锁利用模块210进行检查以确定自旋锁利用模块210是否作为局部自旋锁持有者已自旋超过所分派特定数量y来试图获取全局自旋锁。

在此参看判决框516,如果自旋锁利用模块210确定其未成功获取局部自旋锁,则判决框516之后可跟随判决框532,其中自旋锁利用模块210进行检查以确定自旋锁利用模块210是否已试图获取与全局自旋锁相关联的所有局部自旋锁。即,自旋锁利用模块210进行检查以确定多个局部自旋锁中是否存在自旋锁利用模块210可试图获取的另一局部自旋锁。如果自旋锁利用模块210确定其已试图获取与全局自旋锁相关联的所有局部自旋锁,则判决框532之后可跟随框534,其中由于不能获取与全局自旋锁相关联的局部自旋锁中的任一个(不能获取保护对全局自旋锁的访问的局部自旋锁中的任一个),自旋锁利用模块210睡眠(进入睡眠状态)。

否则,如果自旋锁利用模块210确定与全局自旋锁相关联的多个局部自旋锁中存在另一局部自旋锁,则判决框532之后可跟随框536,其中自旋锁利用模块210试图获取与全局自旋锁相关联的另一局部自旋锁。在一些实施例中,此其他局部自旋锁也可从与全局自旋锁相关联的多个局部自旋锁中间随机选择。框536之后可跟随判决框516,其操作在上文进行了描述。

图6例示出可被用于执行如本公开以不同方式描述的技术中任一项的示例计算系统600的所选组件。在一些实施例中,计算系统600可被配置成实现或指导与以下内容相关联的一个或多个操作:与图1的可缩放自旋锁相关联的组件和/或模块中的一些或全部。例如,可在计算系统600中或使用计算系统600来实现自旋锁利用模块210、全局自旋锁104、局部自旋锁106或其组合。在示例情形中,例如,自旋锁利用模块210、全局自旋锁104以及局部自旋锁106中的每一个被加载至存储器604中并可由处理器602执行。计算系统600可以是任何计算机系统,诸如采用多插槽且能够通信并且具有充足处理器功率和存储器容量来执行本公开所描述操作的工作站、服务器、或者其他形式的计算或电信设备。可提供包括多个此类计算设备的分布式计算系统。如所描绘的,计算系统600可包括处理器602、存储器604以及数据存储606。处理器602、存储器604以及数据存储606可通信地耦合。

通常,处理器602可包括任何合适的专用或通用计算机、计算实体、或者包括各种计算机硬件、固件或软件模块的计算或处理设备,并且可被配置成执行存储在任何可适用计算机可读存储介质上的指令,诸如程序指令。例如,处理器602可包括微处理器、微控制器、数字信号处理器(dsp)、专用集成电路(asic)、场可编程门阵列(fpga)或被配置成解释和/或执行程序指令和/或处理数据的任何其他数字或模拟电路。在一些实施例中,处理器602包括适用于多插槽系统的任何合适的单核或多核处理器,包括处理器204。虽然在图6中被例示为单个处理器,但是处理器602可包括任何数量的处理器和/或处理器核,这些处理器和/或处理器核被配置成单独地或共同地执行或指导本公开中描述的任何数量的操作的执行。因此,处理器中的一个或多个可存在于一个或多个不同电子设备(诸如,不同服务器)上。

在一些实施例中,处理器602可被配置成解释和/或执行存储在存储器604、数据存储606、或者存储器604和数据存储606中的程序指令和/或处理数据。在一些实施例中,处理器602可从数据存储606取出程序指令并将程序指令加载至存储器604中。在程序指令被加载至存储器604中之后,处理器602可执行程序指令。

例如,在一些实施例中,可缩放自旋锁的组件和/或模块中的任何一个或多个(包括自旋锁利用模块210)可作为程序指令被包括在数据存储606中。处理器602可从数据存储606取出程序指令中的一些或全部,并且可将所取出的程序指令加载至存储器604中。在将程序指令加载至存储器604中之后,处理器602可执行程序指令,使得计算系统可实现由指令指导的操作。

在一些实施例中,可在计算设备600中采用虚拟化,使得计算设备600的基础结构和资源可被动态地共享。例如,可提供虚拟机来处理运行在多个处理器上的进程,使得进程表现为仅使用一个计算资源而非多个计算资源。多个虚拟机也可与一个处理器一起使用。

存储器604和数据存储606可包括计算机可读存储介质,该计算机可读存储介质用于携带或具有存储在其上的计算机可执行指令或数据结构。此类计算机可读存储介质可包括能由诸如处理器602之类的通用或专用计算机访问的任何可用介质。通过示例而非限制,此类计算机可读存储介质可包括非瞬态计算机可读存储介质,包括随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、紧凑盘只读存储器(cd-rom)或其他光盘存储、磁盘存储或其他磁存储设备、闪存设备(例如,固态存储器设备)、或者可被用于以计算机可执行指令或数据结构的形式携带或存储特定程序代码并且可由通用或专用计算机访问的任何其他存储介质。上述组合也可被包括在计算机可读介质的范围内。计算机可执行指令可包括例如被配置成使处理器602执行某一操作或操作组的指令和数据。

可对计算系统600进行修改、增补或删除而不背离本公开的范围。例如,在一些实施例中,计算系统600可包括任何数量的其他组件,这些组可能未在本文明确例示或描述。

如以上所指示的,本公开中描述的实施例可包括对包含各种计算机硬件或软件模块的专用或通用计算机(例如,图6的处理器602)的使用,如本文更详细地讨论的。此外,如以上所指示的,可使用用于携带或具有存储在其上的计算机可执行指令或数据结构的计算机可读介质(例如,图6的存储器604)来实现本公开中描述的实施例。

示例实施例

以下示例涉及进一步的实施例,大量的排列和配置将根据这些实施例变得显而易见。

示例1是被配置成用于非均匀存储器访问的可缩放锁存器的计算机系统。系统包括多个插槽,其中多个插槽中的每个插槽包括至少一个中央处理单元cpu以及本地附连存储器,其中每个插槽中的每个cpu被通信地耦合至插槽的本地附连存储器;全局自旋锁,该全局自旋锁被配置成控制对可共享资源的访问,全局自旋锁包括第一标记和第二标记;以及多个局部自旋锁,该多个局部自旋锁的每个局部自旋锁被配置成控制对全局自旋锁的访问;其中第一标记指示全局自旋锁是否被全局获取,而第二标记指示全局自旋锁是否被局部获取。

示例2包括示例1的主题,其中多个局部自旋锁与多个插槽在数量上相同,并且多个局部自旋锁中的每个局部自旋锁被分配在多个插槽中的相应插槽上。

示例3包括示例1的主题,其中多个局部自旋锁被均等地分布在多个插槽中间。

示例4包括示例1至3中任一项的主题,其中每个局部自旋锁是测试并置位自旋锁。

示例5包括示例1至3中任一项的主题,其中每个局部自旋锁是测试与测试并置位自旋锁。

示例6包括示例1至6中任一项的主题,其中如果第一标记指示全局自旋锁被全局获取,则准许全局获取全局自旋锁。

示例7包括示例1至6中任一项的主题,其中如果第二标记指示全局自旋锁被局部获取,则不准许全局获取全局自旋锁。

示例8包括示例1至7中任一项的主题,其中如果第二标记指示全局自旋锁被局部获取,则全局自旋锁仅能通过多个局部自旋锁中的局部自旋锁来被获取。

示例9一种用于控制对可共享资源的访问的计算机实现的方法。方法包括分配全局自旋锁,该全局自旋锁被配置成控制对可共享资源的访问,该全局自旋锁包括第一标记和第二标记;以及分配多个局部自旋锁,该多个局部自旋锁的每个局部自旋锁被配置成控制对全局自旋锁的访问;其中第一标记指示全局自旋锁是否被全局获取,而第二标记指示全局自旋锁是否被局部获取。

示例10包括示例9的主题,其中全局自旋锁被分配在多个插槽中的一个插槽上。

示例11包括示例10的主题,其中多个局部自旋锁与多个插槽在数量上相同,并且多个局部自旋锁中的每个局部自旋锁被分配在多个插槽中的相应插槽上。

示例12包括示例10的主题,其中多个局部自旋锁被分布在多个插槽之间。

示例13包括示例9至12中任一项的主题,其中全局自旋锁是测试并置位自旋锁。

示例14包括示例9至12中任一项的主题,其中全局自旋锁是测试与测试并置位自旋锁。

示例15包括示例9至14中任一项的主题,进一步包括,响应于全局获取全局自旋锁,置位第一标记以指示全局自旋锁被全局获取。

示例16包括示例9至15中任一项的主题,进一步包括,响应于确定第一标记指示全局自旋锁被全局获取,试图全局获取全局自旋锁。

示例17包括示例9至16中任一项的主题,进一步包括,响应于自旋第一特定次数来试图全局获取全局自旋锁而未获得全局自旋锁,试图获取多个局部自旋锁中的第一局部自旋锁。

示例18包括示例17的主题,其中第一局部自旋锁是随机选择的。

示例4包括示例17和18中任一项的主题,进一步包括,响应于获取第一局部自旋锁,试图局部获取全局自旋锁。

示例20包括示例19的主题,进一步包括,响应于局部获取全局自旋锁,置位第二标记以指示全局自旋锁被局部获取。

示例21包括示例17至18中任一项的主题,进一步包括,响应于自旋第二特定次数来试图获取第一局部自旋锁而未获得第一局部自旋锁,试图获取多个局部自旋锁中的第二局部自旋锁。

示例22包括示例21的主题,其中第二局部自旋锁是随机选择的。

示例23包括示例9至16中任一项的主题,进一步包括,响应于确定第二标记指示全局自旋锁被局部获取,试图获取多个局部自旋锁中的第一局部自旋锁。

示例24是一种计算机程序产品,包括用指令编码的一个或多个非瞬态机器可读介质,该指令在由一个或多个处理器执行时,使得执行用于控制对可共享资源的访问的进程。进程包括分配全局自旋锁,该全局自旋锁被配置成控制对可共享资源的访问,该全局自旋锁包括第一标记和第二标记;以及分配多个局部自旋锁,该多个局部自旋锁的每个局部自旋锁被配置成控制对全局自旋锁的访问;其中第一标记指示全局自旋锁是否被全局获取,而第二标记指示全局自旋锁是否被局部获取。

示例25包括示例24的主题,其中可共享资源是非均匀存储器访问(numa)系统的部分。

示例26包括示例25的主题,其中numa系统包括多个插槽,全局自旋锁被分配在多个插槽中的一个插槽上。

示例27包括示例26的主题,其中多个局部自旋锁与多个插槽在数量上相同,并且多个局部自旋锁中的每个局部自旋锁被分配在多个插槽中的相应插槽上。

示例28包括示例26的主题,其中多个局部自旋锁被分布在多个插槽之间。

示例29包括示例24至28中任一项的主题,其中全局自旋锁是测试并置位自旋锁。

示例30包括示例24至28中任一项的主题,其中全局自旋锁是测试与测试并置位自旋锁。

示例31包括示例24至30中任一项的主题,进一步包括,试图全局获取全局自旋锁;以及响应于全局获取全局自旋锁,置位第一标记以指示全局自旋锁被全局获取。

示例32包括示例24至31中任一项的主题,进一步包括,响应于确定第一标记指示全局自旋锁被全局获取,试图全局获取全局自旋锁。

示例33包括示例24至32中任一项的主题,进一步包括,自旋第一次数来试图获取全局自旋锁;以及响应于自旋第一特定次数来试图全局获取全局自旋锁而未获得全局自旋锁,试图获取多个局部自旋锁中的第一局部自旋锁。

示例34包括示例33的主题,其中第一局部自旋锁是随机选择的。

示例35包括示例33和34中任一项的主题,进一步包括,响应于获取第一局部自旋锁,试图局部获取全局自旋锁。

示例36包括示例35的主题,进一步包括,响应于局部获取全局自旋锁,置位第二标记以指示全局自旋锁被局部获取。

示例37包括示例33至34中任一项的主题,进一步包括,响应于自旋第二特定次数来试图获取第一局部自旋锁而未获得第一局部自旋锁,试图获取多个自旋锁中的第二局部自旋锁。

示例38包括示例37的主题,其中第二局部自旋锁是随机选择的。

示例39包括示例24和32中任一项的主题,进一步包括,响应于确定第二标记指示全局自旋锁被局部获取,试图获取多个局部自旋锁中的第一局部自旋锁。

如在本公开中使用的,术语“模块”或“组件”可指代被配置成执行可存储在计算系统的通用硬件(例如,计算机可读介质、处理设备等)上和/或由其执行的模块或组件和/或软件对象或软件例程的动作的特定硬件实现。在一些实施例中,本公开中描述的不同组件、模块、引擎和服务可被实现为在计算系统上执行的对象或进程(例如,作为分开的线程)。虽然本公开中描述的系统和方法中的一些一般被描述成以软件实现(存储在通用硬件上和/或由通用硬件执行),但是特定硬件实现、固件实现或其任何组合也是可能的和预期的。在本说明书中,“计算实体”可以是如先前在本公开中描述的任何计算系统,或者是在计算系统上执行的任何模块或调制的组合。

本公开和所附权利要求(例如,所附权利要求的主体)中使用的术语一般旨在作为“开放”术语(例如,术语“包括”应被解释为“包括但不限于”、术语“具有”应被解释为“至少具有”、术语“包含”应被解释为“包含但不限于”等)。

另外,如果特定数量的所引入权利要求叙述是有意的,则该意图将在权利要求中被明确地陈述,而在没有此类叙述的情况下,不存在此类意图。例如,为了帮助理解,以下所附权利要求可包含对介绍性短语“至少一个”和“一个或多个”的使用以引入权利要求叙述。然而,对此类短语的使用不应被解释为暗指由不定冠词“一”或“一个”对权利要求的引入将包含此类所引入权利要求叙述的任何特定权利要求限制为仅包含一个此类叙述的实施例,即使当同一权利要求包括引入短语“一个或多个”或“至少一个”,以及诸如“一”或“一个”之类的不定冠词(例如,“一”和/或“一个”应该被解释为“至少一个”或“一个或多个”);对于用于引入权利要求叙述的定冠词的使用也是如此。

另外,即使明确叙述了所引入权利要求叙述的具体数量,本领域技术人员将认识到,此类叙述应该被解释为意指至少是所叙述的数量(例如,仅仅是“两个叙述”而没有其他修饰语意指至少两个叙述,或者两个或更多个叙述)。此外,在使用类似于“a、b和c等中的至少一个”或“a、b和c中的一个或多个等”惯例的实例中,通常此类结构旨在包括单独的a,单独的b,单独的c,a和b一起,a和c一起,b和c一起,或a、b和c一起等。

本公开中记载的所有示例和条件语言旨在用于教学对象以帮助读者理解本公开和由发明人提供的用于促进领域的概念,并且应被解释为不限于此类具体叙述的示例和条件。尽管已经详细描述了本公开的实施例,但是在不脱离本公开的精神和范围的情况下,可对其进行各种改变、替换和变更。因此,意指本公开的范围不是由该详细说明书限制而是由所附权利要求限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1