同步原语的按需扩展的制作方法

文档序号:11530698阅读:295来源:国知局
同步原语的按需扩展的制造方法与工艺



背景技术:

改善多处理器计算机系统的性能位于计算机体系结构和操作系统设计的最前沿。为此,操作系统典型地被设计成支持具有能够并发地(concurrently)运行在单独的处理器上以访问共享存储器(sharedmemory)(例如主存储器)中的对象或数据结构的进程(process)或线程(thread)的多处理器系统。

为了支持这样的多处理器系统,同步原语(primitive)典型地由操作系统采用来避免竞态条件(racecondition)。竞态条件发生在多个线程同时访问和操纵相同的对象或数据结构的时候,其可以导致有缺陷的数据。同步原语在一般术语中可以强制执行(enforce)阻止线程在另一线程结束访问对象之前独家(exclusively)访问该对象的策略。这个策略的强制执行通过管理这些线程的并发交互来同步这些线程对于该对象的访问,因而避免竞态条件。

当给定线程获得同步原语以便访问共享存储器中的对象时,该线程可以执行典型地牵涉修改数据的所谓的“联锁操作(interlockedoperation)”。联锁操作是要求共享存储器的高速缓存(cache)线由正在执行该线程的处理器“拥有”的原子指令。换句话说,正在针对当前驻留在另一处理器的高速缓存中的数据执行联锁操作的线程必须首先将高速缓存线带到该线程正在其上执行的处理器的本地高速缓冲存储器以便针对该数据操作。

当大量的处理器(例如数百的处理器)正在并发地执行正执行联锁操作的线程时(例如当这些线程正尝试获得同步原语以便访问数据时),称为“高速缓存线争用(cache-linecontention)”的现象发生。高速缓存线争用牵涉在不同的处理器之间来回“查验(ping)”或“弹跳(bounce)”高速缓存线,以尝试由每一个处理器拥有高速缓存线。高速缓存线争用在多处理器系统的吞吐量(即,在给定单位的时间中处理的任务的数量)方面是非常昂贵的,这是因为处理器最终花费其大部分的时间来回弹跳高速缓存线而非处理任务。结果,这样的多处理器系统不是可缩放的(即,高速缓存线争用随着更多的处理器被添加而恶化,这负面地影响系统的吞吐量)。

用于在共享数据结构中缓解高速缓存线争用的一种合适方案是实现在每个处理器(per-processor)或每个节点(per-node)基础上分配共享存储器的高速缓存线的可缩放(“高速缓存感知(cache-aware)”)同步原语。通过为每一个处理器/节点分配高速缓存线,能够缓解高速缓存线争用。然而,相对于用于非高速缓存感知同步原语的少量存储器而言,具有大量处理器的系统要求高内存使用来保持(maintain)这样的高速缓存感知同步原语。结果,开发人员被迫在由于使用高速缓存感知同步原语而引起的可缩放性改善或由于使用非高速缓存感知同步原语而引起的内存益处之间选择。



技术实现要素:

在本文描述用于提供非高速缓存感知同步原语至高速缓存感知形式的按需扩展的技术和系统。尽管利用高速缓存感知同步原语提供了可缩放性益处,但是认识到:高速缓存线争用是间歇性发生。因而,高速缓存感知同步原语在对于增加吞吐量而言实际上不需要其时可能有时占据宝贵的内存占用(memoryfootprint)。同时,也认识到:在没有努力缓解高速缓存线争用的高速缓存感知同步原语的情况下,即使争用间歇性地出现,具有并行运行的许多(例如数百)处理器的多处理器系统也有可能表现不佳。

在一些实施例中,为多处理器系统提供非高速缓存感知同步原语,其中非高速缓存感知同步原语被配置成在为了性能和吞吐量目的而有必要这样做时扩展至高速缓存感知形式。为了确定何时有必要扩展非高速缓存感知同步原语,该系统可以确定由于针对非高速缓存感知同步原语的操作而导致的高速缓存线争用的等级。换句话说,针对非高速缓存感知同步原语的操作的“成本”可以采用可量化的方式来测量,并且那个测量的成本可以与阈值进行比较,其中阈值在被超过时触发非高速缓存感知同步原语至高速缓存感知形式的扩展,这导致具有每个处理器/节点状态的同步原语,其将个别高速缓存线分配给多处理器计算机系统的相应处理器。

在一些实施例中,同步原语一旦被扩展则可以被收缩(contract)或被恢复(revert)到非高速缓存感知形式。这样的收缩可以发生在自从同步原语被扩展以来时间周期(periodoftime)已流逝之后和/或在确定高速缓存线争用已减弱(即,降至其中不再需要高速缓存感知同步原语的等级)之后。

在本文描述的技术和系统提供由于可扩展同步原语的可用性而引起的可缩放性,其中可扩展同步原语在被扩展时提供高的性能和吞吐量。这些可扩展同步原语由于可以在任何给定时间上被扩展的有限数量的同步原语而在内存成本方面也是低的。利用本文的实施例所提供的益处虑及具有高乘法(highlymultiplicative)数据结构(例如具有成千上万的文件、句柄、注册表键(registrykey)等等的数据结构)的可扩展同步原语的实现方式。因而,在本文描述的技术和系统有可能导致性能和吞吐量的显著改善,同时从内存成本角度来看是便宜的。

提供这个概述部分来以简化形式介绍下面在具体描述部分中进一步描述的概念的选择。这个概要部分并不旨在识别所请求保护的主题的关键特性或本质特性,也不旨在被用于限制所请求保护的主题的范畴。

附图说明

参考附图来描述详细描述部分。在附图中,参考号的最左侧(多个)数字识别该参考号首次出现在其中的附图。在不同的附图中相同的参考号指示类似的或相同的项目。

图1举例说明用于实现可扩展同步原语的示例多处理器计算机系统。

图2是举例说明代表可扩展同步原语的示例数据结构的示意图。

图3是用于按需扩展非高速缓存感知同步原语的说明性进程的流程图。

图4是用于确定是否高速缓存线争用触发非高速缓存感知同步原语的扩展的说明性进程的流程图。

图5是用于扩展非高速缓存感知同步原语的更详细的说明性进程的流程图。

图6是用于收缩高速缓存感知同步原语的说明性进程的流程图。

具体实施方式

本公开的实施例特别涉及用于提供非高速缓存感知同步原语至高速缓存感知形式的按需扩展的技术和系统。虽然在本文呈现的许多示例依据锁(lock)来描述,但是在本文公开的实施例可以利用任何合适类型的包括但不限于纲要引用(rundownreference)、自旋锁、互斥锁(mutex)等等的同步原语来实现。

在本文描述的技术可以采用许多方式来实现。下面参考以下附图来提供示例实现方式。

示例多处理器计算机系统

图1举例说明用于实现可扩展同步原语的示例多处理器计算机系统100。例如,多处理器系统100可以表示一个或多个计算机器,其包括但不限于一个或多个服务器、一个或多个数据中心系统、一个或多个个人计算机或者(多个)任何其他合适的计算设备,而无论计算设备是移动的还是被定位。系统100只是一个示例多处理器系统来实现在本文描述的技术,以致在本文描述的技术并不限于使用图1的系统的执行。

多处理器系统100可以包括多个处理器102(1)、102(2)、102(3)、……、102(n)(共同地,102),其可以表示任何合适类型的执行单元,诸如中央处理单元(cpu)、核心和/或节点,这取决于多处理器系统100的实现细节。例如,任何个别处理器102可以表示单个cpu、具有被配置成执行单独线程的多个处理器或核心的节点或任何其他合适的处理器安排。处理器102之中的个别处理器各自可以具有相关联的本地高速缓冲存储器104(1)、104(2)、104(3)、……、104(n)(共同地,104)。高速缓冲存储器104可以包含一个或多个高速缓存等级(例如l1、l2等等)并且可以担任被放置在多处理器系统100的处理器102与共享存储器106(例如主存储器或系统存储器)之间的媒介来以个别处理器102的速度提供共享存储器106的功能。

