具有对共享资源的访问协调的转换程序代码的方法和设备的制作方法

文档序号:6567708阅读:117来源:国知局
专利名称:具有对共享资源的访问协调的转换程序代码的方法和设备的制作方法
技术领域
本发明总体上涉及计算机和计算机软件领域,更具体地说,涉及在例如转换程序代码的代码翻译器、仿真器和加速器中使用的程序代码转换方法和设备。

背景技术
在嵌入式和非嵌入式CPU两者中都具有主要指令集架构(ISA,大型软件因此而存在),如果它们可以透明地访问相关的软件,则可“加速”性能或被 “翻译”到能够提供更好的性价比的各种高性能处理器。人们还发现主要的CPU架构被锁定到其ISA,并且不能提高性能或市场占有。这样的CPU可从面向软件的处理器联合架构中受益。
例如,在公开的申请WO00/22521中公开了用于方便这样的加速、翻译和联合架构能力的程序代码转换方法和设备,该申请的公开合并于此,以资参考。
本发明的实施例具体地与程序代码转换有关,其中,主题程序(subjectprogram)被转换成可由目标处理器在目标计算平台中执行的目标代码。
与在主题处理器上本地执行主题程序相比,执行程序代码转换必然带来转换处理中的开销。通常期望减少转换处理中的这种开销。另外,通常还期望产生在目标处理器上正确和高效执行的目标代码。
线程是可以独立运行的程序的一部分,并且与程序的其他部分并发。在多线程处理环境中,多于一个线程(或者多于一个处理器)访问诸如存储器的共享资源。通常需要协调访问共享资源的机制,以便避免诸如冲突或者未预料的行为的干扰。例如,当两个线程独立地更新位于特定存储器位置的数据时,可能出现无意的干扰。访问协调机制通常对于主题处理器的指令集架构是特定的。在很多情况下,不容易在程序代码转换之后在目标处理器上实现主题访问协调机制。首先,目标处理器可能不具有基于硬件的协调机制。其次,目标协调机制可能与主题机制的工作相异。在这两种示例中,难以提供主题代码所期待的主题访问协调机制的恰当的替代。


发明内容
根据本发明,提供一种如权利要求中所阐述的设备和方法。通过从属权利要求和以下的描述,本发明的优选特征将很明显。
以下是根据本发明实施例的可实现的各个方面和优点的总结。其被提供作为帮助本领域的技术人员更快地了解随后的详细设计讨论的入门,而不是将以任何方式限制权利要求的范围。
在本发明的一方面中提供一种提供共享资源的访问协调机制的方法,所述方法用于从具有多主题线程的主题代码到能够被目标处理器执行的目标代码的程序代码转换,所述方法包括(a)提供多个本地数据结构,每个数据结构都与多个主题线程之一相关联;以及全局令牌,对于每个主题线程是共用的;(b)对主题代码解码,以识别设置与共享资源相关的主题访问协调机制的主题设置指令和检查主题访问协调机制的主题检查指令;(c)响应于主题设置指令,产生用于调整全局令牌的目标代码,并在当前线程的本地数据结构中至少存储本地令牌,其中,所述本地令牌从调整的全局令牌得到;(d)响应于主题检查指令产生目标代码,所述目标代码用于将至少存储的本地令牌与全局令牌进行比较以确定对共享资源的潜在干扰。
在示例性实施例中,发明者已经开发了用于加速程序代码转换的方法,所述方法在与提供主题程序代码到目标代码的动态二进制翻译的运行时间翻译器相关联的情况下尤其有益。
本发明还扩展到具有安排用于执行在此限定的任何方法的翻译器单元的翻译器设备。另外,本发明扩展到其上记录有可由计算机实现以执行在此限定的任何方法的指令的计算机可读存储介质。



在此引入并构成说明书的一部分的附图示出目前优选的实现方式,并描述如下 图1是示出本发明的实施例得到应用的设备的框图; 图2是示出在程序代码转换期间的执行控制的示例方法的示意性流程图; 图3是示出在程序代码转换之后主题指令和目标指令之间的关系的示意图; 图4是具有作为面向硬件的访问协调机制的保留的示例主题处理器的示意图; 图5是在本发明的示例性实施例中采用的具有对共享资源的访问协调机制的目标处理器的示意图; 图6是在本发明的示例性实施例中采用的方法的概述; 图7是更详细地示出图6的方法的示意流程图;以及 图8是更详细地示出图6的方法的示意流程图。

