专利名称:对事务存储器中的副作用动作的事务处理的制作方法
对事务存储器中的副作用动作的事务处理背景用于共享存储器多处理器的并发编程可以包括供多个线程访问相同数据的能力。 该多个线程在多个处理器、多个处理器核心或附连到在处理器之间共享的存储器的其他种类的并行性上执行。共享存储器模型是最常部署的多线程通信方法。它允许以与顺序编程大致相同的方式创建多线程程序,这是有益的,因为并发编程本身是出了名地困难。为了实现共享存储器模型,并发编程小心地避免可能造成诸如竞争等不合需要的情形的并发访问和使用共享数据。锁是避免并发访问共享数据问题的一种常见解决方案。锁是以下面的前提为中心的由一个线程访问的变量将也可由其他线程访问,并且由此变量一次次只能由一个线程使用。锁允许一个线程控制变量而防止其他线程改变该变量直至它被解锁。虽然基于锁的协议是流行的,但是通常认为它们是难以使用的。以粗粒度的方式使用锁保护了相对较大量的数据,但是一般而言它们的使用不伸缩。线程即使在它们在不干涉时也彼此阻塞,并且锁成为争用源。或者,以更精细粒度的方式使用锁而同时缓解伸缩性问题引入了其他问题, 因为用于确保正确性并避免死锁的锁约定变得复杂且易于出错。另一解决方案是使用诸如软件事务存储器等事务存储器和/或使用编译器来实现应用程序,软件事务存储器提供软件运行时程序库和/或运行时执行环境中的语义。事务存储器是用于基于以下前提来控制对共享存储器的访问的并发控制机制由一个线程使用的变量将不太可能被其他线程访问,且由此该变量可以在不对程序的可伸缩性造成恶劣结果的情况下。基于粗糙锁的协议上的事务存储器的一个显著好处是提高的并发性。在事务存储器中,线程都无需等待访问数据,且不同的线程可以安全且同时修改数据结构中的通常在同一个锁保护下的不相交的部分。不管重试失败的事务的开销,在大多数现实的并发程序中,冲突出现得足够罕见,以使得即使在少量处理器和处理器核上在基于粗粒度锁的协议上有极大的性能增益。然而,如果原子块包括副作用动作,则可能在使用事务存储器时发生问题。一般而言,副作用动作修改在当前线程之外可见的某个状态。副作用动作的常见示例包括输入 /输出、系统调用、传统代码动作、内核动作、设备管理、托管环境之外的其他域中的动作等。 如果中止并重新执行事务就会产生困难,因为副作用动作被重新执行并且可以在重复失败时被多次重复执行。非幂等副作用造成最大的困难。例如,由于与其他线程的存储器冲突, 包括递增变量的动作和打印变量的副作用动作的原子块可以重复地失败并重新执行。在意图仅打印一次变量的情况下,在每次重新执行时打印变量是不合需要的。其他解决方案已试图解决在事务存储器中使用的副作用动作的问题。一种流行的解决方案是简单地禁止使用这种副作用动作,但是许多研究人员一般同意对可编程性以及合成的限制在一般的使用中是不可接受的。其他提议的解决方案推迟动作直至它可能要提交,但是许多研究人员相信对动作重新排序导致非预期结果。相似地,将补偿块与动作相关联减少隔离并且提供了另一隐错源。又一提议的解决方案是不允许带有副作用动作的事务失败并且有利于带有副作用动作的事务来解决所有冲突。当然,一次只允许不超过一个带有副作用动作的事务。还有一解决方案是打破事务的原子性和隔离。所有这些提议的解决方案和其他解决方案以不同的方式受到限制,并且要求程序员的很大的努力。研究人员一般同意该问题还未被解决。概述提供本概述以便以简化形式介绍将在以下详细描述中进一步描述的一些概念。本概述并不旨在标识出所要求保护的主题的关键因素或必要特征,也不旨在用于限定所要求保护的主题的范围。在一个实施例中,一种处理系统处理具有副作用动作的原子事务。该事务是具有多个线程的并发程序中的线程的一部分。该系统包括事务存储器、第一和第二资源管理器和事务管理器。第一资源管理器加入原子事务并管理与副作用动作相关的资源。第二资源管理器加入原子事务并管理事务存储器。事务管理器耦合到第一和第二资源管理器并且接收来自第一和第二资源管理器的关于是否提交事务的投票。副作用动作被延迟直至事务提交之后或者与针对该副作用动作的补偿动作一起应用。附图简述包括、合并在本发明书内并构成其一部分的附图提供了对各实施例的进一步理解。附图示出各实施例,并且与说明书一起用于解释本发明的原理。其他实施例和各实施例的许多预期优点将随着参考下面的详细描述进行更好的理解而得到认识。附图的元素不一定相对于彼此而缩放。相同的附图标记指代对应的类似部分。
图1是示出实现本发明的特征的计算设备的许多可能的示例之一的框图。图2是示出图1的示例计算系统中的示例事务系统的框图。图3是示出在图2的事务系统中使用的示例过程的流程图。详细描述在以下详细描述中,对附图进行了参考,附图构成了实施例的一部分且在其中作为示例示出了可在其中实践本发明的各特定实施例。可以理解,可以使用其它实施例并且可以做出结构上或逻辑上的改变而不背离本发明的范围。因此,以下详细描述并不旨在限制,并且本发明的范围由所附权利要求来限定。还应理解,此处描述的各示例性实施例的特征可相互组合,除非另外具体注明。图1示出了可用作操作环境并且包括诸如计算设备100之类的计算设备的是理想拿给计算机系统。在一基本配置中,计算设备100通常包括具有至少两个处理单元(即,处理器102)的处理器体系结构以及存储器104。取决于计算设备的确切配置和类型,存储器 104可以是易失性的(如随机存取存储器(RAM))、非易失性的(诸如只读存储器(ROM)、闪存等)或两者的某种组合。该基本配置在图1中由线条106来例示。该计算设备可采取若干形式中的一种或多种。这些形式包括个人计算机、服务器、手持式设备、消费电子产品能 (诸如视频游戏控制台)或其他设备。计算设备100还可具有附加特征/功能。例如,计算设备100还可包括附加存储 (可移动和/或不可移动),包括但不限于磁盘或光盘或固态存储器,或者闪速存储设备, 诸如可移动存储108和不可移动存储110。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等的任何合适的方法或技术实现的易失性和非易失性、可移动和不可移动介质。存储器104、可移动存储108和不可移动存储110都是计算机存储介质的示例。计算机存储介质包括,但不限于,RAM、R0M、EEPR0M、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁性存储设备、通用串行总线(USB)闪存驱动器、闪存卡、或能用于存储所需信息且可以由计算设备100访问的任何其它介质。任何这样的计算机存储介质都可以是计算设备100的一部分。计算设备100包括允许计算设备100与其它计算机/应用程序/用户115通信的一个或多个通信连接114。计算设备100还可包括诸如键盘、定点设备(例如,鼠标)、笔、 语音输入设备、触摸输入设备等的输入设备112。计算设备100还可包括诸如显示器、扬声器、打印机等的输出设备111。计算系统100可被配置成运行操作系统软件程序以及一个或多个软件应用程序, 这些程序构成系统平台。在一个示例中,计算系统100包括被称为托管环境的软件组件。托管环境可被包括为操作系统的一部分或者可在稍后被包括为软件下载。托管环境通常包括针对常见编程问题的预先编码的解决方案以帮助软件开发者创建诸如应用程序等在托管环境中运行的软件程序,并且该托管环境通常还包括虚拟机,该虚拟机允许软件应用程序在托管环境中运行以使得程序员不必考虑特定处理器102的能力。图2示出了示例性事务处理系统200,可以在托管环境中调用该事务处理系统以支持带有事务存储器动作204和副作用动作206的原子块事务202。系统200包括诸如存储器资源管理器208和副作用资源管理器210之类的至少两个资源管理器,这两个资源管理器加入事务202中并且分别对应于动作204和206。资源管理器208、210各自管理参与事务202的动作适当资源212、214。资源管理器208、210的动作与事务管理器216协调,后者与资源管理器208、210 —起工作以确保事务202的原子性和隔离。事务管理器216实现提交协议218。资源管理器208、210也参与提交协议218。事务202是由单个线程执行的绑定到一起的动作序列。绑定到一起的动作的示例包括原子动作。线程完成对共享存储器中数据的修改,而不考虑在其他处理器上并发运行的其他线程。在完成了事务之后,事务存储器验证其他线程未对所访问的数据作出并发改变。确认改变并且如果确认成功,则在提交操作中使改变成为永久的。如果确认失败,则就撤消或“回退”改变,并且重新执行事务202直至确认成功。事务拥有原子性和隔离的特征。事务是原子的并且在逻辑上是立即执行的。如果一个动作失败,则整个事务失败。同样,事务与其他线程隔离,因为在它们的中间状态中不向其他线程展示任何变量。当达到块的末尾时,提交、中止或回退和重新执行事务。因此, 提交或失败的单元是事务而非整个进程,且状态返回到其原始形式而非展示中间变量。资源管理器存在于传统的事务处理中,并且管理传统事务中的资源。但是传统的事务处理至今为止还未被用于自动地解决对存储器的并发访问,传统的事务处理通常使用锁。不像不控制对共享存储器的访问的传统事务,本示例的特征是事务存储器的管理是事务的一部分。如上所述,事务存储器提议一般地通过为开发人员知道如何处理的有限的错误情况集手动地制作解决方案来提供恢复功能,结果损害了生产力和质量结果。然而,本发明的示例将事务存储器包含到某些主流事务处理中。托管环境也可以提供或包括用于事务存储器环境中的预期动作的预先编程的适当的资源管理器。预先编程的资源管理器可以包括在当要使用资源时可以在管理环境中调用的库中。在其中当适当的资源管理器不存在于用于托管事务存储器环境的资源管理器的预先编程的库中的许多情况下,程序开发人员可以编写资源管理器以供在程序中使用或将它添加到库中。在一个示例中,资源管理器208、210被实现为易失性资源管理器而非持久性资源管理器。易失性资源管理器将它们的状态存储在易失性存储器中并且不支持事务的状态恢复。在事务处理系统200的情况下,易失性资源管理器比持久性资源管理器使用更少的系统资源。与多个易失性资源管理器很好地一起工作的示例性事务管理器216是可用的轻量事务管理器,该轻量事务管理器可以显著地减少由更持久的事务管理器导致的开销。其他示例可以包括持久性事务管理器或资源管理器。资源管理器208、210自动地加入事务202,并且依照事务的结果提交或回退对它们的状态作出的改变。托管环境可以自动化事务中的加入以及就事务资源212、214对事务的管理。当将资源212、214加入到事务202中时,事务通知资源动作204、206希望对资源执行事务工作。动作204、206接着对资源212、214执行动作,且如果不发生错误,则事务管理器216应用提交协议218以要求资源212、214通过资源管理器208、210提交对其状态作出的改变。如果资源管理器208、210中任何一个遇到错误,则事务管理器216会导致回退在事务中作出的所有改变。否则,事务管理器216会导致提交事务。在任一情况下,事务管理器216可以将决定通知给资源管理器208、210。在一个示例中,在另一资源管理器加入事务202之前,存储器资源管理器208担当事务管理器。一旦诸如副作用动作资源管理器210之类的另一资源管理器加入,则事务处理系统200将事务202提升为采用事务管理器216的事务202,并且存储器资源208成为资源管理器。在包括副作用动作在事务存储器中的示例性事务202中,至少将两个资源管理器 208,210加入到事务中。副作用动作206是对资源214产生不利影响的动作的良好示例。 事务存储器动作204也实现资源管理器以管理其存储器改变。如果事务包括其他副作用动作,则可以部署其他资源管理器。资源管理器210延迟副作用动作直至事务管理器216确认所有加入的资源管理投票决定提交事务之后。因此,在与其他并发执行的线程存储器冲突的情况下(如果在确认阶段之前作出冲突,一般会导致事务回退),不重新执行或重复地重新执行副作用动作。开发人员可以以适当的方式实现延迟副作用动作。在上述副作用打印动作的示例中,资源管理器延迟打印直至事务存储器确定事务不涉及与其他线程的存储器冲突。在事务管理器 216调用提交协议218之前,用于打印操作的资源管理器可以在存储器中编写行。在事务管理器216将提交通知给资源管理器之后,资源管理器会访问存储器中的该行并打印它。存在开发人员以适于给定情况和示例类型的副作用动作的方式实现延迟副作用动作的其他类似的示例。可以将方便的句法提供给开发人员以便于更容易地表达资源管理器210的延迟的动作。例如,内联延迟动作可以包括如下的句法
权利要求
1.一种存储计算机可执行指令的计算机可读存储介质,所述计算机可执行指令用于控制包括对包括多个线程的并发程序的处理操作的计算机系统,其中所述多个线程中的至少一个包括具有副作用动作206的原子事务202,所述计算机可执行指令包括事务存储器212,其被配置成控制所述多个线程对共享存储器104的访问;第一资源管理器210,其被配置成加入所述原子事务202并管理与所述副作用动作206 相关的资源;第二资源管理器208,其被配置成加入所述原子事务并管理所述事务管理器212 ;以及事务管理器216,其耦合到所述第一和第二资源管理器208、210,其中所述事务管理器 216被配置成从所述第一和第二资源管理器208、210接收关于提交所述事务的投票,并且其中所述副作用动作206是被延迟直至事务提交之后或与针对所述副作用动作的补偿动作一起应用中的至少一个。
2.如权利要求1所述的计算机可读介质,其特征在于,所述第一和第二资源管理器是易失性资源管理器。
3.如权利要求2述的计算机可读介质,其特征在于,所述事务管理器是轻量事务管理ο
4.如权利要求1所述的计算机可读介质,其特征在于,第一和第二资源管理器被包括在具有多个资源管理器的库中,所述多个资源管理器选择性地可供加入具有副作用动作的原子事务。
5.如权利要求4述的计算机可读介质,其特征在于,所述多个资源管理器中的至少一个资源管理器在托管环境中被预先编程。
6.如权利要求1所述的计算机可读介质,其特征在于,所述事务管理器被配置成接收提交协议以确定是否提交所述事务。
7.如权利要求1所述的计算机可读介质,其特征在于,所述提交协议是包括准备阶段和提交阶段的两阶段提交协议。
8.如权利要求1所述的计算机可读介质,其特征在于,所述副作用动作选择包括以下各项的组输入或输出动作、系统调用、传统代码动作、内核动作、设备管理、以及所述托管环境之外的其他域中的动作。
9.如权利要求8所述的计算机可读介质,其特征在于,所述副作用动作是打印动作。
10.一种控制具有副作用动作的原子事务的方法,所述方法包括加入304至少一个非存储器资源管理器210 ;加入304被配置成管理事务存储器212的存储器资源管理器208 ;调用被配置成确定所述非存储器和存储器资源管理器是否投票同意提交所述事务的提交协议308 ;如果所述非存储器和存储器资源管理器投票同意提交所述事务,则提交314所述事务,并且在提交所述事务之后应用所述副作用动作;如果所述存储器资源管理器208未投票同意提交所述事务,但是所述非存储器资源管理器210投票同意提交所述事务,则重新执行312所述事务,其中所述副作用动作206是在重新执行所述事务的情况下不应用或者在重新执行所述事务的情况下与补偿动作一起应用中的至少一个;如果所述非存储器资源管理器210中的至少一个未投票同意所述事务,则中止318所述事务,其中如果中止所述事务,则不应用所述副作用动作206。
11.如权利要求10所述的方法,其特征在于,所述原子事务包括原始状态并且其中重新执行所述事务包括回退到所述原始状态。
12.如权利要求11所述的方法,其特征在于,重新执行所述事务包括重新执行所述事务直至所述非存储器和存储器资源管理器投票同意提交所述事务或所述事务被中止。
13.如权利要求11所述的方法,其特征在于,在提交所述事务时使对所述原始状态的改变变得持久。
14.如权利要求10所述的方法,其特征在于,重新执行所述事务包括将开放式补偿动作应用于所述副作用动作。
15.如权利要求10所述的方法,其特征在于,提交所述事务包括应用延迟的动作。
16.如权利要求10所述的方法,其特征在于,确定第一和第二资源管理器是否投票同意提交所述事务包括对每一个加入的资源管理器调用方法以获取关于所述事务的对应投苗ο
17.如权利要求10所述的方法,其特征在于,如果不存在存储器冲突,则所述存储器资源管理器投票同意提交。
18.一种托管环境,其在计算设备上操作且被配置成操作具有包括副作用动作206的原子事务202的应用程序,所述托管环境包括事务存储器212;资源管理器的库,其中所述资源管理器208、210中的至少两个被配置成由所述应用程序加入并且被加载到所述计算设备上的易失性存储器104中,其中所述资源管理器之一是被配置成加入管理与所述副作用动作相关的资源214的副作用资源管理器210,而另一资源管理器是被配置成加入管理所述事务存储器212的存储器资源管理器208 ;以及事务管理器216,其被加载到所述易失性存储器106中并且耦合到所加入的资源管理器208、210,其中所述事务管理器被配置成从所加入的资源管理器接收关于是否提交所述事务的投票,其中所述存储器资源管理器208取决于在所述事务期间是否发生存储器冲突 312来投票。
19.如权利要求18所述的托管环境,其特征在于,所述计算设备包括多个处理器,并且其中所述原子事务被包括在具有多个并发线程的应用程序的线程上。
20.如权利要求19所述的托管环境,其特征在于,所述事务存储器控制对所述计算设备上的共享数据的访问。
全文摘要
一种处理系统包括事务存储器、第一和第二资源管理器和用于并行程序的事务管理器,该并行程序具有包括具有副作用动作的原子事务的线程。该第一资源管理器被配置成加入该原子事务并且管理与该副作用动作相关的资源。该第二资源管理器被配置成加入该原子事务并且管理该事务存储器。该事务管理器耦合到第一和第二资源管理器并且管理器被配置成从第一和第二资源管理接收关于是否提交该事务的投票。该副作用动作被延迟直至该事务提交之后或与针对该副作用动作的补偿动作一起应用。
文档编号G06F9/06GK102187321SQ200980142416
公开日2011年9月14日 申请日期2009年10月16日 优先权日2008年10月20日
发明者D·格罗夫, A·达迪欧莫夫, Y·莱瓦诺尼 申请人:微软公司