顾名思义,共享存储器106可以在处理器102-高速缓冲存储器104配对之间进行共享。相应地,总线108可以将处理器102和高速缓冲存储器104连接到共享存储器106。在一些实施例中,总线108可以表示互连网络,诸如典型地在非均匀存储器访问(numa)系统中实现的互连网络。取决于确切的配置,共享存储器106可以是易失性(例如随机存取存储器(ram))、非易失性(例如只读存储器(rom)、闪存等等))或这两者的某种组合。此外,共享存储器106可以相对于处理器102和高速缓冲存储器104物理地被集中,或者共享存储器106可以物理地被分布在多个处理器102之间,以便作为一个逻辑地址空间而被这些处理器102共享。相应地,自每一个处理器102至共享存储器106的访问时间可以是均匀的,或者自每一个处理器102至共享存储器的访问时间可以变化,这取决于配置。多处理器系统可以进一步包括输入/输出(i/o)系统110,其包括i/o设备和媒体。

多处理器系统100也可以包括附加的数据存储设备(可移除和/或不可移除),例如,诸如磁盘、光盘或磁带,这全部是计算机存储媒体的示例。共享存储器106是计算机存储媒体的另一示例。计算机存储媒体可以包括采用任何的用于存储信息诸如计算机可读指令、数据结构、程序模块或其他数据的方法或技术来实现的易失性和非易失性、可移除和不可移除媒体。计算机存储媒体包括但不限于ram、rom、电可擦除可编程只读存储器(eeprom)、闪存或其他的存储技术、光盘只读存储器(cd-rom)、数字多用盘(dvd)或者其他的光储存器、磁带盒、磁带、磁盘储存器或其他的磁存储设备或者任何其他的能够用于存储能够利用多处理器系统100来访问的期望信息、对象和/或数据结构的介质。

在一些实施例中,共享存储器106可以存储当由一个或多个处理器102执行时实现在本文描述的一些或所有的进程的编程指令、数据结构、程序模块和其他数据。共享存储器106也可以被组织成具有固定尺寸的高速缓存线。例如,每一条高速缓存线可以是64字节的数据。一般而言,当处理器102不能在其本地高速缓冲存储器104中找到所需的对象时,处理器102可以从共享存储器106中检索线尺寸块(line-sizeblock)的数据并且可以将它放置在它自己的高速缓冲存储器104中。

多处理器系统100可以(例如在共享存储器106内)包括操作系统112,其中操作系统特别地被配置成提供允许多个并发执行线程访问共享存储器106中的对象和/或数据结构的可扩展同步原语。一般来说,操作系统112可以包括支持组件(包括属性和事件)、对象、继承性(inheritance)、多态性、反射并提供面向对象的基于组件的应用编程接口(api)的基于组件的框架,诸如来自microsoft®corporationofredmond,wa(华盛顿州雷德蒙德市的微软公司)的市售的win32™编程模型和.net™框架。操作系统112可以是基于windows、基于unix、基于linux或者任何其他合适的操作系统类型。

多个处理器102之中任何数量的处理器可能正在并发地执行一个或多个线程,以便在多处理器系统100上完成(carryout)某些指令。在一些情况中,给定线程将完成指令来访问共享存储器106中的对象或数据结构,这能够为了各种目的而这样做。例如,线程可能需要读取对象(例如拷贝或打印对象)、修改对象(例如添加项目至现有的项目列表和/或递增计数器)或者采取其他某种行动来以某种方式操纵对象。

图2是针对利用多处理器系统100的实现方式来举例说明可以表示可扩展同步原语的示例数据结构的示意图。在图2中显示对象200的数据结构。在一些实施例中,对象200可以包括特定文件格式的数据文件(例如excel®电子表格、word®文档等等)。在这个说明性示例中,对象200可以是包含项目列表202(例如产品列表)的文件,其可以代表对象200的主要内容。对象200的数据结构可以进一步包括保持跟踪列表202中的项目数量的计数字段204。对象200的数据结构可以进一步包括可扩展同步原语206或可以以其他方式与可扩展同步原语206相关联。图2将同步原语206表示为锁。在下文,术语“锁”可以与术语“同步原语”互换地进行使用,并且在附图中可以通过使用参考数字206来引用二者。虽然锁206在图2中被显示为示例同步原语,但是可以利用任何其他合适类型的同步原语来取代锁206,诸如纲要引用、自旋锁、互斥锁等等而非限制。此外,对象200仅仅是可以利用本文的技术和系统来加以利用的示例对象,并且在不改变系统的基本特征的情况下可以利用其他对象类型的不同数据结构。

再次参考图2,利用参考数字206'进一步详细显示锁206的数据结构。锁206的数据结构206'表示锁206的未扩展或折叠形式。锁206的未扩展/折叠形式在本文可以被称为“非高速缓存感知”锁206,以便将锁206的未扩展/折叠形式与锁206的扩展形式区分开来,这将在下面更详细地来描述。

如图2所示,非高速缓存感知锁206的数据结构206'可以包括多个数据字段,诸如指示已采用共享方式还是独家方式获得了锁206的数据字段208。例如,锁206可以包括被配置成采用或独家方式或共享方式来获得的读/写锁206。为了举例说明独家情况,诸如通过递增对象的数据结构的计数204,称为“更新”线程的给定线程可以完成指令来修改数据。可以在项目被添加至列表202时做这个。为了以这种方式递增计数204,例如,通过设置数据字段208中的比特来通知其他线程:它们必须等待直至在能够以或独家或共享方式获得锁206之前释放(release)锁206,线程可以完成锁206的“独家”获得。在线程以独家方式获得锁206之后,它可以读取计数204、添加“1”(例如,如果递增计数的话)、写回新值和释放锁206。

为了举例说明共享情况,设想具有多个“读”线程,其中每一个线程完成指令来拷贝或打印项目列表202。与先前示例中的更新线程不同,这些读线程不需要从列表202中添加/删除任何东西或以其他方式递增/递减计数204。因而,多个读线程可以采用共享方式同时持有(hold)锁206。在这个示例中,给定读线程可以完成锁206的共享获得来拷贝或打印项目列表202。当读线程正以共享方式持有锁206时,可以具有多个其他的线程以共享方式同时持有锁206来执行类似的任务。同时,正试图获取锁206的独家获得的线程在锁206被(多个)读线程“共享”持有的同时将被阻止这样做,以致竞态条件被避免。以这种方式,锁206的数据结构206'可以进一步包括数据字段210,其保持在任何给定时间上正以共享方式持有锁206的线程的数量的参考计数。数据字段210中的这个“共享计数”可以利用以共享方式获得锁206的每一个线程来递增,并且可以利用执行锁206的共享释放的每一个线程来递减。这些递增/递减锁的数据结构206'的数据字段210中的共享计数的操作被执行为联锁操作(即,要求共享存储器的高速缓存线由正在运行执行联锁操作的线程的处理器102“拥有”的原子指令)。例如,一旦运行锁206的共享获得,读线程可以读取数据字段210中的共享计数、递增变量和写回新值,以便原子级地(atomically)更新锁的数据结构206'中的共享计数。

在其中相对小数量的处理器102正在针对锁206并发执行联锁操作的场景中,锁206的非高速缓存感知形式可能适合于同步这些线程对于对象200的访问而对于多处理器系统100的吞吐量没有显著影响。然而,考虑其中具有大量(例如数百)的处理器102正在同时执行联锁操作(例如以共享方式同时获得锁206)的场景,高速缓存线争用可以上升至显著影响系统吞吐量的等级。将意识到:共享获得是能够针对锁206执行的联锁操作的一个示例。相应地,其他类型的联锁操作(例如interlockedcompareexchange——在(多个)指定值上执行原子比较与交换操作的函数)也有可能发生。因而,考虑到可以在任何给定时间上针对锁206执行的可能的联锁操作的数量,高速缓存线争用与非高速缓存感知锁206一起是值得关注的问题。

