软件事务存储器中的锁的组成的制作方法

文档序号:6427474阅读:168来源:国知局
专利名称:软件事务存储器中的锁的组成的制作方法
技术领域
本发明涉及软件事务存储器中的锁的组成。
背景技术
可编写计算机程序来允许使用线程或另一合适的并行执行机制来并行地执行程序的不同部分。为了并行地执行程序的不同部分,计算机系统或程序通常包括某种机制来管理对这些不同部分的存储器访问,以确保各部分按所希望的顺序访问公共存储器位置。事务存储器系统允许程序员指定程序中的可被执行的事务,就好像这些事务隔离地执行(即独立于程序中的其他事务和其他非事务序列)。事务存储器系统通过以以下方式执行事务来管理事务的存储器访问,该方式是如果两个或更多事务试图以冲突的方式访问同一存储器位置,则事务的效果可被回滚或撤销。可使用硬件和/或软件来实现事务存储器系统。诸如软件事务存储器(STM)系统之类的事务存储器系统通常对支持的编程场景的类型有限制。例如,STM系统通常不支持事务锁和传统锁之间的互操作,或在事物内对传统锁的锁省略(elision)的使用。为了这样做,STM系统有义务允许在事物内使用传统锁而不排除同一锁保护在事物内和事务外共享状态的可能性。

发明内容
提供本发明内容是为了以简化的形式介绍将在以下具体实施方式
中进一步描述的一些概念。本概述并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。软件事务存储器(STM)系统允许基于与STM代码中的事务的同步来组成传统锁。 在事务内第一次遇到相应的传统锁获取时,STM系统获得每个传统锁,并推迟所有传统锁释放,直到事务嵌套中的顶层事务提交或中止。STM系统维护与事务中的传统锁操作相关联的状态信息,并使用该状态信息来消除冗余的被推迟的传统锁操作。STM系统与实现垃圾收集的系统集成。


