在事务存储器系统中高效地定位事务代码块的制作方法

文档序号:6477444阅读:97来源:国知局

专利名称::在事务存储器系统中高效地定位事务代码块的制作方法在事务存储器系统中髙效地定位事务代码块背景软件事务存储器(STM)是类似于数据库事务的、用于在并发计算中控制对共享存储器的访问的并发控制机制。事务存储器的上下文中的事务是执行对共享存储器的一系列读取和写入的代码片段。STM用作传统锁定机制的替换。程序员在代码块周围放置声明性注释(例如,原子的)以指示这些代码块所需要的安全特性,并且系统自动保证该块相对于其它受保护的代码区域原子地执行。软件事务存储器编程模型防止了基于锁的优先级倒置和死锁问题。软件事务存储器(STM)系统可以接受某些顺序程序并且允许使用事务来同时(例如并行地)执行这些程序的各部分。这些顺序程序的源代码通常是由程序员通过使用各种类型的编程语言中的一种来编写。源代码通常被封装在包含稍后由计算机执行的逻辑的一个或多个函数中。此处宽泛地使用术语"函数"来涵盖函数、方法、过程、语句块和/或由计算机执行的逻辑的其它部分。有了软件事务存储器系统,可根据事务上下文来调用的每一个函数都必须具有两个版本,一个可根据事务来调用的版本和一个可根据非事务来调用的版本。确定要调用函数的哪一个版本是上下文相关的。该确定必须在对虚函数的调用的运行时或通过函数指针来完成。概述公开了用于在事务存储器系统中创建和/或定位事务代码块的各种技术和方法。诸如软件开发者等用户可以用标识符来装饰特定函数以便指示该特定函数是事务安全的。然后创建软件应用程序中的被标记为事务安全的每一个函数的普通版本和事务版本。创建未被标记为事务安全的每一个函数的普通版本。对于被标记为事务安全的每一个函数的普通版本,普通版本中的存根指针(stubpointer)指向事务版本。然后取决于应用程序上下文来调用函数的适当的版本。在一个实现中,编译器生成函数的事务和非事务版本以便与事务存储器系统一起使用。在编译时,为软件应用程序中的每一个函数分配存根指针。对于未被标记未事务安全函数的每一个相应的函数,生成相应函数的普通版本,并且用运行时出错处理例程的入口点来填充存根指针。对于被标记为事务安全函数的每一个相应5的函数,创建是事务安全的相应函数的普通版本和事务版本的代码。然后,在普通版本的存根指针中,填充到事务版本的入口点。在事务版本的存根指针,填充到运行时出错处理例程的入口点。提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的一些概念。本概述不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。附图简述图1是一个实现的计算机系统的图示。图2是在图1的计算机系统上操作的一个实现的事务存储器应用程序的图示。图3是图1的系统的一个实现的高级处理流程图。图4是图1的系统的一个实现的处理流程图,其示出了作为编译和/或链接过程的一部分的、在使用代码生成器来生成事务和非事务函数的代码并填充存根指针时所涉及的各阶段。图5是图1的系统的一个实现的示图,其示出了用于取决于执行上下文来选择要调用的函数的适当的版本的决策树。图6是一个实现的逻辑图,其示出了两个假想函数,一个仅具有普通版本而另一个具有普通版本和事务版本。详细描述为促进对本发明的原理的理解,现将对附图中所示的各实施例加以参考,同时也将用具体语言描述它们。不过,需要理解的是,并无意由此作出范围上的限制。对所述实施例的任何改变和进一步更改,以及在此所述的原理的进一步应用都可以预期将是本领域技术人员通常能想到的。本系统可以在一般上下文中被描述为事务存储器系统,但是本系统还用于除此之外的其它目的。在一个实现中,此处所描述的一个或多个技术可被实现为诸如微软⑧.NET框架等框架程序内的、或来自为开发者提供开发软件应用程序的平台任何其它类型的程序或服务的特征。在另一实现中,此处所描述的一个或多个技术被实现为涉及开发在并发环境中执行的应用程序的其它应用程序的特征。在一个实现中,提供了通过编程创建被标记为事务安全的每一个函数的以下两个版本的事务存储器系统函数的普通版本和函数的事务版本。对于未被标记为事务安全的函数,仅创建普通版本并且该普通版本的入口点处的存根指针指向出错处理例程。然后,对于被标记为事务安全的函数,普通版本的入口点的存根指针指向函数的事务版本。该事务版本的入口点处的存根指针指向出错处理例程。对于未被标记为事务安全的函数,普通版本的入口点处的存根指针指向出错处理例程。然后取决于执行上下文来调用函数的适当的版本。如图1所示,用于实现本系统的一个或多个部分的示例性计算机系统包括诸如计算设备100等计算设备。在其最基本的配置中,计算设备100通常包括至少一个处理单元102和存储器104。取决于计算设备的确切配置和类型,存储器104可以是易失性的(如RAM)、非易失性的(如ROM、闪存等)或是两者的某种组合。该最基本配置在图1中由虚线106来示出。另外,设备100还可具有附加特征/功能。例如,设备100还可包含附加存储(可移动和/或不可移动),包括但不限于磁盘、光盘或磁带。这样的附加存储在图1中由可移动存储108和不可移动存储110示出。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现的易失性和非易失性、可移动和不可移动介质。存储器104、可移动存储108和不可移动存储110都是计算机存储介质的示例。计算机存储介质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光存储、磁带盒、磁带、磁盘存储或其它磁存储设备、或者可用于存储所需信息并且可由设备100访问的任何其它介质。任何这样的计算机存储介质都可以是设备100的一部分。计算设备100包括允许计算设备100与其它计算机/应用程序115进行通信的一个或多个通信连接114。设备100还可以具有诸如键盘、鼠标、笔、语音输入设备、触摸输入设备等输入设备112。还可以包括诸如显示器、扬声器、打印机等输出设备lll。这些设备在本领域中公知且无需在此处详细讨论。在一个实现中,计算设备100包括事务存储器应用程序200。事务存储器应用程序200将在图2中更详细地描述。现在转向图2,并继续参考图l,示出了在计算设备100上操作的事务存储器应用程序200。事务存储器应用程序200是驻留在计算设备100上的应用程序中的一个。然而,可以理解,事务存储器应用程序200可另选地或另外地被具体化为一个或多个计算机上的计算机可执行指令和/或与图1所示的不同的变型。另选地或另外地,事务存储器应用程序200的一个或多个部分可以是系统存储器104的一部7分、可以在其它计算机和/或应用程序115上、或可以是计算机软件领域的技术人员能想到的其它此类变型。事务存储器应用程序200包括负责实现此处所描述的技术中的部分或全部的程序逻辑204。程序逻辑204包括用于提供事务存储器系统的逻辑206;用于允许用户/开发者用属性或其它标识符来装饰软件应用程序的函数以指示函数是事务安全的逻辑208;用于创建被标记为事务安全的每一个函数的两个版本(例如普通版本和事务版本)的逻辑210;用于创建未被标记为事务安全的每一个函数的一个版本(例如普通版本)的逻辑212;用于为每一个函数分配存根指针(例如,在代码部分的开头之前或其它位置)的逻辑214;用于使存根指针指向正确位置(例如事务版本或运行时出错处理例程)的逻辑216;以及用于操作应用程序的其它逻辑220。在一个实现中,程序逻辑204可用于通过编程,如使用对程序逻辑204中的过程的单一调用而从另一程序调用。现在转向图3-6并继续参考图1-2,更详细地描述了用于实现事务存储器应用程序200的一个或多个实现的各阶段。图3是事务存储器应用程序200的高级处理流程图。在一种形式中,图3的过程至少部分地在计算设备100的操作逻辑中实现。该过程在起始点240处开始,在那里提供事务存储器系统(例如,软件事务存储器系统)(阶段242)。系统允许用户/开发者用属性或其它标识符来装饰特定的函数以指示该函数是事务安全的(阶段244)。编译器和/或链接器创建该特定函数的两个版本一个不用于事务的版本(例如普通版本)和一个用于事务的版本(例如事务版本)(阶段246)。在普通版本中,系统存储指向特定函数的事务版本的存根指针(阶段248)。在一个实现中,此处所描述的存根指针被存储在相应的经编译的函数体文本之前。在其他实现中,存根指针可以被存储在其它位置中,只要它与函数的相应版本相关联。在事务版本中,系统存储指向运行时出错处理例程的存根指针(阶段249)。取决于执行上下文来调用函数的适当的版本(阶段250)。该过程在结束点252处结束。图4示出了作为编译和/或链接过程的一部分的在使用代码生成器来生成事务和非事务函数的代码并填充存根指针时所涉及的各阶段的一个实现。在一种形式中,图4的过程至少部分地用计算设备100的操作逻辑来实现。该过程在起始点270处开始,在那里代码生成器在编译时为每一个函数分配额外的指针(例如存根指针)(阶段272)。对于每一个函数(即,在存在更多函数时)(判定点274),执行各种任务。例如,如果函数未被标记为事务安全函数(判定点276),则系统运行时出错处理例程的入口点来填充该普通版本的存根指针(阶段286)。如果函数被标记为事务安全函数(判定点276),则系统创建普通版本F及其事务版本FT的代码(阶段278)。系统然后为函数F的事务版本和普通版本分配存根指针(阶段280)。在普通版本的存根指针中,填充事务版本的入口点(阶段282)。在事务版本的存根指针中,填充运行时出错处理例程的入口点(阶段284)。为每一个函数适当地重复这些阶段。然后,对于每一个调用点,系统取决于上下文来作出适当的调用(阶段288)。该调用点判定过程在图5中更详细地描述。该过程在结束点处290结束。现在转向图5,图1的系统的一个实现的示图300示出了用于取决于执行上下文来选择要调用的函数的适当版本的可能的决策树。在一种形式中,图5的判定过程至少部分地用计算设备100的操作逻辑来实现。对于非事务上下文302中的直接调用306,直接调用函数的普通版本的入口点312。对于事务上下文304中的直接调用306,调用函数的事务版本的入口点314。对于非事务上下文302中的指针调用308,调用与之前相同316。对于事务上下文304中的指针调用308,通过解除函数指针值的引用来计算指向存根函数(stubfunction)的单词的地址并然后在调用中使用该地址318。用指向事务版本的入口点的指针来填充该存根函数并且由此执行正确的版本。非事务上下文302中的虚或接口调用310不受影响,并且与之前相同320。事务上下文304中的虚或接口调用310执行虚表查找(vtableLookup),并且然后计算函数的事务版本的存根函数入口点322。然后使用计算出的入口点来作出调用。图6是一个实现的逻辑图400,其示出了两个假想函数,一个仅具有普通版本而另一个具有普通版本和事务版本。"BAR"函数402是在源代码中未被标记为事务安全的函数。由此,函数402的入口指针412指向出错处理例程410。"FOO"函数414在原始源代码中被标记为事务安全的,因此提供经普通编译的版本(普通版本)406以及事务版本408。FOO406的普通版本的入口点414指向FOO的事务版本408。FOO的事务版本408的入口点416指向出错处理例程410。在一个实现中,该出错处理例程被嵌入在这些函数的存根(入口点)中以便允许在遇到不适当的使用时在运行时捕捉错误。尽管用对结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述具体特征或动作。相反,上述具体特征和动作是作为实现权利要求的示例形式公开的。落入在此所述和/或所附权利要求所描述的实现的精神的范围内的所有等效方案、更改和修正都期望受到保护。例如,计算机软件领域普通技术人员会认识到在此讨论的示例中所述的客户机和/或服务器布置、用户界面屏幕内容、和/或数据布局可在一台或多台计算机上不同地组织,以包括比示例中所描绘的更少或更多的选项或特征。权利要求1.一种具有用于使得计算机执行以下步骤的计算机可执行指令的计算机可读介质,所述步骤包括提供事务存储器系统(206);创建软件应用程序中的被标记为事务安全的每一个函数的普通版本和事务版本(210);创建未被标记为事务安全的每一个函数的普通版本(212);以及对于被标记为事务安全的每一个函数的普通版本,使所述普通版本的存根指针指向所述事务版本(216)。2.如权利要求1所述的计算机可读介质,其特征在于,所述存根指针被分配在每一个函数的普通版本的代码部分之前(214)。3.如权利要求1所述的计算机可读介质,其特征在于,对于被标记为事务安全的每一个函数,使所述普通版本的存根指针指向出错处理例程(216)。4.如权利要求1所述的计算机可读介质,其特征在于,被标记为事务安全的每一个函数的事务版本具有指向出错处理例程的存根指针(284)。5.如权利要求1所述的计算机可读介质,其特征在于,未被标记为事务安全的每一个函数的普通版本具有指向出错处理例程的存根指针(286)。6.—种用于在事务存储器系统中定位事务代码块的方法,所述方法包括以下步骤提供事务存储器系统(242);允许用户用标识符来装饰特定函数以指示该特定函数是事务安全的(244);创建所述特定函数的两个版本,一个不用于事务的普通函数和一个用于事务的事务函数(246);以及将指向所述事务函数的存根指针存储在所述普通函数中(248)。7.如权利要求6所述的方法,其特征在于,还包括取决于执行上下文来调用所述特定函数的适当的版本(250)。8.如权利要求7所述的方法,其特征在于,如果所述执行上下文是具有对所述特定函数的直接调用的非事务上下文,则调用所述普通函数(250)。9.如权利要求7所述的方法,其特征在于,如果所述执行上下文是具有对所述特定函数的直接调用的事务上下文,则调用所述事务函数(250)。10.如权利要求7所述的方法,其特征在于,如果所述执行上下文是具有对所述特定函数的指针调用的非事务上下文,则所述指针调用照常操作(316)。11.如权利要求7所述的方法,其特征在于,如果所述执行上下文是具有对所述特定函数的指针调用的事务上下文,则通过解除函数指针值的引用来减去存根指针大小以便计算所得值,并且然后调用该所得值(318)。12.如权利要求7所述的方法,其特征在于,如果所述执行上下文是具有对所述特定函数的虚调用的非事务上下文,则所述虚调用照常操作(320)。13.如权利要求7所述的方法,其特征在于,如果所述执行上下文是具有对所述特定函数的虚调用的事务上下文,则执行虚表査找并且计算所述事务函数的存根指针的入口点,并且然后使用计算出的入口点来作出所述虚调用(322)。14.如权利要求6所述的方法,其特征在于,所述标识符是属性(244)。15.如权利要求6所述的方法,其特征在于,编译器创建所述特定函数的两个版本(246)。16.如权利要求6所述的方法,其特征在于,指向所述事务函数的存根指针被存储在所述普通函数的开头(248)。17.—种具有用于使得计算机执行如权利要求6所述的步骤的计算机可执行指令的计算机可读介质(200)。18.—种用于创建函数的事务版本和非事务版本以便在事务存储器系统中使用的方法,所述方法包括以下步骤在编译时,为软件应用程序中的多个函数中的每一个函数分配一存根指针(272);对于所述多个函数中的未被标记为事务安全的每一个相应的函数,生成非事务安全的相应函数的普通版本,并且用运行时出错处理例程的入口点来填充所述存根指针(286);以及对于所述多个函数中的被标记为事务安全的每一个相应的函数,执行包括以下步骤的过程创建是事务安全的相应函数的普通版本和事务版本的代码(278);在所述普通版本的存根指针中,填充所述事务版本的入口点(282);以及在所述事务版本的存根指针中,填充运行时出错处理例程的入口点(284)。19.如权利要求18所述的方法,其特征在于,还包括对于所述软件应用程序中的每一个函数中的每一个调用点,取决于上下文来作出适当的函数调用(288)。20.—种具有用于使得计算机执行如权利要求18所述的步骤的计算机可执行指令的计算机可读介质(200)。全文摘要公开了用于在事务存储器系统中创建和/或定位事务代码块的各种技术和方法。诸如软件开发者等用户可以用标识符来装饰特定函数以便指示该特定函数是事务安全的。接着创建软件应用程序中的被标记为事务安全的每一个函数的普通版本和事务版本。创建未被标记为事务安全的每一个函数的普通版本。对于被标记为事务安全的每一个函数的普通版本,该普通版本中的存根指针指向事务版本。然后取决于执行上下文来调用该函数的适当的版本。文档编号G06F12/00GK101681293SQ200880018481公开日2010年3月24日申请日期2008年5月30日优先权日2007年6月1日发明者D·卡拉汉,V·K·格罗弗申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1