相应地,如图2所示,锁206的数据结构206'可以包括附加的数据字段,其提供包括以下的功能:(i)可以被监视以便触发非高速缓存感知锁206的扩展的采用紧凑且有效的方式来保持争用统计数据(statistics)的能力;和(ii)有效地将非高速缓存感知锁206扩展至高速缓存感知形式的扩展逻辑,以致在对其具有需要时能够缓解高速缓存线争用。

相应地,锁206的数据结构206'可以包括争用统计数据212,其可以追踪(对于有限的时间周期)任何可想到的在直接地或通过推理来确定高速缓存线争用的数量/等级或针对锁206执行的操作(例如联锁操作)的类似成本中是有用的度量或参数。虽然争用统计数据212被显示为被保持在锁206的数据结构206'内,但是意识到:在一些实施例中,争用统计数据212可以被保持在存储器中的其他地方(例如共享存储器106中的其他地方)。在这样的场景中,锁206的数据结构206'可以包括指向其中保持争用统计数据212的存储器中的位置的指针,或者争用统计数据212可以采用某种其他合适的方式被键控(key)至该锁的地址。争用统计数据212的单独保持可以减少锁的数据结构206'的尺寸要求,但是对于访问争用统计数据212而言可能是相对效率低下的。在任何情况下,通过使得争用统计数据212为尽可能紧凑的(即小数据尺寸)以便最小化非高速缓存感知同步原语诸如锁206的内存占用,可以实现低的内存成本。

图2将争用统计数据212显示为包括用于保持参数的测量的锁的数据结构206'的数据字段214。可以在时间周期上针对锁206的联锁操作的执行期间采取(take)这些测量。在图2的示例中,所测量的参数被指定为与联锁操作相关联的循环计数(cyclecount)(或时钟-时间计数)。例如,时钟循环可以在锁206的共享释放(或共享获得)期间被测量并且作为收集争用统计数据212的进程的一部分被保持在数据字段214中。在这个场景中,循环计数参数可以被利用来通过所测量的时钟循环与表示在没有高速缓存线争用的情况下执行操作时的值的参数的某基线值的比较来确定由于针对非高速缓存感知同步原语206的操作而导致的高速缓存线争用的等级。例如,每个操作循环计数可以与用于给定操作的某个基线或“正常的”每个操作循环计数进行比较。如上所述,因为非高速缓存感知锁206的共享获得(和共享释放)典型地牵涉一个或多个联锁(原子)操作,所以高速缓存线争用在这些类型的操作被执行时被期望显著增加,从而增加对于这些操作而言必要的循环的数量。通过测量循环计数并基于随着时间的推移而采取的测量来计算循环计数的统计值(例如平均值或均值、中间值、模式、最小值、最大值等等)且将统计值与用于那个操作的无争用循环计数的基线值进行比较,可以确定(或推断)高速缓存线争用的等级,以决定是否具有扩展非高速缓存感知锁206的合适需要。例如,如果平均/每个操作循环计数超过基线值,或者如果平均/每个操作循环计数与基线值相比超过阈值百分比(例如超过大于25%)等等,则可以触发扩展。

参数(例如循环计数)的基线值可以在多处理器系统100内静态地被硬编码(例如在共享存储器106中被硬编码),其可以在多处理器系统的启动时间(boottime)上通过在没有高速缓存线争用时针对锁206执行特定操作(例如重复地执行联锁操作)来测量,或者其可以由多处理器系统100的管理员来配置。所测量的基线值随后可以被存储在存储器(例如共享存储器106)中。

在一些实施例中,在数据字段214中测量的参数可以包括在非高速缓存感知锁206的获得或释放的执行期间interlockedcompareexchange“重试”的数量。这样的重试可以指示另一处理器102在相同的时间已修改锁状态,从而以信号告知(signal)高速缓存线争用。例如,如果每“n”个获得/释放的interlockedcompareexchange重试的计数达到重试参数的预定阈值,则非高速缓存感知锁206可以被扩展。如同用于循环计数参数的基线值一样,这个阈值可以在多处理器系统100中静态地被硬编码,其可以在多处理器系统100的启动时间上通过测量重试变成性能瓶颈的点来计算,或者其可以由多处理器系统100的管理员来配置。所测量的点随后可以被存储作为重试阈值。

在一些实施例中,在数据字段214中测量的参数可以包括针对非高速缓存感知锁206的获得或释放操作的频率。这个频率参数可以通过在单位时间上计数获得/释放操作来测量。获得/释放频率参数随后可以与阈值进行比较来判定是否正在超过阈值的频率上执行这些操作,这意味着:这些操作有可能受到高速缓存线争用的影响。阈值频率可以在多处理器系统100中静态地被硬编码,阈值频率可以在多处理器系统100的启动时间上通过在高速缓存线上强迫(force)高速缓存线争用并且随后测量其上的操作引起性能问题的频率来计算,或者阈值可以由多处理器系统100的管理员来配置。这个测量的频率随后可以被存储作为阈值频率。

除了在本文具体描述的之外,还可以测量指示高速缓存线争用的等级的其他合适的参数。利用任何合适的参数,通过在数据字段214中收集所测量的参数的值并将那些测量的相关联值与基线或阈值进行比较,可以提供用于触发非高速缓存感知锁206的扩展的机制。

为了减少被所收集的统计数据212占据的内存占用,比例因子可以被应用于数据字段214中的测量参数,以减少被分配用于在字段214中存储数据的内存。比例因子的计算可以基于无争用的联锁操作的成本,以致可以以按比例缩放(scale)的无争用成本为单位来表示数据字段214中的参数测量(例如)。这可以允许只要16个比特就足以表示在数百的测量上所测量的参数(例如总的循环计数)。通过按比例缩小数据字段214中的数据,可以紧凑地且便宜地存储所收集的统计数据212,以便减少非高速缓存感知锁206的内存占用。

所收集的统计数据212所基于的操作可以包括非高速缓存感知同步原语206的获得操作或释放操作。因而,争用统计数据212可以在获得操作、释放操作或二者期间进行测量或收集。在释放代码路径中测量/收集争用统计数据212可以发生在没有实际释放锁206的联锁操作期间,以致在同步原语206被持有的同时可以减少计算(即,基于所收集的统计数据212的计算可以在锁没有正被持有时被执行)。在这个场景中,在锁被实际释放之前仍可以更新争用统计数据212。通过对比,在获得代码路径中测量/收集争用统计数据212可以牵涉等待锁206被释放。然而,在获得代码路径中争用统计数据212的测量/收集可能不携带锁206潜在地被异步破坏的风险;在释放操作期间存在的风险。无论测量/收集发生在哪里,可以在争用统计数据212中在数据字段214内测量和更新该参数。

在一些实施例中,更新争用统计数据212的指令可能不是原子指令。在这个场景中,争用统计数据212可能是有损耗的。然而,在不使用联锁操作的情况下更新争用统计数据212最小化与同步原语206的获得或释放相关联的成本。此外,争用统计数据212可能仍是一致的,这是因为它们可以被计算为局部变量并且使用单个存储指令来更新。