包括附图来提供了对各实施例的进一步理解,且这些附图被合并在本发明书内并构成其一部分。附图示出各实施例,并且与说明书一起用于解释本发明的原理。其他实施例和各实施例的许多预期优点将随着参考下面的详细描述进行更好的理解而得到认识。附图的元素不一定相对于彼此而缩放。相同的附图标记指代对应的类似部分。图1是示出软件事务存储器系统的实施例的框图。图2A-2B是示出用于在软件事务存储器系统中处理传统锁操作的方法的实施例的流程图。图3是示出用于在软件事务存储器系统中用争用管理来处理传统锁操作的方法的实施例的流程图。图4是示出具有状态指示器的传统锁的实施例的框图。图5是示出具有状态指示器的传统锁的另一实施例的框图。图6是示出具有被配置成编译具有软件事务存储器事务的源代码的编译器的编译系统的实施例的框图。图7是示出被配置成实现软件事务存储器系统的计算机系统的实施例的框图。
具体实施例方式在以下详细描述中,对附图进行了参考,附图构成了实施例的一部分且在其中作为示例示出了可在其中实践本发明的各特定实施例。就此,诸如“顶部”、“底部”、“前方”、 “后方”、“前导”、“尾部”等的方向性术语参考正在描述的附图的方向来使用。因为实施例的各组件可位于多个不同的方向,所以方向性术语出于说明的目的来使用而不是限制。可以理解,可以使用其它实施例并且可以做出结构上或逻辑上的改变而不背离本发明的范围。 因此,以下详细描述并不旨在限制,并且本发明的范围由所附权利要求来限定。应该理解, 此处描述的各示例性实施例的特征可相互组合,除非另外具体注明。图1是示出软件事务存储器(STM)系统10的实施例的框图。STM系统10表示如图7中示出且在下文中更详细地描述的计算机系统100等计算机系统中的运行时操作模式,其中该计算机系统正在执行STM代码12的指令。如下文更详细地描述的,STM系统10 允许基于与STM事务20的同步来组成传统锁。STM系统10包括STM库14和用于执行STM代码12的运行时环境16。STM系统 10被配置成管理构成STM代码12中的原子块的STM事务20的执行,以允许事务被原子地执行,且如果需要则回滚或撤销由事务20作出的改变。为此,如由箭头36所示,对每个正在执行的事务20,STM系统10使用日志34来跟踪事务20对对象30的存储器访问。STM代码12包括一组一个或多个事务20以及任何合适的非事务代码。每个事务 20包括被设计成原子地执行的指令序列,即就好像该序列与STM代码12中的其他事务和非事务代码隔离地执行。每个事务20包括原子块命名符22,指示出STM代码12的相应部分是事务20。事务20还包括对STM原语的调用26,可由诸如图6和7中所示且在下文中更详细描述的编译器92之类的编译器添加,调用STM库14中的功能。如功能调用与返回观所指示的,STM库14的STM原语将结果返回给事务20。此外,每个事务20包括如由箭头32所示的从一个或多个对象30读取和/或写入一个或多个对象30的零个或多个存储器访问24。STM代码12可在该组事务20中包括一个或多个嵌套的事务。嵌套的事务是由另一事务20,即父事务,调用的事务20。父事务和由父事务调用或源自父事务的调用的任何事务20构成事务嵌套。STM库14包括STM原语和可由计算机系统结合运行时环境16执行的用以实现STM 系统10的指令。STM库14的可由事务20调用的STM原语可包括实现STM库14中的开始、 提交、中止、重试功能的管理原语。事务20调用开始功能以发起STM库14对事务20的管理。事务20调用提交功能以(如果成功的话)在存储器系统204中最终化事务20的结果。 事务20调用中止功能以回滚或撤销存储器系统204中事务20的结果。事务20调用重试功能以重试事务20。在其他实施例中,STM库14执行的某些或全部功能可被包括在运行时环境16中或由诸如图6和7所示的编译器92之类的编译器添加到事务20中。STM库14的可由事务20调用的STM原语还包括管理对由事务写和/或读的对象 30的访问的存储器访问原语。存储器访问原语访问每个对象30的一组一个或多个事务锁 39A。在一个实施例中,STM系统10使用对象30的对象头来存储相应的事务锁39A。每个事务锁39A指示出相应的对象30或相应的对象30的一部分对于事务20进行的写和/或读来说是锁定的还是解锁的。在一个实施例中,当对象30对于写是锁定时,相应的事务锁 39A包括在写日志34W中定位对象30的条目的地址或其他引用。当对象30对于写是解锁时,相应的事务锁39A包括对象30的版本号。对于每个非数组对象30,存储器访问原语可访问对事务20进行的写和/或读锁定或解锁非数组对象30的单个事务锁39A。对于每个数组对象30,存储器访问原语可访问一组一个或多个事务锁39A,其中该组中的每个事务锁39A对写和/或读锁定或解锁该数组对象30的相应部分。运行时环境16为每个对象30创建并管理事务锁39A。STM库14的存储器访问原语为当前正被执行的每个事务生成并管理一组一个或多个STM日志;34。在一个实施例中,每一组STM日志;34包括写日志34W和读日志!MR。每个写日志34W包括用于每个对象30的由事务20写入的条目,其中每个条目包括相应的对象30的地址、来自相应的对象30的事务锁39A的版本号、以及定位相应的对象30影子副本的地址或其他引用。每个读日志34R包括用于每个对象30的由事务20读取的条目,其中每个条目包括定位相应的对象30的事务锁39A的引用。运行时环境16可以是运行时库、虚拟机(VM)、诸如图7中所示且在下文更详细描述的OS 122所提供的功能之类的操作系统(OS)功能、和/或诸如图6和7所示且在下文更详细描述的编译器92所提供的功能之类的编译器功能的任何适当的组合。STM库14执行下列算法或其变体以执行每个事务20。每次事务20由执行线程开始时,STM库14创建并初始化用于管理事务的变量。STM库14然后允许事务20执行,以及执行如下的对对象30的任何写和/或读存储器访问。为了访问对象30进行写,事务20调用打开对象30进行写的存储器访问原语。如果锁39A可用,STM库14为事务20获得对应于对象30的事务锁39A。如果对象30不可用 (即对象30被另一事务20锁定),则STM库14检测当前事务20和该另一事务20之间的存储器访问冲突,并可发起事务执行的中止阶段以回滚并重新执行当前事务20。如果对象 30被当前事务20锁定,则STM库14已经为事务20获得了对应于对象30的事务锁39A。一旦获得了对应的事务锁39A,STM库14使得每个写访问32要么对对象30本身作出,要么对相应的对象30的影子副本(未示出)作出,并使得对应于该写访问32的条目被存储在日志34W中。对于非数组对象30,如果使用影子副本的话,影子副本可被存储在日志34W中。 对于数组对象30,如果使用共享影子副本的话,共享影子副本可与日志34W中分开存储。为了访问对象30进行读,事务20调用打开对象30进行读的存储器访问原语。如果对象30不是写锁定的且不超过悲观读锁支持的悲观读的最大数量,则STM库14使得对应于该读访问的条目被存储在读日志34R中。如果读访问是悲观读访问,则STM库14还获得对象30的事务锁39A。如果对象30被另一事务20对写访问锁定,则STM库14检测当前事务20和该另一事务20之间的存储器访问冲突,并可发起事务执行的中止阶段以回滚并重新执行当前事务20。如果对象30被当前事务20对写访问锁定,则STM库14可使得对应于该读访问的条目被存储在读日志34R中,或在写日志34W中设置对应于该对象30的标志以指示出该对象30也曾被读。STM库14使得在已打开指定对象30供事务20进行写之前发生的读访问32从相应的对象30被直接作出。STM库14使得在已打开指定对象30供事务20进行写之后发生的每个读访问32从相应的对象30被直接地作出或从相应的影子副本被作出。在事务20完成了执行或重新执行之后,STM库14执行事务执行的验证和提交阶段,以确保事务20进行的存储器访问不曾与任何其他事务20进行的存储器访问冲突。STM 库14通过验证事务20的读访问来确认没有其他事务20曾在对应于事务20的读访问被执行之后写对应于该读访问的存储器位置,来执行验证阶段。如果STM库14在验证阶段检测到当前事务20和另一事务20之间的任何存储器访问冲突,则STM库14可发起事务执行的回滚阶段,以回滚并重新执行当前事务20。STM库14通过更新由事务20用用于存储修改的影子副本修改了的任何对象30, 释放任何事务锁39A,和/或在由事务20修改了的任何对象30的事务锁39A中存储更新的版本号,来执行提交阶段。在成功执行了事务执行的验证和提交阶段之后,STM库14允许事务20完成并允许致使事务20执行的线程执行STM代码12中的另外的事务或非事务代码。SMT系统10允许基于与STM代码12中的事务20的同步来组成传统锁。除了 STM 库14使用事务锁39A对事务20提供的并发控制之外,STM代码12中的事务20和非事务代码都可对对象30获得和释放传统锁39B。尤其是,STM库14允许事务20包含被包括在 STM代码12中的非事务代码中的传统锁39B的相同传统锁获取和释放。为了允许用事务20组成传统锁39B,STM库14在事务20内第一次遇到传统锁获取时物理上获得对象30的传统锁39B。通过这样做,STM库14确保传统锁39B不能由另一线程获得,不管该另一线程正在执行事务代码还是非事务代码。然而,当在事务20内遇到对传统锁39B的传统锁释放时,STM库14继续执行事务20而不释放传统锁39B,且推迟传统锁释放直到事务执行的提交阶段。传统锁39B保持锁定直到在事务执行的提交阶段传统锁39B被释放为止。STM库14维护与事务20中的传统锁获取和释放相关联的状态信息。状态信息包括事务嵌套内遇到的对传统锁39B的操作的数量和类型。通过这样做,STM库14可在来自事务20的对传统锁39B的第二次及后续锁获取时取消对对象30的传统锁39B的传统锁获取。STM库14还可支持非平衡的情形,其中事务20仅包含传统锁获取或仅包含传统锁释放。STM库14可进一步支持复杂情形,其中事务20包含多个传统锁获取、多个传统锁释放、 或不等数量的传统锁获取和锁释放。在图1所示的一个实施例中,STM系统10使用轻量的基于键的动作框架来维护与事务20中的传统锁获取和释放相关联的状态信息。该框架包括由STM库14展示的一组统一的应用编程接口(API),该组统一的应用编程接口允许客户端(例如程序员和/或编译器)实现可由STM代码12中的事务20或事务嵌套使用特定键42来注册、查询和更新的动作40。每个动作40包括键42、状态信息44以及可被挂钩到事务执行的验证、提交、中止、 和/或回滚阶段的一组一个或多个回调46。动作40用定制的控制逻辑扩展STM系统10的内建并发控制,支持STM系统10的事务嵌套语义,以及允许与STM系统10的与垃圾收集系统一起操作的实施例进行集成。轻量的而基于键的动作框架的附加细节可在同时提交的题为“ACTION FRAMEWORK IN SOFTWARE TRANSACTIONAL MEMORY (软件事务存储器中的动作框
架),,的美国专利申请号_、代理人档案号327946. 01中找到,该申请通过引用被整
体上结合于此。在其他实施例中,STM系统10使用其他合适的编程构造来维护与事务20中的传统锁获取和释放相关联的状态信息。利用动作框架,STM库14对注册动作40的每个事务20生成动作映射47,如由箭头48所指示的。每个动作映射47包括对由STM库14响应于来自相应的事务20的动作指令27而注册的动作40的引用。STM库14用相关联的键42来将每个动作40插入在事务 20的相应动作映射47中,该键由事务20用动作指令27作为参数来提供。每个动作40中的状态信息44和回调46可基于动作指令27的类型和/或事务20用动作指令27提供的一个或多个参数。动作指令27可由程序员或诸如图6和7所示的编译器92之类的编译器添加到事务20中。STM库14使用键42来管理每个动作映射47中的动作40,而不是简单地将动作40 在列表中排队。通过这样做,STM库14允许事务20在事务20的整个执行过程中查询和更新相应的动作40。相应地,状态信息44和回调46可由事务20修改。动作40所包含的键 42、状态信息44以及回调46的组合可克服无状态的回调基础结构的局限,而这些局限不能解决某些STM编程情形。此外,对每个键42使用单个动作40可允许事务20通过避免为相同目的而添加多个回调调用来以增加的效率执行。除了将按照实例的状态与事务20相关联,STM库14还可生成将实例标识符信息与设施(facility)标识符信息相组合的键42。通过这样做,STM库14允许多个动作40向同一个设施或跨不同的设施注册,并消除了使用对象地址作为用于不同目的(例如影子副本管理和传统锁管理)的键42的动作40之间的歧义。此外,STM库14防止一个设施访问由一不同设施维护的状态(即动作40)。结果,STM库14的动作框架可以安全的方式展示给用户。STM库14的动作框架API提供了允许事务20挂钩到STM系统10中的三种类型的回调。回调包括事务阶段回调、嵌套集成回调以及资源管理和垃圾收集集成回调。如果希望特定的行为,每个动作40提供这些回调的定制实现。在一个实施例中,事务阶段回调包括OrJrepareForCommit (在准备好提交时)、 OnCommit (在提交时)以及OnRollback (在回滚时)。OnPi^pareForCommit回调发生在事务20的验证阶段期间。在验证阶段期间,STM库14检测实现Orfr印areForCommit回调46 的任何动作40,并调用任何这种回调46。OnPi^pareForCommit回调46允许事务20参与确定事务20是否提交或回滚并重新执行的验证过程。OnCommit回调46在提交阶段期间发生。在提交阶段期间,STM库14检测实现OnCommit回调46的任何动作40,并调用任何这种回调46。当事务20中止或回滚以重新执行时,OnRollkick回调46发生在回滚阶段期间。当事务20到达中止或回滚点时,STM库14检测实现OnRollkick回调46的任何动作 40,并调用任何这种回调46。在其他实施例中,事务阶段回调可包括与事务20的执行的不同阶段有关的其他回调46。STM库14的动作框架包括对动作40的嵌套语义的内建支持。事务20可用动作指令27提供karchParent (搜索父)参数,以指定当前动作40是与当前活动的最内嵌套的事务20相关联还是与整个事务嵌套相关联。与事务嵌套分层结构的紧密集成可向实现动作40的事务20提供更大的灵活性和可表达性。相应地,事务20可为它们的动作选择要么平坦要么嵌套的语义。 在一个实施例中,嵌套集成回调包括DeferToParentOnCommit (在提交时推迟到父)、DeferToParentOnAbort (在中止时推迟到父)、MergeToParent (合并到父)以及 SurviveOnRolIback (回滚时幸存)回调妨。DeferToParentOnCommit 和DeferToParentOnAbort回调40允许嵌套的事务20指定动作40是在提交时被推迟至丨J 父事务 20 (DeferToParentOnCommit and DeferToParentOnAbort)还是中止 (DeferToParentOnAbort)嵌套的事务20。对于被推迟到父事务20的动作40,STM库14在父事务20的动作映射47中插入或更新相应的动作40。MergeT0Parent回调允许嵌套的事务20指定如何将动作40的状态合并到父事务20的动作映射47中具有相同键42的动作 40 (如果有的话)中。SurviveOnRollkick 46使得在事务20回滚时动作被保持在动作映射47中,而不是被删除。在其他实施例中,嵌套集成回调可包括与嵌套的事务20有关的其他回调46。对于STM系统10的与垃圾收集驱动的语言(如C#或Java) —起工作的实施例来说,垃圾收集与STM库14的集成确保了正确性。如果STM系统10保持对由垃圾收集器管理的存储器位置的引用,则STM系统10将该引用报告给垃圾收集器,使得该应用可在垃圾收集期间被正确地更新。由于动作40可保持受管理的引用,STM库14提供了垃圾收集挂钩以使得动作40向垃圾收集器报告任何引用。在一个实施例中,资源管理和垃圾收集集成回调包括Release(释放)和 OnGC^can(在垃圾收集扫描时)回调46。Release回调46发生在提交阶段期间,其中STM 库14允许事务20释放资源。OnGC^can回调46发生在垃圾收集期间,以允许STM库14向垃圾收集器报告动作40中的引用。在其他实施例中,资源管理和垃圾收集集成回调可包括与资源管理和垃圾收集有关的其他回调46。对每个事务20,STM库14 一般对每个对象30的锁39的第一个传统锁获取或锁释放注册动作40,除非传统锁39B上发生异常或争用。图2A-2B是示出用于在STM系统10中处理传统锁操作的方法的实施例的流程图。图2A示出用于处理事务20中的对象30的传统锁39B的获取的方法的实施例。为了发起对传统锁39B的获取,事务20用参数调用STM库14中的动作指令27,参数包括对对象30的引用以及关于指令27是用于锁39的获取的指示。响应于动作指令27,STM库14 确定传统锁获取操作是否是从事务20对对象30的第一个传统锁操作(即第一个传统锁获取操作或第一个传统锁释放操作),如框50中所指示的。如果是,则STM库14试图获得传统锁39B,如框51所指示的。如果锁39B被成功获得,则如果锁39B被获得,STM库14在事务的动作映射47中为对象30注册锁互操作动作40,如框52和53所指示的。STM库14可使用对对象的引用作为键42,并在状态信息44中指示出锁39B第一次被获得。STM库14 还可初始化状态信息44中的其他信息,包括在事务20开始之前当前线程递归地获得锁39B 的次数、对象30在当前事务20以及已提交的所有嵌套的事务20内被锁定的次数、事物20 内被推迟的锁操作的数量和类型、以及对象30在被中止的嵌套的事务20中被物理锁定的次数。STM库14还注册对应于事务20的事务执行的回滚阶段的回调46,以使得在事务20 的回滚处理期间锁39B被释放。如果如框52所指示的锁39B没有被成功获得,则STM库14可基于事务20和另一事务20或STM代码12中的其他非事务代码之间的在对象30上的冲突来使得事务20回滚, 如框M所指示的。如果传统锁获取操作不是从事务20对对象30的第一个传统锁操作,如框50所指示的,那么STM库14为对象30更新锁互操作动作40中的状态信息44,如框55所指示的。 具体来说,STM库14递增在当前事务20和已提交的所有嵌套的事务20内对象30被锁定的次数,以反映当前的传统锁获取操作。图2B示出用于处理事务20中的对象30的传统锁39B的释放的方法的实施例。为了发起对锁39B的释放,事务20用参数调用STM库14中的动作指令27,参数包括对对象 30的引用以及关于指令27是用于锁39的释放的指示。响应于动作指令27,STM库14确定当前线程是否拥有锁39B,如框58所指示的。如果否,则STM库14抛出异常,如框59所指示的。如果当前线程拥有锁39B,则STM库14确定锁获取操作是否是从事务20对对象30 的第一个传统锁操作,如框60所指示的。如果是,则如果锁39B由当前线程所拥有,STM库 14在事务的动作映射47中为对象30注册锁互操作动作40,如框61所指示的。STM库14 可使用对对象的引用作为键42,在状态信息44中指示锁39B已被第一次释放,以及注册对应于事务20的事务执行的提交阶段的回调46,以使得锁释放在事务的提交处理期间发生。 STM库14还可初始化状态信息44中的其他信息,如上参考图2A所述。如果锁释放操作不是从事务20对对象30的第一个传统锁操作,如框60所指示的,那么STM库14为对象30更新锁互操作动作40中的状态信息44,如框62所指示的。具体来说,STM库14递减在当前事务20和已提交的所有嵌套的事务20内对象30被锁定的次数,以反映当前的锁释放操作。STM库14确定对于锁39B的传统锁释放的次数是否超过对于锁39B的传统锁获取的次数,如框63所指示的。为了这样做,STM库14检查状态信息 44,状态信息44标识在当前事务20开始之前当前线程递归地获得锁39B的次数、对象30 在当前事务20以及已提交的所有嵌套的事务20内被锁定的次数、事物20内被推迟的锁操作的数量和类型、以及对象30在被中止的嵌套的事务20中被物理锁定的次数。如果对于锁39B锁释放超过锁获取,则STM库14抛出异常,如框59所指示的。 STM库14执行图2A和2B的方法来使得事务20保持事务20采用的每个锁39B, 直到包括事务20的整个事务嵌套成功提交或中止为止。对锁互操作动作40的使用使得锁 39B的释放被推迟,直到整个事务嵌套成功提交或中止,即使在事务20或事务嵌套内有锁释放操作。锁互操作动作40还允许对事务嵌套中的每个锁39B执行单个物理锁操作。STM系统14在事务20的事务执行的每个阶段访问事务20的动作映射47,以标识具有与事务执行阶段相关联的回调46的动作40。响应于到达事务20的事务执行阶段, STM库14标识事务20的动作映射47中具有与该事务执行阶段相关联的回调46的每个动作40,并对动作映射47中的每个动作40,为该事务执行阶段调用所标识的回调46 (如果有的话)。STM库14使用锁互操作动作40以允许在事务20回滚或事务嵌套(即事务嵌套的顶层事务20)提交时传统锁操作被补偿。如果事务20回滚,则STM库14访问动作40以标识由事务20获得的锁39B,并调用回调46以释放锁39B。STM库14使得被回滚的事务20 所释放的任何锁39B不变。当嵌套的事务20提交时(即事务嵌套中除了事务嵌套的顶层事务20之外的事务 20),STM库14将与该嵌套的事务20的动作映射47中的与锁39B相关联的动作40合并到父事务20的动作映射47中的相应的动作40中。STM库14通过注册来自嵌套的事务20的不存在于父事务20的动作映射47中的任何动作40,并更新来自嵌套的事务20的存在于父事务20的动作映射47中的任何动作40 (即在父和嵌套的动作映射47中具有相同键42 的动作40)来合并动作40。通过这样做,STM库14更新父事务20的动作的状态以反映嵌
套的事务20所执行的锁操作,并推迟来自嵌套的事务20的任何锁释放直到顶层事务20提 、-父。通过如上所述合并来自嵌套的事务20的动作40,顶层事务20的动作映射47中的动作40包括关于事务嵌套中发生的传统锁操作的信息。如上所述,这些动作40也被初始化以包括关于顶层事务20之前的相关传统锁操作的信息。相应地,STM库14可通过忽略冗余的锁操作来优化STM系统10的性能。当事务嵌套的顶层事务20提交时,STM库14执行最少数量的被推迟的操作,以正确地设置事务嵌套所操作的每个锁39B的状态。例如,如果事务嵌套获得锁39B三次,则STM 库14获得锁39B —次并推迟其他两个锁获取。如果事务嵌套接着释放锁39B三次,则STM 库推迟这些释放,并且在提交时,确定两个锁获取被推迟且三个锁释放被推迟。相应地,STM 库14执行一个锁释放以正确地设置锁39B的状态,而不用执行额外的锁获取或锁释放。在一个实施例中,STM系统10在具有来自微软的.NET框架的计算机系统中操作。.NET框架允许程序员通过使用锁关键字来使用词法上定范围的锁,以及通过Monitor 类(监视类)上的静态方法单独地指定获取和释放。锁获取可通过Monitor. Enter、 Monitor. TryEnter> 以及 Monitor. ReliableEnter 方法来进行,而锁释放可通过 Monitor. Exit方法来进行。这些方法可导致不平衡的情形,其中事务20仅包含传统锁获取或传统锁释放。这些方法可导致更复杂的情形,其中事务包含多个传统锁获取、多个传统锁释放、或不等数量的传统锁获取和锁释放。STM系统10通过如上所述维护关于对事务嵌套内遇到的锁的操作的数量和类型的状态信息动作40来支持这些不平衡且复杂的情形。利用上述实施例,STM库14还可实现附加的争用管理算法,来增加STM系统10的性能。具体来说,可将对获取事务20内的锁调用(调用可能阻塞线程直到锁被获取)设置成确保线程不被阻塞。例如,.NET框架的Monitor. TryEnter方法可被设置有零超时。此外,STM库14可使用各种争用管理技术重试不成功的任何锁获取。图3是示出用于在STM 系统19中用争用管理算法来处理锁操作的方法的实施例的流程图。在图3的实施例中,为了发起对传统锁39B的获取,事务20用参数调用STM库14 中的动作指令27,参数包括对对象30的引用以及关于指令27是用于锁39的获取的指示。 响应于动作指令27,STM库14确定锁获取操作是否是从事务20对对象30的第一个传统锁操作,如框50所指示的且如上参考图2A所述。如果是,则STM库14确保锁获取是非阻塞的,如框69所示。在例如利用· NET框架的实施例中,STM库14可将Monitor. TryEnter方法的超时设为0。
如果锁获取操作是从事务20对对象30的第一个传统锁操作,则STM库14尝试获得锁39B,如框51所指示的。如果锁39B被成功获得,如框52中所指示的且如上参考图2A 所描述的,如果锁39B被获得,则STM库14对对象30在事务的动作映射47中注册锁互操作动作40,如框53中所指示的且如上参考图2A所描述的。如果锁39B没有被成功获得,如框52中所指示的,则STM库14调用争用管理算法来确定是否要重新尝试获得锁39B,如框72所指示的。在一个实施例中,在重新尝试不成功的情况下,在回滚事务20之前,争用管理算法重新尝试锁获取指定次数(即执行框69、 51和52的功能)。在另一实施例中,在重新尝试不成功的情况下,在回滚事务20之前,争用管理算法重新尝试锁获取指定次数,但对每个后续重新尝试引入回退延迟。回退延迟可以是恒定的或随每个连续的重新尝试而线性地或指数地增长。通过推迟传统锁释放直到事务20提交,在多个事务20争用相同一组传统锁39B 时可发生锁排序死锁问题。相应地,STM库14还可在争用管理算法中提供死锁检测和避免技术。例如,争用管理算法可跟踪事务20获得或尝试获得的所有锁39B。如果冲突的事务 20被重新执行,则STM库14可尝试立即获得冲突的事务20的锁39B,并在尝试获得锁39B 时引入某种人为顺序。通过引入人为顺序,如果多个事务20正尝试访问相同一组锁39B, 则STM库14可帮助防止死锁。此外,争用管理算法可定义生成锁获取顺序的通用方式,诸如基于对象散列代码来排序锁获取。通过这样做,STM库14可确保在事务20被重新执行时获得锁39B的事务20将不会死锁。如果在框72中争用管理算法决定不重新尝试获得锁39B,则STM库14使得事务 20回滚,如框M所指示的且如上参考图2A所描述的。如果锁获取操作不是从事务20对对象30的第一个传统锁操作,如框50所指示的,那么STM库14为对象30更新锁互操作动作40中的状态信息44,如框55所指示的且如上参考图2A所描述的。STM库14可被进一步配置成使用动作框架省略仅在事务20中发生的传统锁获取。 当线程在事务20外获得锁39B时,其他线程被防止在事务内或事务外获得该锁39B。然而, 当在事务20内作出对共享的对象30的所有操作时,STM库14可忽略传统锁39B的存在, 因为STM库14使用事务锁39A固有地在事务20之间提供隔离。相应地,STM库14跟踪传统锁39B是在事务20外被获得还是仅在事务20内被获得,以允许事务20中的锁获取被省略。在STM库14配置成省略锁获取的一个实施例中,对象30具有如图4所示的锁39B 的实施例39B’。不是仅指示出锁定或解锁状态,锁39B’包括指示出相应的对象30是空闲 (即不由任何线程使用)、被拥有(即排他性地被一个线程获得)、或被处理(transacted) (即由事务20内的一个或多个线程共享)的状态指示器82。。当非事务代码获得空闲锁39B’时,锁39B’的状态82被改变成被拥有。线程不能用事务或非事务代码获得另一线程所拥有的锁39B’。当线程释放锁39B’时,状态82回复到空闲。当在事务20内获得空闲锁时,STM库14将状态82改变成被处理。当锁39B’被处理时(即在事务20中被获得或被释放),其他线程可在事务20内而不是在事务20外获得该锁(即,用非事务代码)。当获得和释放该锁39B’的所有事务20被提交或中止时,STM 库14将状态改变回空闲。
使用图4的实施例,如果状态82是空闲的,则STM库14将事务20锁定或释放的对象30的每个锁39B’的状态82设为被处理。当注册动作40用于由事务20进行锁操作时,STM库14这样做。对于锁获取,STM库14省略实际锁获取并依赖于状态82,以确保冲突被检测到。如果锁39B’的状态82是被拥有,则STM库14或者回滚事务20或者调用争用管理算法,如上所述。除了刚才所述的省略锁获取之外,STM库14还可进一步配置成使用动作框架以及图5中所示的锁39B的实施例39B”来访问事务中的读取者/写入者锁。如图5所示,锁 39B”包括状态指示器84,该状态指示器将如上参考图4中的状态指示器82所述的空闲、被拥有或被处理状态扩展成包括被共享(即由事务20之内或之外的一个或多个线程共享)。 当锁39B”的状态84是被共享时(不是(排他性地)被拥有),多个线程可并发地事务性地或非事务性地获得锁39B”。在上述实施例中,当在事务20内访问传统锁操作时,STM系统10保留传统锁获取和锁释放语义,包括异常行为和不平衡的情形。STM系统10还为嵌套的事务和实现垃圾收集的系统维持该语义。此外,STM系统10可在事务20提交或中止时通过忽略冗余锁操作来减少被执行的传统锁操作的实际数量。此外,STM系统10可实现可增加系统10的性能
的争用管理算法。 在其他实施例中,STM库14还可使用上述的动作框架来解决一个或多个STM编程情形,例如在事务20中支持对线程本地存储器的使用,在事务20中支持静态类初始化器和模块化初始化器,以及提供定制的抽象并发控制。图6是示出具有被配置成编译具有STM事务20的源代码94的编译器92的编译系统90的实施例的框图。编译器系统90表示如图7中示出且在下文中更详细地描述的计算机系统100等计算机系统中的操作的编译模式,其中该计算机系统正在执行将代码94编译成STM代码12 的指令。在一个实施例中,编译器系统90包括结合由诸如图7中所示且在下文中更详细描述的OS 122之类的操作系统(OS)所执行的运行时环境、STM库14以及任何附加的运行库 (未示出)在计算机系统中操作的即时(JIT)编译器系统92。在另一实施例中,编译器系统90包括产生STM代码12供在同一或不同计算机系统上执行的独立编译器系统。代码94包括一组一个或多个STM事务20。每个STM事务20包括原子块命名符 22,向编译器92指示出代码94的相应部分是STM事务20。每个STM事务20可包括从对象30进行读和/或对对象30进行写的零个或多个存储器访问M。每个STM事务20还可包括生成、查询或更新动作40的零个或多个动作指令27 (未示出)。代码94可以是用诸如 Java或0#之类的语言或诸如公共中间语言(CIL)、微软中间语言(MSIL)或Java字节码之类的任何合适的字节码来编写的任何合适的源代码。编译器92访问或以其他方式接收具有包括存储器访问M的事务20的代码94。 编译器92标识存储器访问M并将代码94编译成对每个存储器访问M具有STM库14中的STM原语的调用沈的STM代码12。编译器92还可标识可在其中使用动作40的实例, 并将代码94编译成对其中可使用动作40的每个实例具有动作指令27的STM代码12。编译器92执行代码94的指令集到可由指定的计算机系统执行的一组指令的任何所希望的转换,并将该组指令包括在STM代码12中。
12
图7是示出被配置成实现STM系统10的计算机系统100的实施例的框图。计算机系统100包括一个或多个处理器封装102、存储器系统104、零个或更多输入/输出设备106、零个或更多显示设备108、零个或更多外围设备110、和零个或更多网络设备112。处理器封装102、存储器系统104、输入/输出设备106、显示设备108、外围设备 110和网络设备112使用包括任何合适的类型、数量和配置的控制器、总线、接口、和/或其他有线或无线连接的一组互连114来进行通信。计算机系统100表示出于通用或专用目的而配置的任何合适的处理设备。计算机系统100的示例包括服务器、个人计算机、膝上型计算机、图形输入板计算机、个人数字助理(PDA)、移动电话、和音频/视频设备。计算机系统100的组件(即,处理器封装102、存储器系统104、输入/输出设备106、显示设备108、外围设备110、网络设备112和互连114) 可包含在公共外壳(未示出)中或任何合适数量的独立外壳(未示出)中。处理器封装102各自可包括一个或多个执行核。每个执行核被配置成访问并执行存储在存储器系统104中的指令。指令可包括基本输入输出系统(BI0Q或固件(未示出)、操作系统(0S)122、STM代码12、STM库14、运行时环境16、编译器92以及代码94。每一执行核可结合或响应于从输入/输出设备106、显示设备108、外围设备110、和/或网络设备112接收到的信息来执行指令。计算机系统100引导并执行OS 122。OS 122包括可由执行核执行来管理计算机系统100的组件并提供允许程序访问并使用这些组件的一组功能的指令。OS 122执行运行时环境16以允许STM代码12和STM库被执行。在一个实施例中,OS 122是Windows操作系统。在其他实施例中,OS 122是适于和计算机系统100—起使用的另一操作系统。计算机系统100执行编译器92来从代码94生成STM代码12。编译器92访问或以其他方式接收代码94,并将代码94转换成STM代码12供计算机系统100执行。编译器 92执行代码94的指令集到可由计算机系统100执行的一组指令的任何所希望的转换,并将该组指令包括在STM代码12中。编译器92还从事务命名符22标识代码94中的块20,并修改STM代码12中的块20以包括对STM原语沈的调用。在一个实施例中,编译器92包括结合OS 122、运行时环境16以及STM库14在计算机系统100中操作的即时(JIT)编译器。在另一实施例中,编译器92包括产生STM代码 12供在计算机系统100或另一计算机系统(未示出)上执行的独立编译器。计算机系统100执行运行时环境16和STM库14来允许STM代码12以及其中的事务20如上所述地在计算机系统100中被执行。存储器系统104包括被配置成存储指令和数据的任何合适的类型、数量和配置的易失性或非易失性存储设备。存储器系统104的存储设备表示存储包括STM代码12、STM 库14、运行时环境16、0S 122、编译器92以及代码94的计算机可执行指令的计算机可读存储介质。指令可由计算机系统100执行来执行如此处所述的STM代码12、STM库14、运行时环境16、OS 122、编译器92以及代码94的功能和方法。存储器系统104存储从处理器封装102、输入/输出设备106、显示设备108、外围设备110和网络设备112接收的指令和数据。存储器系统104将存储的指令和数据提供给处理器封装102、输入/输出设备106、 显示设备108、外围设备110和网络设备112。存储器系统104中的存储设备的示例包括硬盘驱动器、随机存取存储器(RAM)、只读存储器(ROM)、闪存驱动器和卡、以及诸如磁盘和CD和DVD之类的光盘。输入/输出设备106包括被配置成将指令或数据从用户输入到计算机系统100并将指令或数据从计算机系统100输出到用户的任何合适的类型、数量和配置的输入/输出设备。输入/输出设备106的示例包括键盘、鼠标、触摸垫、触摸屏、按钮、拨盘、旋钮和开关。显示设备108包括被配置成向计算机系统100的用户输出文本和/或图形信息的任何合适的类型、数量和配置的显示设备。显示设备108的示例包括监视器、显示屏和投影仪。外围设备110包括被配置成用计算机系统100中的一个或多个其他组件来操作以执行通用或专用处理功能的任何合适的类型、数量和配置的外围设备。网络设备112包括被配置成允许计算机系统100通过一个或多个网络(未示出) 进行通信的任何合适的类型、数量和配置的网络设备。网络设备112可根据任何合适的网络协议和/或配置来操作以允许计算机系统100将信息发送给网络或者从网络接收信息。尽管此处说明并描述了具体实施例,但本领域技术人员可以理解,可用各种替换和/或等价实现来替换此处示出并描述的具体实施例而不背离本发明的范围。本申请旨在覆盖此处讨论的具体实施例的任何改编或变型。因此,本发明旨在仅由权利要求书及其等效方案来限制。
权利要求
1.一种由软件事务存储器(STM)系统(10)在计算机系统(100)中执行的方法,所述方法包括检测从STM系统执行的第一事务00)对对应于对象(30)的传统锁(39B)的锁释放操作;以及推迟所述锁释放操作,直到所述第一事务提交。
2.如权利要求1所述的方法,其特征在于,进一步包括响应于确定执行所述第一事务的线程不拥有所述传统锁而抛出异常。
3.如权利要求1所述的方法,其特征在于,进一步包括在检测所述锁释放操作之前检测对应于所述传统锁的锁获取操作;以及响应于所述锁获取操作是从所述第一事务对所述对象的第一个锁操作,尝试对所述传统锁的获取。
4.如权利要求3所述的方法,其特征在于,进一步包括响应于所述锁获取操作不是从所述第一事务对所述对象的第一个锁操作,更新对应于所述传统锁的信息而不获得所述传统锁。
5.如权利要求1所述的方法,其特征在于,进一步包括响应于锁释放操作是从所述第一事务对所述对象的第一个释放锁操作,用对应于所述对象的键和对应于事务执行的提交阶段的回调来注册对应于所述锁释放操作的动作。
6.如权利要求1所述的方法,其特征在于,进一步包括响应于锁释放操作不是从所述第一事务对所述对象的第一个释放锁操作,用对应于所述对象的键和对应于事务执行的提交阶段的回调来更新对应于所述锁释放操作的动作。
7.如权利要求1所述的方法,其特征在于,进一步包括响应于锁获取操作是从所述第一事务对所述对象的第一个释放锁操作,用对应于所述对象的键和对应于事务执行的回滚阶段的回调来注册对应于所述锁获取操作的动作。
8.如权利要求1所述的方法,其特征在于,进一步包括响应于所述第一事务提交,将对应于所述锁释放操作的第一动作合并到对应于第二事务的动作映射中,所述第二事务是所述第一事务的父事务。
9.一种存储计算机可执行指令的计算机可读存储介质(104),所述计算机可执行指令在由计算机系统(100)执行时执行一种方法,所述方法包括检测从软件事务存储器(STM)系统(10)执行的第一事务00)对对应于对象(30)的传统锁(39B)的锁获取操作;以及响应于所述锁获取操作是从所述第一事务对所述对象的第一个锁操作,尝试对所述传统锁的获取;响应于所述锁获取操作不是从所述第一事务对所述对象的第一个锁操作,更新对应于所述传统锁的信息而不获得所述传统锁;检测来自所述STM系统执行的所述第一事务的对应于所述传统锁的锁释放操作;以及推迟所述锁释放操作,直到所述第一事务提交。
10.如权利要求9所述的计算机可读存储介质,其特征在于,所述方法进一步包括响应于所述锁释放操作,响应于来自执行所述第一事务的线程的锁释放操作的第一数量超过来自所述线程的锁获取操作的第二数量,抛出异常。
全文摘要
本发明涉及软件事务存储器中的锁的组成。软件事务存储器(STM)系统允许基于与STM代码中的事务的同步来组成传统锁。在事务内第一次遇到相应的传统锁获取时,STM系统获得每个传统锁,并推迟所有传统锁释放,直到事务嵌套中的顶层事务提交或中止。STM系统维护与事务中的传统锁操作相关联的状态信息,并使用该状态信息来消除冗余的被推迟的传统锁操作。STM系统与实现垃圾收集的系统集成。
文档编号G06F9/52GK102289393SQ20111017901
公开日2011年12月21日 申请日期2011年6月20日 优先权日2010年6月21日
发明者C·D·卡拉罕二世, D·L·德特勒夫斯, D·格罗夫, L·张, M·M·马格鲁德, S·S·索迪, W·朱, Y·莱瓦诺尼 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1