具体实施例方式 提供以下说明使得本领域的技术人员能够制造和使用本发明,并阐述完成本发明的发明者认为的最佳模式。然而,由于已经在此具体地限定了本发明的一般原理以提供改进的程序代码转换方法和设备,因此各种修改对于本领域的技术人员仍将是很明显的。
在下面的术语中,主题程序将要在包括主题处理器的主题计算平台上执行。包括目标处理器的目标计算平台用于通过执行动态程序代码转换的翻译器来执行主题程序。翻译器执行从主题代码到目标代码的代码转换,从而能够在目标计算平台上执行目标代码。
图1示出了包括目标处理器13的示例目标计算平台14,所述目标处理器13包括目标寄存器15和存储多个软件组件17、19、20、21和27的存储器18。软件组件包括操作系统20、待翻译的主题代码17、翻译器代码19、翻译的代码(目标代码)21和抽象寄存器组(abstract register bank)27以及其他。
在一个实施例中,翻译器代码19是仿真器,用于将主题指令集架构(ISA)的主题代码翻译成另一ISA的翻译的目标代码(经过或不经过优化)。也就是说,翻译器19对主题处理器进行仿真,同时在目标处理器13上执行作为目标代码21的主题程序17。在另一实施例中,翻译器19用于通过执行代码程序优化来作为将主题代码翻译成目标代码(主题代码和目标代码是相同ISA)的加速器。
概括说来,目标计算平台14是一种翻译器设备,其包括翻译单元19以及其他。在示例实施例中,翻译器19是实现翻译器的源代码的编译版本。翻译器19和由翻译器19产生的翻译的代码21结合操作系统20在目标处理器13上运行,所述目标处理器13通常是微处理器或其他合适的计算机。
应理解在图1中示出的结构仅是示例性的,并且例如本发明的实施例可以通过驻留在操作系统中或驻留在操作系统之下的代码实现。主题代码17、翻译器代码19、操作系统20和存储器18的存储机制可以是如本领域的技术人员所知的多种类型中的任意一种。
在图1的设备中,优选地,在目标代码21运行的同时,程序代码转换在运行时间被动态执行。翻译器19与翻译的程序21协调运行。在这种情况下,翻译器是动态二进制翻译器。在另一示例实施例中,翻译器19是按顺序将各个主题指令翻译并执行为一个或多个相应的目标代码指令的解译器。
优选地翻译器19被采用作为用于目标架构编译的应用程序。在运行时间主题程序17被翻译器19翻译以在目标架构14上执行。在运行时间主题程序被翻译器19翻译以在目标架构上直接执行。翻译器19还变换主题程序17做出的主题操作系统(OS)调用,从而使它们在被传递到目标OS 20时正确地工作。
通过翻译器19运行主题程序17包括以交织的方式执行的两种不同类型的代码翻译器代码19;以及目标代码21。基于翻译器19的高级源代码实现,在运行时间之前由诸如编译器产生翻译器代码19。相反地,基于正被翻译的程序的存储的主题代码17,在运行时间期间由翻译器代码19产生目标代码21。
在示例实施例中,提供至少一个抽象寄存器组27(还被称为主题寄存器组27或全局寄存器存储27)。在多处理器环境中,根据主题处理器的架构可选地提供多于一个抽象寄存器组27。
由翻译器19和目标代码21的组件来提供主题处理器状态的表示。也就是说,翻译器19以多种明确的编程语言装置(诸如变量和/或对象)来存储主题处理器状态。用于编译翻译器19的编译器确定如何以翻译器代码来实现状态和操作。作为比较,目标代码21在由目标代码21的目标指令操纵的目标寄存器15中和存储器位置18中隐含地提供主题处理器状态。例如,全局寄存器存储27的低级表示是简单的分配的存储器的区。然而,在翻译器19的源代码中,全局寄存器存储27是可在较高级别访问和操纵的数据阵列或对象。
图2是示出在程序代码转换期间的执行控制的示例方法的示意性流程图。
如图2所示,控制最初驻留于翻译器控制环190。在步骤201,控制环190调用翻译器代码19的代码产生函数192,其将主题代码17的块翻译成翻译的代码21的相应块。然后,在步骤202,在目标处理器13上执行翻译的代码21的所述块。方便地,翻译的代码21的每个块的末端包含将控制返回到控制环的指令201。换句话说,翻译和执行主题代码的步骤被交织,从而主题程序17的各部分被翻译并按顺序地执行。
这里,术语“基本块(basic block)”对于本领域的技术人员应是很熟悉的。基本块是具有准确的一个入口点和准确的一个出口点的代码段,其将块代码限制为单个的控制路径。为此,基本块是有用的控制流的基本单元。合适地,翻译器19将主题代码17划分为多个基本块,其中,每个基本块都是位于单个入口点的第一指令和位于单个出口点的最后指令之间的有序的一系列指令(例如跳转、调用或分支指令)。翻译器可只选择这些基本块中的一个(块模式)或选择一组基本块(组块模式)。组块适当地包括将被作为一个单元一起对待的两个或多个基本块。此外,翻译器可形成表示主题代码的相同基本块但在不同入口条件下的相同块(iso-block)。
在示例实施例中,作为从原始主题程序17产生目标代码21的处理的部分,基于主题指令序列产生中间表示(IR)的树。IR树是由主题程序计算的表达式和由主题程序执行的操作的抽象表示。稍后,基于IR树产生目标代码21。IR节点的集合实际是有向无回路图(DAG),但通常被称为“树”。
如本领域的技术人员可能知道的,在一个实施例中,使用面向对象编程语言(如C++)来实现翻译器19。例如,IR节点被实现为C++对象,对其他节点的引用被实现为对与所述其他节点相应的C++对象的C++引用。因此IR树被实现为IR节点对象的集合,包含彼此的各种引用。
此外,在以下讨论的实施例中,IR产生使用一系列与主题程序1 7将被运行的主题架构的特定特征相应的抽象寄存器定义。例如,具有对于主题架构上的每个物理寄存器(“主题寄存器”)的唯一抽象寄存器定义。如此,翻译器中的抽象寄存器定义可被实现为包含对IR节点对象(即,IR树)的引用的C++对象。由所述的系列的抽象寄存器定义引用的所有IR树的集合被称为工作IR树林(被称为“树林”是因为其包含多个抽象寄存器根,每个都引用IR树)。这些IR树和其他处理恰当地形成翻译器代码产生函数192的部分。
图3是示出在本发明的示例实施例中的程序代码转换之后主题程序中的指令和目标程序中的指令之间的示例关系的示意图。
在此示例中,主题指令S1-S3形成功能相同的目标指令T1-T3。主题指令S1已通过诸如死代码消除优化被移除,并且在产生的目标代码中没有对等部分。主题指令S2形成一个相同的目标指令T3。相反,主题指令S3形成两个目标指令T1和T2。在目标和主题代码指令之间可能具有一对无、一对一、一对多或多对一的关系。
如图3所示,另一通常使用的优化是执行代码重排,从而在目标代码中的指令顺序与主题代码中的原始顺序不相同。这里,第二主题指令S2已被重排为第三目标指令T3。
主题访问协调 图4是示例主题处理器400的示意图。主题处理器400对存储器401进行存取,并包括至少一个通用目的寄存器402,对于本领域的技术人员是很熟悉的。示出的主题处理器400是典型的RISC处理器。
在此示例中,主题处理器还包括保留403形式的访问协调机制。通常,保留403是主题处理器400的物理硬件的一部分。保留403提供对诸如存储器401的共享资源的访问协调机制。通常在处理器400中仅提供一个保留403。
保留403用于检测是否发生了与共享资源(即,存储器401)相关的潜在干扰。
在此示例中,保留403包括保留标志404和特殊用途保留寄存器405。保留标志404通常是显示是已经设置保留还是已经清除保留的一比特标志。保留寄存器405用于存储存储器地址。
最通常地,保留403与“加载-链接”和“存储-条件”类型指令组合使用。加载-链接指令用于设置(或密封(seal))访问协调机制。存储-条件指令用于检查访问协调机制,以检测对共享资源的潜在的干扰。
这些指令的每一个都与指定地址相关联,以这样的示例形式 retry load-link [MEM LL] ...perform operations on the loaded data store-conditional[MEM SC] branch if store-conditional failsretry ... 当遇到加载-链接类型指令时,从与该指令相关联的存储器地址(即,[MEM LL])读取数据,将地址[MEM LL]写入保留寄存器404,并且保留标志405被设置。
从存储器地址读取的数据可用于一个或多个操作(即,一个或多个插入(intervening)主题指令)。例如,对读取的数据执行递增、相加或移位操作。通常在相应的加载-链接指令和存储-条件指令之间仅执行少量的操作,如一条、两条或三条指令。这是为了减少干扰的可能性。然而通常不限制可在一对加载-链接指令和存储-条件指令之间执行的指令的数量。
存储-条件指令用于将那些插入的操作的结果写回到存储器401,通常写到与该数据被读取的存储器地址相同的存储器地址。也就是说,通常以匹配的配对来创建加载-链接指令和存储-条件指令,从而使[MEM LL]是与[MEMSC]相同的地址。
存储-条件指令将给定的存储地址[MEM SC]与存储在保留寄存器404中的地址(其仍应是MEM LL)进行比较。如果比较的地址相等(即,MEM SC等于存储的MEM LL),则保留标志405仍被设置,随后执行存储。
在多线程环境中,潜在的干扰事件可能在主题系统中(即,在另一主题线程或在另一主题处理器上)的其他地方发生。这里,潜在的干扰事件通过以下条件中的任何一个来检测(a)当寄存器标志405仍应被设置时其已被清除;或者(b)在保留寄存器404中保持的地址与存储-条件指令中指定的地址(即,[MEM SC])不相同。
如果存储-条件指令成功(即,未检测到干扰),则保留标志405被清除并继续执行程序。然而,如果存储-条件失败,则程序通常重复地循环回到加载-链接指令,直到没有干扰地执行该指令。
作为潜在的干扰事件的示例,保留标志405通常被中断、系统调用或对保存在保留寄存器404中的存储器地址的任何存储清除。
作为另一示例,第二加载-链接指令(即,另一线程)将设置保留标志405,并将存储在保留寄存器404中的地址改变为与第二加载-链接指令相关联的地址(例如,[MEM LL2])。因此第二加载-链接指令将使得第一存储-条件指令失败。
为了允许保留403高效工作,通常将用于设置和检查保留寄存器404和保留标志405的逻辑门硬线连接到主题处理器405中。相似地,通常将用于清除保留标志405的逻辑门硬线连接到主题处理器中。这样的特殊改造的硬件使与这些过程相关联的计算开销最小化。
作为特定的示例,PowerPC类型处理器提供了保留,并具有支持已知为“lwarx”和“stwcx”的加载-链接和存储-条件功能的一对指令的指令集结构。作为此示例的进一步的背景技术,可在http://www-128.ibm.com/developerworks/library/pa-atom得到更详细的讨论。
在这种基于主题硬件的保留系统中,当接收到中断或执行系统调用时,保留被熔固(blown)(即,标志405被清除或保留寄存器404被改变)。在线程之间发生上下文切换的情况下,如果OS选择重排任务(通常在中断或系统调用时执行),则在执行的一个线程中的加载-链接将不与另一线程中的存储-条件相匹配(这可能造成发生错误的存储)。如此,在硬件层,为每个处理器提供一个保留,而不是为每个软件任务提供一个保留。
目标访问协调 图5是在本发明的示例实施例中采用的包括用于协调对共享资源的访问的机制的目标计算平台14的示意图。
安排翻译器19以支持一个或多个主题程序17中的多个线程。翻译器19协调所述多个线程对诸如存储器18的共享资源的访问,并允许检测潜在的干扰。
参照图5,翻译器19提供全局令牌501,和一个或多个系列的本地数据502,全局令牌501和本地数据502被一起采用以协调对存储器18的访问。
在示例实施例中,翻译器19为主题程序17的每个线程提供一个本地数据结构502。图5示出与第一线程171和第二线程172分别相关联的第一数据结构502a和第二数据结构502b。
如图5所示,访问协调机制(即,全局令牌501和每个本地数据机构502)被方便地存储在存储器18中。或者,如果可用,则所有或部分数据被存储在目标处理器13的合适的寄存器15中。也就是说,目标代码21可在目标寄存器中保持一个或多个访问协调数据的元素。具体地,在目标寄存器15中按期望地保持全局令牌501。
如图5所示,每个本地数据结构502都包括本地令牌521、本地值522和本地存储器地址523。本地令牌521存储从全局令牌501得到的令牌。本地值522存储从共享资源读取(即,从存储器18读取)的数据值。本地地址523存储从其读取数据的地址。
本地地址523被适当地格式化为表示主题地址空间的主题地址(例如,对于图4的主题系统的存储器401合适的地址)。主题指令17引用主题地址空间。翻译器19将主题地址翻译成对于目标计算系统14和目标存储器18合适的目标地址。或者,将存储的本地地址523格式化为翻译的目标地址。
图6是在本发明的实施例中采用的提供访问协调机制的优选方法的概述。在翻译器19中适当地执行该方法,翻译器19产生目标代码21从而在目标处理器13上实现该方法。
参考图6,该方法包括步骤601,提供如上面参照图5讨论的全局令牌501和至少一个本地数据结构502。
步骤602包括对主题程序17解码以识别引用主题访问协调机制(即,在图4的主题处理器400中提供的访问协调机制403)的指令。具体地说,该步骤包括识别以下项(a)主题设置指令,设置主题访问协调机制,例如加载-链接指令;和(b)主题检查指令,检查主题访问协调机制,例如存储-条件指令。
步骤603包括(a)响应于主题设置指令,调整全局令牌501,并存储用于第一线程171的全局数据结构502。这里,当遇到主题加载-链接指令时,由目标代码将本地令牌521、本地值522和本地地址523写入到本地数据结构502中(例如,存储器18中)。
步骤604包括(b)响应于主题检查指令,将存储的本地数据结构502与全局令牌501的至少当前值进行比较,以确定对共享资源18的潜在干扰。比较步骤还将在检查指令中提供的数据与本地数据结构502进行比较。此外,步骤604包括调整全局令牌501。
图7是更详细地示出图6的步骤603的示意流程图; 翻译器19识别主题设置指令,诸如对主题保留403进行操作的主题代码加载-链接指令load-link[MEM LL]。由翻译器产生的相应的目标代码21执行图7中示出的步骤。图7主要示出了调整全局令牌501的步骤701、从共享资源读取数据的步骤703、以及存储本地数据结构502的步骤702、704和705。
步骤701包括调整全局令牌501。适当地,全局令牌是数字值(例如64位数字计数器),调整全局令牌是算术运算。更方便地,调整全局令牌501包括递增计数器。在很多目标处理器13中,执行递增指令相对便宜。或者,计数器递减。其他形式的调整也是可行的。所述调整显示全局令牌已经从其先前的形式或值改变。另外,全局令牌将响应于后续的调整再次改变。
理想地,调整全局令牌501的一个操作或多个操作不受干扰地自己执行。否则,不能保证全局令牌501被正确地调整。具体地,翻译器19其自身可能作为多个目标线程中的一个线程在目标处理器上运行。
适当地,使用适合于目标处理器的机制不受干扰地调整全局令牌501。理想地,如果在指令集架构目标处理中存在原子操作,则使用原子操作,如果存在目标处理器自身的加载-链接和存储-条件机制,则使用该机制。
一些指令集架构支持将从存储器读取数据、操作数据和将结果写回到存储器作为单个步骤的操作。这样的操作不包括单独的子步骤,因此不会崩溃。这种类型的操作已知为“原子”,这是由于它们的逻辑不可分性。通常,原子操作在处理器中的单个总线周期中发生。逻辑上,其他任何操作数据的尝试必须在原子操作之前或之后发生。
通常在CISC处理器上提供原子操作。在目标处理器作为包括x86系列处理器的具体的示例中,调整全局令牌501的步骤包括使用原子比较-交换类型指令(例如,“cmpxchg”指令)递增全局令牌计数器。
步骤702包括将全局令牌501的当前值存储为本地数据结构502的本地令牌521。
步骤703包括从主题加载-链接指令中指定的存储器位置(即,与主题地址[MEM LL]相关的目标存储器18中的位置)加载数据。也就是说,主题设置指令提供与共享资源相关的设置地址,并响应于该设置地址(即,如果需要则利用合适的地址变换)从共享资源读取数据值。
步骤704和705包括将加载的数据和设置地址(例如,MEM LL)的复制作为本地值522和本地地址分别存储在本地数据结构502中。
用于实现步骤701至705的一般伪码为 [atomically]adjust global token load[MEM LL] local_token=global token local_mem=MEM LL local_value=value in MEM LL 图8是更详细地示出图6的步骤604的示意流程图。
如图8所示,主题代码存储-条件指令被方便地划分为目标代码中的若干子步骤。
步骤801包括将从主题存储-条件指令中指定的地址得到的检查地址(即,MEM SC)与存储在本地数据结构502中的本地地址523进行比较。如果需要,再次执行地址变换。成功的比较(其中,检查地址和存储的本地地址相同)显示主题存储-条件指令与先前的加载-链接指令相匹配。失败的比较(其中,地址不相同)指示在当前线程171中已经执行了另一加载-链接指令。这样的情况可能在编写不佳的主题代码中无意地出现。这里,不能保证已经不受干扰地执行了第一加载-链接和相应的存储-条件之间的插入指令。
步骤802包括将存储的本地令牌521与全局令牌501的当前值进行比较。如果本地令牌521不等于全局令牌501,则全局令牌501有可能已被另一线程172中(或者甚至在当前线程171中)的潜在的干扰指令调整。例如,另一线程可能已经执行了干扰加载-链接类型设置指令。在这种情况下,由于存储了本地令牌521,因此不能保证已经不受干扰地执行了插入操作。
可建立其他目标代码指令以调整全局令牌501,理想地使用原子操作,诸如上面讨论的[atomically]adjust global token。例如,主题处理器上的存储、系统调用或中断正常地将清除主题处理器的保留标志405。理想地,这些主题处理器事件和指令被翻译成调整全局令牌501的目标代码。
在步骤803,将存储为local value的值522与当前存储在主题检查指令(存储-条件指令)中指定的存储器地址([MEM SC])中的值进行比较。如果两个值不相同,则显示在该存储器位置上已经发生了另一存储。因此,检测到已经不受干扰地执行了主题设置指令和检查指令之间的插入指令。
同时,也有可能local value的值522与最后写到相关存储器地址的另一存储指令的值对应。然而,此附加检查意味着仅在全局令牌已被调整到预料值并且已经存储了相同的值的情况下获得错误肯定。
理想地,以组合的形式执行步骤801-803的检查。这三个检查一起提供一种强壮但相对便宜的机制,用于在多线程环境中检测与诸如存储器的共享资源相关的潜在干扰。
步骤804包括执行主题检查指令(即,存储-条件指令)所请求的存储。也就是说,在步骤801、802和803的每一个的比较都成功的情况下,插入操作的结果被存储到主题检查指令中指定的位置([MEM SC])。
如步骤701的讨论,步骤805包括调整诸如使用原子递增(例如,比较-交换)指令的全局令牌。
步骤806包括指示检查和存储操作成功,从而主题程序的操作现在可以继续。例如,提供成功/失败标志并且被目标代码21或翻译器19引用。
在步骤801-803中的任意比较操作不成功(失败)的情况下,到达步骤807和808。
如步骤701的讨论,步骤807包括调整诸如使用原子递增(例如,比较-交换)指令的全局令牌。
步骤808包括指示检查和存储操作失败。例如,成功/失败标志被设置为指示失败并被目标代码21或翻译器19引用。理想地,成功/失败标志用于从相应的加载-链接指令分支返回和重试整个序列。
在以下的一般伪码中示出步骤801-808的示例程序指令 If((local mem==MEM SC) and(local token==global token) and(local value==contents of MEM SC)) then perform store[MEM SC] [atomically] adjust global token Set success flag else [atomically] adjust global token set failure flag 在此讨论的示例实施例具有多种好处和优点。在此讨论的实施例有利地提供了一种用于访问协调的面向软件的方法,该方法相对高效和高性价比地在翻译器中实现并作为目标代码执行。
在此给出的示例是一般性的,本发明的原理应用于主题处理器和目标处理器的组合,其中主题代码设置指令和检查指令(例如,加载-链接指令和存储-条件指令)将在使用不同访问协调机制的架构或者不提供这样的机制的架构上执行。具体地,示例实施例允许与面向硬件的保留相同的行为在不提供对保留的硬件支持的目标处理器上有效地执行。
具体来说,非限制类型(例如PowerPC)和MIPS类型处理器提供使用硬件支持的保留的加载-链接和存储-条件机制。相反地,x86、Itanium和Sparc类型处理器不提供保留。在优选的实施例中,这些处理器能够相对便宜地对存储器执行原子操作。
在此讨论的原理也可应用于主题处理器和目标处理器都具有加载-链接和存储-条件机制但是不具有机制之间的直接映射的情况。此外,在主题处理器和目标处理器都具有加载-链接和存储-条件机制的情况下,仍需要保持目标处理器的保留独立于主题代码中的加载-链接和存储-条件指令。这是因为翻译器也在目标处理器上运行,并且其自身将利用目标处理器的保留。通过这种方式,翻译器和翻译的目标代码之间的干扰可以被减少。
如上面讨论的,本发明的示例实施例是基于这样的观察在软件层,检测诸如中断或系统调用的重排事件可能很困难或很昂贵。然而,存储每个线程的信息比较便宜。优选的设计基于每线程存储三条信息,即指示设置了访问协调机制的标志、从何处加载的地址和加载的值。如果在此线程内发生系统调用,或通过翻译器处理的中断发生,则标志应被清除(即,设置为指示失败的情况)。
所述值用于在加载-链接设置指令之后的存储-条件检查指令的点处检测相关的存储器内容何时被改变。理想地,该系统不应只检测所述值在存储-条件是否与其在加载-链接的点处相同,还应检测任何的插入改变。从软件检测潜在地抑制昂贵。
在实际中,通常仅由原子指令或非原子指令访问给定的存储器地址。如此,足以使得存储-条件指令使系统中的所有访问协调机制无效。这将潜在地造成访问协调机制被不必要地无效,但是这种情况总会发生(例如,线程接收到加载-链接和存储-条件之间的硬件中断,但是没有插入事件干扰操作发生的原子性)。为了使存储-条件指令在系统的其他地方中断访问协调机制,本发明的示例实施例从上述的纯每线程模型(该模型只用一位标志指示保留保持)变为引入全局令牌的模型。提供每线程标志作为每线程本地令牌。这样的优点在于只通过修改单个全局令牌就使得所有其他线程中的所有访问协调机制失败,而不是尝试更新系统中的所有线程的标志。
虽然已经示出和描述了若干优选实施例,但是本领域的技术人员将理解,在不脱离权利要求所限定的本发明的范围的情况下,可以做出各种改变和修改。
注意到连同本申请一起与本说明书同时提交或在此之前提交的以及公开用于公众检查本发明书的所有纸件和文档,所有纸件和文档的内容合并于此以资参考。
在说明书(包括任何权利要求、摘要和附图)中公开的所有特征和/或公开的任何方法或处理的所有步骤可组成任意的组合,除非在组合中的至少一些这种特征和/或步骤互相排斥。
在本说明书中公开的每个特征(包括任何权利要求、摘要和附图)可由起到相同、等同或相似作用的可选的特征替代,除非特别说明。因此,除非特别说明,公开的每个特征仅是一般系列的等同或相似特征的一个示例。
本发明不限于前述实施例的细节。本发明扩展到本说明书(包括任何权利要求、摘要和附图)中公开的特征的任何的创新或任何的创新组合,或者扩展到公开的任何方法或处理的步骤的创新或任何的创新组合。
权利要求
1.一种提供共享资源的访问协调机制的方法,用于在从具有多个主题线程(171、172)的主题代码(17)到能够被目标处理器(13)执行的目标代码(21)的程序代码转换,所述方法的特征在于以下步骤
(a)提供以下项多个本地数据结构(502a、502b),每个本地数据结构都与多个主题线程(171、172)中的一个相关联;以及全局令牌(501),对于主题线程(171、172)中的每一个都是共用的;
(b)对主题代码(17)解码,以识别设置与共享资源(401)相关的主题访问协调机制的主题设置指令和检查主题访问协调机制的主题检查指令;
(c)响应于主题设置指令,产生用于调整全局令牌(501)的目标代码(21),并在当前线程的本地数据结构(502)中至少存储本地令牌(521),其中,所述本地令牌(521)是从调整的全局令牌(501)得到;
(d)响应于主题检查指令产生目标代码,所述目标代码用于将至少存储的所述本地令牌(521)与全局令牌(501)进行比较以确定对共享资源(401)潜在干扰。
2.如权利要求1所述的方法,还包括以下步骤响应于对共享资源(401)的潜在干扰的事件调整全局令牌(501)。
3.如权利要求2所述的方法,还包括
从主题代码或影响主题代码(17)的中断检测系统调用,并作为响应地调整全局令牌(501)以显示对共享资源(401)的潜在干扰。
4.如权利要求1所述的方法,还包括
执行关于第一主题线程(171)的步骤(c);
调整关于第二主题线程(172)的全局令牌(501);以及
执行关于第一主题线程(171)的步骤(d),从而确定第二主题线程(172)对共享资源(401)的潜在干扰。
5.如权利要求1所述的方法,其中
步骤(c)还包括将从主题设置指令获得的数据存储到本地数据结构(502)中;以及
步骤(d)还包括将从主题检查指令获得的数据与从本地数据结构(502)获得的数据(523、522)进行比较。
6.如权利要求1所述的方法,其中
步骤(c)还包括将本地地址存储在本地数据结构(502)中,所述本地地址从用于从共享资源进行读取的主题设置指令中指定的主题设置地址获得;以及
步骤(d)还包括将本地地址(523)与从主题检查指令获得的检查地址进行比较。
7.如权利要求1所述的方法,其中
步骤(c)还包括将本地值(522)存储在本地数据结构(502)中,所述本地值存储从关于主题设置指令中指定的设置地址的共享资源(401)读取的数据值;以及
步骤(d)还包括将本地值(522)与从关于主题检查指令中指定的检查地址的共享资源(401)读取的数据值进行比较。
8.如权利要求1所述的方法,其中
步骤(c)还包括
在本地数据结构(502)中存储以下项从用于从共享资源(401)进行读取的主题设置指令中指定的设置地址获得的本地地址(523);和存储从关于所述设置地址的共享资源(401)读取的数据值的本地值(522);以及
步骤(d)还包括
将本地地址(523)与从主题检查指令获得的检查地址进行比较;以及
将本地值(522)与从关于检查地址的共享资源读取的数据值进行比较。
9.如权利要求1所述的方法,其中,步骤(d)还包括响应于主题检查指令将新的数据值存储到共享资源(401)。
10.如权利要求1所述的方法,其中,步骤(d)还包括调整全局令牌(501)。
11.如权利要求1所述的方法,其中,全局令牌(501)是数字计数器值。
12.如权利要求11所述的方法,其中,存储本地令牌(521)的步骤包括复制全局令牌(501)的当前值。
13.如权利要求11所述的方法,其中,调整全局令牌(501)的步骤包括递增计数器。
14.如权利要求11所述的方法,包括在目标处理器(13)上原子调整全局令牌(501)。
15.如权利要求1所述的方法,包括将能够被主题处理器(400)执行的主题代码(17)翻译成能够被目标处理器(13)执行的目标代码(21)。
16.如权利要求15所述的方法,包括执行从主题代码(17)到目标代码(21)的动态二进制翻译。
17.如权利要求15所述的方法,其中,目标处理器(13)包括与主题处理器(400)类型不同的处理器。
18.一种执行从能够被主题处理器(400)执行的主题代码(17)到能够被目标处理器(13)执行的目标代码(21)的程序代码转换的翻译器设备,所述设备包括翻译单元(19),将主题代码(17)翻译成用于在目标处理器(13)上执行的翻译的目标代码(21),其中,主题代码(17)包括多个主题线程;其特征在于翻译器单元(19)
(a)提供以下项多个本地数据结构,每个本地数据结构都与所述多个主题线程中的一个相关联;以及全局令牌,对于主题线程中的每一个都是共用的;
(b)对主题代码解码,以识别设置与共享资源相关的主题访问协调机制的主题设置指令和检查主题访问协调机制的主题检查指令;
(c)响应于主题设置指令,产生用于调整全局令牌的目标代码,并在当前线程的本地数据结构中至少存储本地令牌,其中,所述本地令牌(521)从调整的全局令牌得到;
(d)响应于主题检查指令产生目标代码,所述目标代码用于将至少存储的本地令牌与全局令牌进行比较以确定对共享资源的潜在干扰。
19.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于响应于对共享资源(401)潜在干扰的事件调整全局令牌(501)。
20.如权利要求19所述的翻译器设备,其中,翻译单元(19)被安排用于从主题代码或影响主题代码(17)的中断检测系统调用,并作为响应地调整全局令牌(501)以显示对共享资源(401)的潜在干扰。
21.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于执行关于第一主题线程(171)的步骤(c);调整关于第二主题线程(172)的全局令牌(501);以及执行关于第一线程(171)的步骤(d),从而确定第二主题线程(172)对共享资源(401)的干扰。
22.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于将从主题设置指令获得的数据存储到本地数据结构(502)中;以及将从主题检查指令获得的数据与从本地数据结构(502)获得的数据(523、522)进行比较。
23.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于将本地地址存储在本地数据结构(502)中,所述本地地址从用于从共享资源进行读取的主题设置指令中指定的主题设置地址获得;以及将本地地址(523)与从主题检查指令获得的检查地址进行比较。
24.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于将本地值(522)存储在本地数据结构(502)中,所述本地值存储从关于主题设置指令中指定的设置地址的共享资源(401)读取的数据值;以及将本地值(522)与从关于主题检查指令中指定的检查地址的共享资源(401)读取的数据值进行比较。
25.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于在本地数据结构(502)中存储以下项从用于从共享资源(401)进行读取的主题设置指令中指定的设置地址获得的本地地址(523);和存储从关于所述设置地址的共享资源(401)读取的数据值的本地值(522);将本地地址(523)与从主题检查指令获得的检查地址进行比较;以及将本地值(522)与从关于检查地址的共享资源读取的数据值进行比较。
26.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于响应于主题检查指令翻译器设备将新的数据值存储到共享资源(401)。
27.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于在步骤(d)调整全局令牌(501)。
28.如权利要求18所述的翻译器设备,其中,全局令牌(501)是数字计数器值。
29.如权利要求28所述的翻译器设备,其中,翻译单元(19)被安排用于通过复制全局令牌(501)的当前值来存储本地令牌(521)。
30.如权利要求28所述的翻译器设备,其中,翻译单元(19)被安排用于通过递增计数器来调整全局令牌(501)。
31.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于在目标处理器(13)上原子调整全局令牌(501)。
32.如权利要求18所述的翻译器设备,其中,翻译单元(19)被安排用于执行从主题代码(17)到目标代码(21)的动态二进制翻译。
33.如权利要求18所述的翻译器设备,其中,目标处理器(13)包括与主题处理器(400)类型不同的处理器。
34.一种其上记录有通过计算机实现的指令的计算机可读介质,所述指令执行提供共享资源的访问协调机制的方法,所述方法用于在从具有多个主题线程(171、172)的主题代码(17)到能够被目标处理器(13)执行的目标代码(21)的程序代码转换,所述方法的特征在于以下步骤
(a)提供以下项多个本地数据结构(502a、502b),每个本地数据结构都与多个主题线程(171、172)中的一个相关联;以及全局令牌(501),对于主题线程(171、172)中的每一个都是共用的;
(b)对主题代码(17)解码,以识别设置与共享资源(401)相关的主题访问协调机制的主题设置指令和检查主题访问协调机制的主题检查指令;
(c)响应于主题设置指令,产生用于调整全局令牌(501)的目标代码(21),并在当前线程的本地数据结构(502)中至少存储本地令牌(521),其中,所述本地令牌(521)从调整的全局令牌(501)得到;
(d)响应于主题检查指令产生目标代码,所述目标代码用于将至少存储的本地令牌(521)与全局令牌(501)进行比较以确定对共享资源(401)的潜在干扰。
35.一种本地数据结构,包括一个或多个本地令牌、本地地址和本地值。
全文摘要
一种动态二进制翻译器(19),将主题程序(17)翻译成目标处理器(13)上的目标代码(21)。对于多线程主题环境,翻译器19提供对每个线程(171、172)共用的全局令牌(501),以及一个或多个系列的本地数据(502),全局令牌和本地数据一起被采用以协调对作为共享资源的存储器(18)的访问。调整全局令牌(501)允许每个线程中的本地数据结构(502a、502b)检测对共享资源(18)的潜在干扰。
文档编号G06F9/45GK101194230SQ200680020005
公开日2008年6月4日 申请日期2006年6月5日 优先权日2005年6月6日
发明者保罗·诺尔斯, 加文·巴拉克劳 申请人:特兰斯蒂有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1