在一些实施例中,争用统计数据212可以进一步包括用于保持锁206的共享释放(或共享获得)的数量的计数的数据字段216以及用于保持锁206的独家释放(或独家获得)的数量的计数的数据字段218。数据字段216和218中的计数可以被保持在时间周期上,其中在该时间周期内在数据字段214中测量该参数。在其上收集和保持争用统计数据212的时间周期可以发生在针对锁206执行的多个操作的过程中。通过将这些计数保持在数据字段216和218中,可以评估独家获得/释放与共享获得/释放之比率。鉴于针对“高速缓存感知”(即扩展)同步原语执行相对高数量的独家获得/释放(从吞吐量角度而言)是昂贵的,这对于确定将锁206扩展至高速缓存感知形式的成本而言可能是有用的。这个费用归因于以下事实:高速缓存感知同步原语的独家获得要求利用线程获得高速缓存感知同步原语中所有的复制的同步原语。因而,通过监视独家获得/释放相对于共享获得/释放的数量(例如独家获得或释放的数量与共享获得或释放的数量之比率),在显著百分比的锁206的获得是独家获得时,能够避免扩展。

在一些实施例中,表示争用统计数据212的数据的尺寸可能不大于大约32比特。在这个场景中,共享释放计数数据字段216的尺寸可能不大于大约12比特,独家释放计数数据字段218的尺寸可能不大于大约4比特,并且循环计数数据字段214的尺寸可能不大于大约16比特。在更新争用统计数据212时,争用统计数据212的整个32比特值可以使用单个存储指令来更新。争用统计数据212的这个紧凑尺寸虑及非高速缓存感知同步原语的便宜保持。

在一些实施例中,在收集争用统计数据212时,多处理器系统100可以进一步监视是否上下文切换发生在参数测量期间。上下文切换是存储和修复线程的状态(上下文)以致能够从稍后的相同时间点重新开始执行的进程。因为上下文切换可能由于在尝试获得操作之后线程被上下文切出(contextswitchout)而扭曲(skew)字段214中所测量的参数值,所以保持每个线程发生的上下文切换的计数虑及受到上下文切换影响的测量被忽略。换句话说,在上下文切换期间采取的参数测量能够从所收集的统计数据212中被丢弃或被扔掉,以致针对同步原语206的操作的成本并不因为上下文切换而被扭曲。

在收集争用统计数据212时,参数(例如循环计数)可以在针对同步原语206执行的若干操作的过程中被测量并被保持在数据字段214中。在一些实施例中,保持在数据字段214中的测量可以是采样的测量,以便降低每个操作处理器成本。例如,每第16操作可以被采样以便测量,直至足够数量的采样被采取来在每个操作基础上计算所测量的参数的统计值(例如平均值)。根据随着时间的推移而采取的多个测量所计算的平均值可以减少在争用统计数据212中显现的临时尖峰或异常的风险。

当基于争用统计数据212确定高速缓存线争用位于足以保证非高速缓存感知同步原语206的扩展的高等级上时,扩展逻辑可以用于有效地将非高速缓存感知同步原语206扩展至高速缓存感知(扩展)形式。具体地,当到了扩展非高速缓存感知同步原语206的时间时,可能具有多个线程位于获得和/或当前保持非高速缓存感知同步原语206的进程中。用于扩展非高速缓存感知同步原语206的扩展逻辑因此可以保护这样的线程免于崩溃和/或尊重(honor)这些线程正在获得或持有位于扩展的进程中的同步原语206的事实。为了完成这个任务,非高速缓存感知锁206的数据结构206'可以进一步包括虑及同步原语206至其高速缓存感知形式的有效且安全的扩展的一个或多个扩展逻辑数据字段220。

扩展逻辑数据字段220可以包括数据字段222,其包含转换比特t,其中转换比特t将利用被操作系统112命令来扩展同步原语206的线程来设置。为了设置t比特,线程可以针对锁206执行联锁操作,而如果成功的话,设置t比特的线程则负责尝试同步原语206的扩展。图2将这个扩展举例说明为内存分配技术,其中多个高速缓存线224(1)、224(2)、……、224(n)(共同地,224)可以被个别分配给多处理器系统100的相应处理器102,以致线程可以在其自己(即,其处理器自己)的高速缓存线上执行操作。在一些实施例中,内存分配技术可以包括将少于完整的高速缓存线(其典型地为64字节的量级)分配给处理器102之中的个别处理器,以致可以在个别高速缓存线224中保持多个同步原语206的数据。在任何情况下,高速缓存线224依据每个处理器/节点状态来分配,以避免高速缓存线争用。在图2中利用参考数字206''来显示这种类型的扩展数据结构,并且扩展数据结构206''可以表示同步原语206的“高速缓存感知”形式。锁206可以指向高速缓存线224(1)-(n)的阵列,其中每一个高速缓存线224被分配用于个别处理器102并且表示将对于给定对象200获得的非高速缓存感知同步原语206的副本。同步原语206的高速缓存感知形式可以通过缓解或者一起消除对于同步原语206的共享获得的高速缓存线争用来增加多处理器系统100的吞吐量,这是因为执行共享获得的特定线程仅仅识别与其处理器102相对应的高速缓存线224以便在那个特定高速缓存线224上获得同步原语206的副本。通过对比,正尝试执行同步原语206的独家获得的更新线程被要求获得所有的高速缓存线224(1)-(n),这能够负面地影响多处理器系统100的吞吐量。在此的假设是:独家获得在许多的多处理器系统100中与共享获得相比而言是稀有的,因此利用高速缓存感知同步原语的数据结构206''所提供的吞吐量益处优于由于提供扩展数据结构206''而引起的任何缺点。

再次参考扩展逻辑数据字段220,一旦负责尝试锁206的扩展的线程成功地将非高速缓存感知锁206扩展至高速缓存感知锁206,该线程可以利用数据字段222中清除(clear)的t比特来更新锁的状态并且可以在锁的数据结构206'的数据字段226中设置扩展比特e来指示:锁206已被扩展至其高速缓存感知形式作为扩展数据结构206''。在所尝试的扩展期间,如果一个线程由于任何原因而没有成功扩展非高速缓存感知锁206,则可以使用单个存储指令来清除t比特,以致另一线程能够尝试扩展。

无论是否锁206被成功地扩展,执行锁206的共享获得的任何线程检查e比特,以查看是否锁206被扩展至其高速缓存感知形式。如果e比特依据这个检查被设置,则线程随后可以识别与其处理器102相对应的特定高速缓存线224,以致线程可以取得那个高速缓存线224的所有权并在特定高速缓存线224上执行一个或多个联锁操作。被调用线程拥有的高速缓存线224表示所获得的锁,其随后可以被编码成远程句柄228并被返回至调用线程。在调用线程不知道远程句柄228表示什么的意义上,远程句柄228可能是不透明的。调用线程可以将远程句柄228传递至释放函数,并且释放路径可以使用远程句柄228来确定扩展数据结构206''中的哪一个锁将释放。

在一些实施例中,一个或多个线程可以采用共享方式持有非高速缓存感知锁206,而另一线程(例如通过设置t比特、分配内存、清除t比特和设置e比特)扩展锁206。这允许扩展发生而不等待线程释放非高速缓存感知锁206(即有效扩展),同时尊重某些线程正持有非高速缓存感知锁206的事实。

在一些实施例中,扩展逻辑数据字段220可以省略用于t比特的数据字段222并且依靠用于扩展逻辑的锁的数据结构206'的数据字段226内的e比特。在这个场景中,如果线程看到在写回尝试期间设置的e比特,正尝试非高速缓存感知锁206的扩展的线程可以中止扩展尝试。然而,在数据字段222中t比特的包含可以通过阻止线程并发地尝试非高速缓存感知锁206的扩展来优化性能。

在一些实施例中,单个状态可以用于编码与锁206的扩展的当前状态有关的信息。例如,“0”可以指示未扩展状态,“1”可以指示转换状态,“2”可以指示不扩展状态,并且“3”可以指示给定锁206的扩展状态。这个实施例虑及追踪状态而不使用单独比特。因而,例如,非高速缓存感知锁206的转换状态可以通过设置t比特来表示,但是追踪转换状态并不限于这样的实现方式。同样地,例如,扩展状态可以通过设置e比特来表示,但是追踪扩展状态并不限于这样的实现方式。

在一些实施例中,非高速缓存感知锁206的数据结构206'可以进一步包括数据字段230,其包括分页比特p来指示锁206是“分页(paged)”锁还是“非分页(non-paged)”锁。p比特指示对于实现用于收缩高速缓存感知同步原语的恰当收缩逻辑而言可能是有用的,如下面更详细描述的。p比特也可以用于确定分配用于高速缓存感知锁206的池(pool)的类型(即分页或非分页)。在一些实施例中,在非分页代码路径中获得的锁206可以被分页。

如上所述,高速缓存感知同步原语的大内存占用是其实现方式的缺点。因此,高速缓存感知同步原语206可以是可折叠的,以便将高速缓存感知同步原语206恢复到其非高速缓存感知(即折叠或未扩展)形式。当确定或推断高速缓存线争用已减弱或降低至其中不再需要高速缓存感知同步原语206的等级时,操作系统112可以提供用于收缩扩展数据结构206''的收缩逻辑。因而,随着高速缓存线争用的严重程度增加和降低,同步原语的扩展和收缩可以“按需”发生。

在一些实施例中,高速缓存感知同步原语206的收缩可以发生在自从扩展以来时间周期已流逝之后。例如,高速缓存感知同步原语206可以在大约一秒的周期之后折叠/收缩。在一些情况下,从扩展到收缩的时间周期在时间周期由于多处理器系统100的类型和/或多处理器系统100上处理器102的数量而变化的意义上可以是设备相关的。通过在时间周期的流逝之后进行收缩,可以推断:高速缓存线争用在这个时间周期之后已减弱。然而,如果高速缓存线争用在规定的时间周期之后没有减弱,则多处理器系统100可以简单地依靠有效的扩展逻辑来再一次扩展非高速缓存感知同步原语206以响应显著的高速缓存线争用的检测。以这种方式周期性地收缩高速缓存感知同步原语虑及实现不保持任何的争用统计数据的高速缓存感知同步原语。保持高速缓存感知同步原语的争用统计数据从吞吐量角度来看可能是适得其反的,这是因为这样的保持可以引起正是高速缓存感知同步原语206旨在避免的高速缓存线争用的增加。然而,在一些实施例中,后扩展统计数据可以采用“无争用方式”来保持(即不引起高速缓存线争用的显著增加)。

相应地,收缩高速缓存感知同步原语206可以进一步以除了时间之外的附加标准为条件。用于判定何时收缩高速缓存感知同步原语206的一个示例标准可以是:独家获得(或独家释放)的数量高于独家获得/释放的阈值数量。大量的高速缓存感知同步原语206的独家获得从吞吐量角度来看是昂贵的,因此收缩体验大量的独家获得的那些高速缓存感知同步原语可能是有益的。

用于收缩的另一示例标准可以是:高速缓存感知同步原语226的共享获得(或共享释放)的比率低于在高速缓存感知同步原语206被扩展之前的共享获得/释放的比率。共享获得/释放的比率可以指示相对于那个同步原语的“活动”的等级,以致在确定活动已丢弃后扩展时,收缩高速缓存感知同步原语206可能是安全的。用于收缩的另一示例标准可以是:共享获得(或共享释放)的数量与独家获得(或独家释放)之比率低于阈值比,这指示高速缓存感知同步原语206可能几乎没有在体验活动。在一些实施例中,这些度量的计算可以在利用更新线程执行独家获得的时间上被执行。

后扩展统计数据的保持以确定前述收缩标准可以通过保持用于高速缓存感知同步原语206的扩展数据结构206''的每个高速缓存线224的统计数据以无争用方式来完成。例如,高速缓存感知同步原语206的共享获得/释放的数量的计数可以相对于支持这些操作的执行的处理器102、每个高速缓存线224来保留。同时,独家获得计数可以相对于扩展数据结构206''来全局地保持。

收缩高速缓存感知同步原语206可以进一步以有助于确保尽可能不频繁地执行收缩的附加标准为条件。认识到:与作为针对同步原语的扩展进程的结果而体验的任何中断相比,收缩高速缓存感知同步原语206可以引起更多的针对多处理器系统100的中断。因而,稀少地收缩可能是明智的。相应地,任何给定的高速缓存感知同步原语206的收缩可以以多处理器系统100上的高速缓存感知同步原语的数量超过在周密考虑一个或多个高速缓存感知同步原语的收缩的时间上高速缓存感知同步原语的阈值数量的标准为条件。为了确定在任何给定时间上在多处理器系统100上高速缓存感知同步原语的数量并且为了确定哪些高速缓存感知同步原语有资格收缩,高速缓存感知同步原语一旦其被扩展就可以向中央机构(centralauthority)(或共享注册表)进行注册。这样的注册可以包括:分配显性注册条目,其包括指向针对每一个高速缓存感知同步原语206所注册的高速缓存感知同步原语206的指针;以及保持注册条目列表。在一些实施例中,用于分页/可分页的同步原语的注册列表可以与用于非分页/不可分页的同步原语的另一注册列表分开来保持。一旦注册的同步原语被收缩,则可以从注册列表中移除这些同步原语。

用于高速缓存感知同步原语206的收缩的其他条件可以被应用来确保:收缩正以“安全”方式来完成。即,在一个或多个线程正持有高速缓存感知同步原语206的同时和/或如果在收缩开始时具有正试图执行高速缓存感知同步原语206的共享获得的任何“飞行中(in-flight)”线程,收缩高速缓存感知同步原语206可能是不安全的。因而,在一个示例中,操作系统112可以等待收缩,直至没有线程持有高速缓存感知同步原语206。这可以牵涉等待独家释放或者在收缩之前等待共享所有者线程的计数达到零。在一些实施例中,操作系统112可以等待收缩,直至在多处理系统100上没有高速缓存感知同步原语被任何线程持有。这个场景可以导致不太频繁的收缩,但是(例如,在单个锁206正被线程持有时)也可能导致高速缓存感知同步原语的不需要的保持。

在一些实施例中,操作系统112可以确定是否具有将要获得高速缓存感知同步原语206的分配的高速缓存线224的任何线程(即是否具有任何“飞行中”线程)。飞行中线程的确定可以基于检查针对个别线程的进行中(in-progress)的锁获得的列表。例如,如果给定线程正在执行高速缓存感知同步原语206的共享获得,则它可以首先检查数据字段226中的e比特以确定同步原语206位于其扩展形式中,并且随后将其进行中的获得操作注册到那个线程的进行中的锁获得的列表中。依据这个注册,该线程还没有访问与其处理器102相对应的高速缓存线224。

在一些实施例中,包含同步原语指针和平衡树条目的栈内数据结构能够被添加至给定线程的进行中的锁获得的列表。在上下文切换时间上,这个列表能够被行走(walk),并且这些条目被插入到利用上下文切换处理器102上锁的地址来键控的每个处理器树中。以这种方式,可以具有运行来查看是否在多处理器系统100上具有有资格收缩的任何高速缓存感知同步原语的周期性任务,并且对于所识别的每一个候选者,该任务可以检查每个处理器树,以查看是否具有任何的有关那个候选同步原语的飞行中线程。如果根据每个处理器树具有一个或多个飞行中线程,候选同步原语可以不被收缩。

在一些实施例中,确定是否对于候选同步原语具有飞行中线程可以基于检查是否针对这些线程之中的个别线程设置线程局部比特(thread-localbit)。线程局部比特能够在访问高速缓存感知同步原语206的高速缓存线224之前进行设置并且接着在成功完成访问相应高速缓存线224时被清除。在上下文切换期间,这个比特的值可以被添加至执行上下文切换的处理器102上的计数器。

在任何情况(即利用锁的地址或线程局部比特来键控的每个处理器树)中,飞行中线程可以在高速缓存感知同步原语206被收缩之前被追踪,而如果检测到任何飞行中线程,则操作系统112可以制止收缩高速缓存感知同步原语206。假设是:在线程检查e比特与该线程获得高速缓存感知同步原语206的每个处理器高速缓存线224之间的时间中被上下文切出是罕见的情况。基于这个假设,在任何给定时间上飞行中线程的列表有可能是小的并且保持是便宜的。此外,预期:检测到零个飞行中线程的条件有可能相对频繁地发生。

在一些实施例中,在检查是否具有任何的飞行中线程和/或任何的线程持有是用于收缩的候选者的高速缓存感知同步原语206的同时,可以执行在多个处理器102上的操作系统中断。这个中断可以包括向每一个处理器102发送中断,以查看相应处理器正在做什么。在其中飞行中线程的每个处理器树被保持的示例中,通过在每个处理器树的检查期间在所有的处理器102上运行代码可以执行操作系统中断。在一个场景中,飞行中线程可能已被上下文切出。在这个场景中,线程的栈内注册可以被添加至利用锁地址来键控的全局树,以致能够找到被上下文切出的飞行中线程。由于操作系统112拥有上下文切换代码,如果具有这样的被上下文切出的飞行中线程,则操作系统代码可以确定:该线程在共享获得期间被上下文切出,以致该线程能够以这样的方式被记住。在另一场景中,可能具有尚未被上下文切出的飞行中线程(这意味着:在操作系统中断发生时,飞行中线程正在运行在处理器102上)。在这个场景中,飞行中线程应该已注册其栈内条目,但是该条目可能尚未被转至全局树。因而,在操作系统中断针对每一个处理器102发生时可以检查正运行在处理器102上的飞行中线程,并且全局树中已注册条目的列表可以被行走来查看是否用于收缩的候选锁206位于那个列表中。线程局部比特方案可以与每个处理器树方案类似地处理前述场景。

被利用来收缩高速缓存感知同步原语206的收缩逻辑可以基于同步原语206是分页的还是非分页的。如上所述,非高速缓存感知同步原语206可以包括数据字段230来指示同步原语206是分页的还是非分页的。由于操作系统112不能触摸(touch)具有同时运行在每一个处理器102上的代码的分页存储器(无效存储器),所以分页的高速缓存感知同步原语可以被钉(pin)到共享存储器106中的位置来有效地将分页的同步原语转换成非分页的同步原语。

对于非分页的同步原语来说,处于扩展形式(即高速缓存感知形式)中的每一个非分页的同步原语可以被注册到非分页的注册列表上。用于这样的非分页的同步原语的收缩逻辑可以通过在调度等级(dispatchlevel)上网罗(corral)所有处理器以致其正在调度等级上自旋(spin)并且行走非分页的注册列表以找到用于收缩的候选同步原语来操作。检查可以被执行来查看是否能够安全地收缩候选同步原语。如上所述,如果利用同步原语的地址来键控的每个处理器树被利用来检测飞行中线程,则可以搜索每个处理器树数据结构以查找候选同步原语的地址,而如果找到的话,则可以不收缩候选同步原语。另外,在操作系统中断期间可以检查正运行在特定处理器102上的任何飞行中线程,并且可以行走全局树中的注册条目的列表来查看是否候选同步原语位于那个列表中,而如果是这样的话,则其可以不被收缩。可供选择地,如果线程局部比特用于追踪飞行中线程,则可以执行检查来确定是否任何处理器102具有指示具有一个或多个飞行中线程的非零计数器值,而如果满足非零条件,则同步原语可以不被收缩。

另一方面,如果没有飞行中线程被检测到,则可以通过将同步原语状态更新成未扩展/折叠状态来收缩候选同步原语。这可以包括聚集(aggregate)候选同步原语的共享获得、清除数据字段226中的e比特和重置争用统计数据212。每个处理器高速缓存线224内存分配可以针对候选同步原语被“快照(snap)”,并且在网罗的处理器102被释放之前从非分页的注册列表中移除其注册条目。在处理器102被释放之后,操作系统112可以解放(free)注册条目和每个处理器高速缓存线224内存分配。

对于分页的同步原语来说,在扩展形式(即高速缓存感知形式)中的每一个分页的同步原语可以被注册到分页的注册列表上。相应地,用于收缩分页的同步原语的收缩逻辑可以通过以下来操作:获得分页的注册列表的锁;行走分页的注册列表以找到用于收缩的候选同步原语;以及调用内存管理器来将候选同步原语钉在共享存储器106中,以致后续访问(其将在其中不能采取页故障的调度等级上被执行)将不采取页故障。收缩逻辑的剩余部分可以遵循非分页锁的部分,如上所述。如果收缩由于解放每个处理器高速缓存线224内存分配而是成功的话,可以从分页的注册列表中移除用于收缩的同步原语的注册条目。

如上所述,图2所示的锁206只是可以与在本文描述的技术和系统一起加以利用的同步原语的一个示例。例如,纲要引用可以采用与上面针对示例锁206所描述的类似方式而可扩展至高速缓存感知纲要引用。如同锁之类的纲要引用可以采用共享方式或独家方式来获得并因此可以利用与图2所示的非高速缓存感知锁206的数据结构206'相类似的数据结构来表示,以致可以针对纲要引用来收集争用统计数据212以确定何时扩展,并且扩展逻辑可以采用有效的方式来扩展纲要引用。纲要引用随后在高速缓存线争用已减弱时可以被收缩。

示例进程

图3-6将进程举例说明为逻辑流程图中的块的集合,其表示能够采用硬件、软件或其组合来实现的一系列操作。在软件的上下文中,这些块表示当由一个或多个处理器执行时执行所叙述的操作的计算机可执行指令。一般而言,计算机可执行指令包括执行特定功能或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。描述这些操作的顺序并不旨在被解释为限制,并且任何数量的所描述的块能够采用任何顺序和/或并行进行组合来实现这些进程。

图3是用于按需扩展非高速缓存感知同步原语的说明性进程300的流程图。为了讨论的目的,参考图1的多处理器计算机系统100以及图2所示的数据结构206'和206''来描述进程300。

在302,在具有共享存储器106的多处理器计算机系统100中可以提供非高速缓存感知同步原语206(例如锁)。多个线程可以针对非高速缓存感知同步原语206执行操作(例如联锁操作)来访问共享存储器106中的对象或数据结构。这些操作在多处理器系统100中可以引起高速缓存线争用。

在304,多处理器系统100的操作系统112可以确定由于针对非高速缓存感知同步原语206的操作而导致的高速缓存线争用的等级。在一些实施例中,高速缓存线争用的等级可以通过在这些操作在时间周期上的执行期间测量参数(例如循环计数)来确定。

在306,可以作出有关是否在304确定的高速缓存线争用的等级超过阈值等级的确定。在306的确定可以牵涉确定是否指示高速缓存线争用的参数的基线值被在304获取的参数的测量值超过。在一些实施例中,在306的确定可以牵涉确定是否高速缓存线争用的等级显著大于基线争用(例如高于大于基线争用的某个百分比)。

如果在306确定高速缓存线争用的等级高于阈值等级,则进程300可以前进至308,其中非高速缓存感知同步原语206被扩展至高速缓存感知同步原语206,其将共享存储器106的个别高速缓存线224分配给多处理器系统100的相应处理器102。利用进程300提供的这个按需扩展在高速缓存线争用的等级需要同步原语被扩展来改善多处理器系统100的吞吐量时扩展同步原语。

图4是用于确定是否高速缓存线争用位于触发非高速缓存感知同步原语206的扩展的等级上的说明性进程400的流程图。进程400可以是图3所示的进程300的步骤304和306的子进程。为了讨论的目的,参考图1的多处理器系统100和图2所示的数据结构206'来描述进程400。具体地,参考在非高速缓存感知锁206的数据结构206'中显示的争用统计数据212来描述进程400。

在402,可以针对非高速缓存感知同步原语206来收集争用统计数据212。在402收集的争用统计数据212可以至少包括在时间周期上针对非高速缓存感知同步原语206的操作(例如联锁操作)的执行期间采取的参数测量。在其上采取参数测量的时间周期可以利用虑及高速缓存线争用的精确评价的预定数量的测量来强行规定(dictate)。例如,在步骤402的争用统计数据212的收集可以基于在高速缓存线争用被评价之前应采取足够数量的参数的测量(例如128个测量)的约束条件。因而,可以在402采取在针对非高速缓存感知同步原语206的联锁操作(例如共享获得)的执行期间的128个循环计数测量。在一些实施例中,在402的收集可以包括在预定采样频率(例如每第16共享获得操作)上采取参数测量。以这种方式采样共享获得操作(与测量每一个共享获得或释放相对)减少每个操作处理器102成本,并且采样频率可以被调整,以提供针对性能的最小影响。

利用循环计数示例继续,如果目标是采取128个循环计数测量以便适当地评价高速缓存线争用的等级,则在402收集争用统计数据的时间周期可以对应于将针对非高速缓存感知同步原语206执行的2048个共享获得所需的时间。利用每第16共享获得之1的采样频率,这将导致采取128个循环计数的测量()。128个循环计数测量可以在图2所示的数据字段214中被总计,以保持预定数量的操作的总的循环计数,并且总的循环计数可以被存储作为不大于大约16比特的值。16比特值可以通过利用比例因子按比例缩减总的循环计数以减小其内存尺寸来实现。在一些实施例中,在402获取的总的循环计数可以被存储作为非高速缓存感知同步原语206的数据结构206'的一部分。

在404,在402测量的参数的统计值可以被计算。利用循环计数示例继续,在已采取128个循环计数测量之后,可以将数据字段214中总的循环计数值除以测量的数量(例如128个采样测量),以获取每个操作循环计数作为在404的平均值(即统计值)。如上所述,在404计算的平均值消除对于所监视的操作的子集可能发生的数据中的临时尖峰。在其他实施例中,在采取许多测量之后,采样子集的中间值可以被计算并被平均,以获取统计值作为参数的测量。

在406,在404计算的统计值可以与参数的基线值进行比较,其中基线值表示在没有高速缓存线争用的情况下执行这些操作时参数的值。在循环计数示例中,可以在多处理器系统100的启动时间上采取循环计数测量,以确定在共享存储器106中在给定高速缓存线上的无争用联锁操作成本的基线值。可供选择地,基线循环计数可以在共享存储器106中静态地被硬编码,或者它可以由多处理器系统100的管理员来配置。在406,来自步骤404的每个操作循环计数可以与这个基线循环计数进行比较,而如果来自步骤404的每个操作循环计数显著高于无争用的基线值(例如高于超过25%),这可以触发非高速缓存感知同步原语206的扩展。如果基于在406的比较而没有触发扩展,可以针对下一个测量周期来重置争用统计数据212。

图5是用于扩展非高速缓存感知同步原语206的更详细说明性进程500的流程图。进程500可以是图3所示的进程300的步骤308的子进程。为了讨论的目的,参考图1的多处理器系统100和图2所示的数据结构206'来描述进程500。具体地,参考在图2的数据结构206'和206''中显示的争用统计数据212来描述进程400。

在502,当已确定非高速缓存感知同步原语206将被扩展时,线程可以尝试通过设置在非高速缓存感知同步原语206的数据结构206'内保持的转换比特t来扩展非高速缓存感知同步原语206。在502上t比特的设置在一些情况下可以发生在至少一个线程基于来自至少一个线程的共享获得而正在持有非高速缓存感知同步原语的同时。

在504,依据每个处理器/节点状态在多处理器系统100的共享存储器106中分配高速缓存线224。例如,可以如在图2的数据结构206''中所示来分配高速缓存线224。

在506,一旦成功分配高速缓存线224,设置t比特的线程可以清除t比特。在508,线程可以设置在非高速缓存感知同步原语206的数据结构206'内保持的扩展比特e。

图6是用于收缩高速缓存感知同步原语206的说明性进程600的流程图。为了讨论的目的,参考图1的多处理器系统100和图2所示的数据结构206''来描述进程600。

在602,可以作出有关是否自从高速缓存感知同步原语206被扩展以来时间周期已流逝的确定。如果否的话,多处理器系统100的操作系统112可以继续在604等待,直至时间周期已流逝。一旦自从高速缓存感知同步原语206的扩展以来时间周期已流逝,高速缓存感知同步原语可以被识别为用于在606收缩的候选者。

在608,可以作出有关是否具有任何“飞行中”线程(即将要获得高速缓存感知同步原语的数据结构206''的分配的高速缓存线224的线程)的确定。在608上的这个确定可以基于个别线程的线程局部比特或者基于检查每个处理器树中的进行中的锁获得的列表。如果在608检测到一个或多个飞行中线程,操作系统112可以在步骤610制止收缩高速缓存感知同步原语206。如果没有飞行中线程在608被检测到,操作系统112可以在步骤612检查以查看是否具有任何的线程当前持有高速缓存感知同步原语206。如果是这样的话,操作系统可以继续在610制止收缩同步原语。

如果没有飞行中线程并且没有线程持有高速缓存感知同步原语206,同步原语可以被收缩至非高速缓存感知形式。在614上的收缩可以包括解放多处理器系统100的共享存储器106中的分配的高速缓存线224。

在本文描述的环境和个别元素当然可以包括许多其他的逻辑、程序和物理组件,其中在附图中所显示的那些仅仅是与本文的讨论相关的示例。

其他的体系结构可以用于实现所描述的功能并且旨在位于这个公开的范畴之内。此外,虽然上面为了讨论的目的而定义具体的责任的分布,但是各种功能和责任可能采用不同的方式来分布和划分,这取决于环境。

示例一:一种方法,包括:在具有共享存储器的多处理器计算机系统中提供非高速缓存感知同步原语(例如锁、纲要引用、自旋锁、互斥锁等等);确定由于针对非高速缓存感知同步原语的操作(例如联锁操作)而导致的高速缓存线争用的等级;以及响应于确定高速缓存线争用的等级满足或超过阈值,将非高速缓存感知同步原语变成将共享存储器的个别高速缓存线分配给多处理器计算机系统的相应处理器的高速缓存感知同步原语。

示例二:示例一的方法,其中确定高速缓存线争用的等级包括:在这些操作的执行期间测量参数,该参数至少包括循环计数、interlockedcompareexchange重试的数量或操作的频率之一。

示例三:独自或组合中的任何先前示例的方法,其中确定高速缓存线争用的等级包括:收集非高速缓存感知同步原语的统计数据,这些统计数据包括在时间周期上在针对非高速缓存感知同步原语的操作的执行期间采取的参数(例如循环计数、interlockedcompareexchange重试的数量或操作的频率)的测量;以及至少部分基于所收集的统计数据来计算参数的统计值(例如平均值、中间值、模式、最小值、最大值等等),其中确定高速缓存线争用的等级满足或超过阈值包括将参数的统计值与参数的基线值进行比较,其中基线值表示在没有高速缓存线争用的情况下执行这些操作时该参数的值。

示例四:独自或组合中的任何先前示例的方法,其中收集统计数据包括:确定是否上下文切换已发生在这些测量之中的个别测量期间;以及如果上下文切换已发生在特定测量期间,从所收集的统计数据中丢弃特定测量。

示例五:独自或组合中的任何先前示例的方法,其中从在时间周期上执行的操作的采样子集中采取这些测量。

示例六:独自或组合中的任何先前示例的方法,其中参数的基线值至少以下之一:(i)通过在多处理器计算机系统的启动时间上在这些操作之中的一个或多个操作的执行期间测量参数来计算,(ii)在多处理器计算机系统内静态地被硬编码;或者(iii)由多处理器计算机系统的管理员来配置。

示例七:独自或组合中的任何先前示例的方法,其中这些统计数据进一步包括:在时间周期上非高速缓存感知同步原语的独家获得的数量或独家释放的数量;以及在时间周期上非高速缓存感知同步原语的共享获得的数量或共享释放的数量,其中扩展以独家获得或释放的数量与共享获得或释放的数量之比率低于阈值比为条件。

示例八:独自或组合中的任何先前示例的方法,其中非高速缓存感知同步原语是锁。

示例九:独自或组合中的任何先前示例的方法,其中这些操作包括与非高速缓存感知同步原语的获得或释放相关联的联锁操作。

示例十:独自或组合中的任何先前示例的方法,其中扩展包括:设置非高速缓存感知同步原语的转换状态(例如设置转换比特);将共享存储器的个别高速缓存线分配给多处理器计算机系统的相应处理器;以及将转换状态变成非高速缓存感知同步原语的扩展状态(例如设置扩展比特)。

示例十一:独自或组合中的任何先前示例的方法,其中设置转换状态发生在至少一个线程基于来自至少一个线程的共享获得而正持有非高速缓存感知同步原语的同时。

示例十二:由多处理器系统的多个处理器之中的一个或多个处理器可执行的一种计算机可读存储器,计算机可读存储器存储非高速缓存感知同步原语的数据结构和计算机可执行指令,其中计算机可执行指令当由多处理器系统的一个或多个处理器之中的至少一个处理器执行时执行以下行动:确定由于针对非高速缓存感知同步原语的操作而导致的高速缓存线争用的等级;以及响应于确定高速缓存线争用的等级满足或超过阈值,将非高速缓存感知同步原语变成将共享存储器的个别高速缓存线分配给多处理器计算机系统的相应处理器的高速缓存感知同步原语。

示例十三:示例十二的计算机可读存储器,这些行动进一步包括:将高速缓存感知同步原语注册到扩展同步原语的共享注册表中;在自从扩展以来时间周期已流逝之后收缩高速缓存感知同步原语以便恢复至非高速缓存感知同步原语;以及从共享注册表中移除高速缓存感知同步原语。

示例十四:独自或组合中的任何先前示例的计算机可读存储器,这些行动进一步包括:在自从扩展以来时间周期已流逝之后,收缩高速缓存感知同步原语以便恢复至非高速缓存感知同步原语。

示例十五:独自或组合中的任何先前示例的计算机可读存储器,这些行动进一步包括:等待解放所分配的高速缓存线的共享存储器,直至没有线程持有高速缓存感知同步原语。

示例十六:独自或组合中的任何先前示例的计算机可读存储器,这些行动进一步包括:在多处理器计算机系统的多个处理器上执行操作系统中断;以及检查是否具有任何的线程持有高速缓存感知同步原语。

示例十七:独自或组合中的任何先前示例的计算机可读存储器,这些行动进一步包括:确定是否任何的线程是高速缓存感知同步原语的分配的高速缓存线的待定获得,该确定至少部分基于:(i)检查针对这些线程之中的个别线程的进行中的锁获得的列表;或者(ii)检查是否针对这些线程之中的个别线程设置线程局部比特;以及如果该确定指示具有将要获得高速缓存感知同步原语的分配的高速缓存线的至少一个线程,制止收缩。

示例十八:独自或组合中的任何先前示例的计算机可读存储器,其中收缩进一步以多处理器计算机系统上的高速缓存感知同步原语的数量超过高速缓存感知同步原语的阈值数量为条件。

示例十九:独自或组合中的任何先前示例的计算机可读存储器,这些行动进一步包括:在收缩之前,收集高速缓存感知同步原语的统计数据,这些统计数据包括:在时间周期上高速缓存感知同步原语的独家获得的数量或独家释放的数量;以及在时间周期上高速缓存感知同步原语的共享获得的数量或共享释放的数量,其中收缩进一步以共享获得或释放的数量与独家获得或释放的数量之比率低于阈值比为条件。

示例二十:独自或组合中的任何先前示例的计算机可读存储器,其中高速缓存感知同步原语的共享获得或共享释放的数量依照高速缓存感知同步原语的高速缓存线来保持。

示例二十一:独自或组合中的任何先前示例的计算机可读存储器,这些行动进一步包括:在收缩之前,收集高速缓存感知同步原语的统计数据,这些统计数据包括在时间周期上高速缓存感知同步原语的独家获得的数量或独家释放的数量,以及其中收缩进一步以独家获得或释放的数量高于独家获得或释放的阈值数量为条件。

示例二十二:独自或组合中的任何先前示例的计算机可读存储器,这些行动进一步包括:在收缩之前:收集非高速缓存感知同步原语的共享获得的比率或共享释放的比率的预扩展(pre-expansion)统计数据;以及收集高速缓存感知同步原语的共享获得的比率或共享释放的比率的后扩展统计数据,其中收缩进一步以以下为条件:与预扩展统计数据中的共享获得或共享释放的比率相比而言,后扩展统计数据指示高速缓存感知同步原语的共享获得或共享释放的较低比率。

示例二十三:独自或组合中的任何先前示例的计算机可读存储器,这些行动进一步包括:在收缩之前,如果高速缓存感知同步原语是分页的同步原语,则将高速缓存感知同步原语钉到共享存储器中的位置。

示例二十四:一种多处理器系统,包括:多个处理器;以及包括由多个处理器可访问的多个高速缓存线的共享存储器,共享存储器存储操作系统和非高速缓存感知同步原语的数据结构,其中操作系统包括逻辑来执行以下行动:确定由于针对非高速缓存感知同步原语的操作而导致的高速缓存线争用的等级;以及响应于确定高速缓存线争用的等级满足或超过阈值,将非高速缓存感知同步原语变成高速缓存感知同步原语,其中高速缓存感知同步原语将共享存储器的高速缓存线之中的个别高速缓存线分配给多个处理器之中的相应处理器。

示例二十五:示例二十五的多处理器系统,其中确定高速缓存线争用的等级包括在这些操作的执行期间测量参数,该参数至少包括循环计数、interlockedcompareexchange重试的数量或操作的频率之一。

示例二十六:独自或组合中的任何先前示例的多处理器系统,其中该逻辑进一步被配置成使用比例因子来按比例缩小所测量的参数,以及其中非高速缓存感知同步原语的数据结构被配置成存储按比例缩小的参数。

示例二十七:独自或组合中的任何先前示例的多处理器系统,其中按比例缩放的统计数据被存储作为不大于大约32比特的数据值。

示例二十八:一种多处理器系统,包括:用于执行计算机可执行指令的装置(例如处理器,例如,其包括硬件处理器诸如中央处理单元(cpu)、片上系统(soc)等等);以及用于存储计算机可执行指令的装置(例如存储器、计算机可读存储媒体诸如ram、rom、eeprom、闪存等等),用于存储的装置包括利用用于执行计算机可执行指令的装置可访问的多个高速缓存线并且存储操作系统和非高速缓存感知同步原语的数据结构,其中操作系统包括逻辑来执行以下行动:确定由于针对非高速缓存感知同步原语的操作而导致的高速缓存线争用的等级;以及响应于确定高速缓存线争用的等级满足或超过阈值,将非高速缓存感知同步原语变成高速缓存感知同步原语,其中高速缓存感知同步原语将用于存储计算机可执行指令的装置的高速缓存线之中的个别高速缓存线分配给用于执行计算机可执行指令的装置之中的相应装置。

结论

最后,虽然以特定于结构特性和/或方法行动的语言描述了各种实施例,但是将明白:在所附的表示中定义的主题不一定限于所描述的具体特性或行动。相反,这些具体特性和行动被公开作为实现所请求保护的主题的示例形式。

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