用于在受控运行时环境中使面向对象的软件应用去同步的装置和方法

文档序号:6487337阅读:174来源:国知局

专利名称::用于在受控运行时环境中使面向对象的软件应用去同步的装置和方法
技术领域
:本公开一般地涉及受控运行时环境,更具体地,涉及用于在受控运行时环境中使面向对象的软件应用去同步的装置和方法。
背景技术
:对日益增加的软件应用可移植性的需要(即,在具有不同的硬件、操作系统等的多种平台上执行给定的软件应用的能力)以及为独立软件开发商(ISV)减少上市时间的需要已经导致越来越多的受控运行时环境的开发和使用。受控运行时环境一般使用动态程序设计语言,例如Java、C#等来实现。通常被称为运行时环境的软件引擎(例如Java虚拟机(JVM)、公共语言运行时(CLR)等)执行动态程序语言指令。运行时环境插入在将被执行的动态程序语言指令(例如,Java程序或源代码)和目标执行平台(即,执行动态程序的计算机的硬件和操作系统)之间,或者说在两者之间起到接口的作用,使得动态程序可以以与平台无关的方式来执行。动态程序语言指令(例如Java指令)不是被静态编译并直接链接到本机码或机器码以供目标平台(即,目标处理系统或平台的操作系统和硬件)执行的。相反,动态程序语言指令被静态编译为中间语言(例如,字节码),而中间语言可以被即时(just-in-time,orJIT)编译器解释或者接着编译为可由目标处理系统或平台执行的本机码或机器码。一般地,JIT编译器是由容留在目标处理平台(例如计算机系统)的操作系统中的运行时环境来提供的。因此,运行时环境,具体地说是JIT编译器将与平台无关的程序指令(例如,Java字节码、公共中间语言或CIL等)翻译成本机码(即,可由底层的目标处理系统或平台执行的机器码)。为了提高整体性能,很多动态程序设计语言以及它们支持的受控运行时环境都提供能够利用并发编程技术(例如,多线程技术)的基础结构。具体地说,很多动态程序设计语言都利用同步关键字来提供语言级的并发编程支持,并利用同步原语提供运行时级的并发编程支持。软件设计者一般在软件对象内使用同步,使得多个并发线程的执行可以共享或访问该对象及其变量,而不会引发冲突或争用。例如,在全局可访问对象(即,公共对象)的情形中,软件设计者一般假定在运行时期间会发生冲突或争用,并且在对象内包括适当的同步操作,以防止这样的冲突或争用。按照这种方式,软件设计者可以保证全局可访问对象是“线程安全的”(即,可以没有冲突或争用地被用于多线程运行时环境中)。此外,很多动态程序设计语言都为软件设计者提供了一个或多个线程安全软件对象库,这些对象可以用在多线程运行时环境中,而没有争用或冲突之忧。不幸的是,与对象同步相关联的处理开销导致执行时间的大幅减少。例如,在一些公知的Java应用和基准程序(benchmark)的情形中,同步开销可能会占用整个执行时间的10%到20%。此外,不管在运行时期间是否真的需要这种同步,同步通常都被用作在运行时期间防止发生争用(特别是在对象库的情形中)的防护措施。图1是可被用来实现这里描述的去同步装置和方法的示例性体系结构的框图。图2图示了一个示例性的高级同步代码块。图3图示了图2中所示的同步代码块的一种示例性的低级形式。图4图示了一种示例性的高级同步方法。图5图示了图4中所示的同步方法的一种示例性的低级形式。图6是图1中所示的即时编译器可被配置来从面向对象的应用去除同步的示例性方式的流程图。图7是图1中所示的即时编译器可被配置来从面向对象的应用去除同步的示例性方式的更详细流程图。图8是图1中所示的即时编译器可被配置来修改虚拟分派(dispatch)表的一种方式的更详细实施例。图9和10图示了一种示例性的多态方法实现。图11图示了可与图9和10中所示的示例性多态方法一同使用的示例性的虚拟分派表。图12是图9中所示的Derived2方法的进一步变体的示例性代码。图13是可以使用这里所描述的表切分技术来生成,以支持图12中所示代码的示例性虚拟分派表。图14是可被用来实现这里所描述的装置和方法的示例性的处理器系统。具体实施例方式图1是可被用来实现这里描述的去同步装置和方法的示例性体系结构100的框图。对于示例性的体系结构100,由一种或多种动态程序设计语言和/或指令组成的一个或多个软件应用102被提供给语言编译器104。应用102可以使用与平台无关的语言来编写,例如Java或C#。然而,也可以使用其他动态的或与平台无关的计算机语言或指令。另外,应用102中的一些或全部可被存储在将要执行该应用的系统内。附加地或替换地,应用中的一些或全部可被存储在与将要执行应用102的系统相互分离(并且可能位于远端)的系统上。语言编译器104静态编译应用102中的一个或多个,以生成编译后的代码106。编译后代码106是以二进制格式存储在存储器(未示出)中的中间语言代码或指令(例如,当编译后的应用是用Java写的时,是字节码)。对于应用102,编译后代码106可被本地存储在将要在其上执行编译后代码106的目标系统108上。目标系统108可以是下面参考图114更详细描述的计算机系统等。目标系统108可以与一个或多个终端用户等相关联。附加地或替换地,编译后代码106可以经由一条或多条通信链路被传递到目标系统108,所述通信链路例如是局域网、因特网、蜂窝系统或其他无线通信系统等。编译后代码106的一个或多个部分(例如一个或多个软件应用)可以由目标系统108来执行。具体地说,操作系统110,例如Windows、Linux等容留可执行编译后代码106的一个或多个部分的运行时环境112。例如,如果编译后的代码106包括Java字节码,那么运行时环境112就是建立在执行Java字节码的Java虚拟机(JVM)等之上。运行时环境112将编译后代码106的一个或多个部分(即,中间语言指令或代码)加载到运行时环境112可以访问的存储器(未示出)中。优选地,运行时环境112将整个应用(或者有可能是多个应用)加载到所述存储器中,并验证编译后的或中间语言代码106的类型安全性。在应用或者多个应用被运行时环境112加载到存储器中之后,与正在执行的应用所调用的、或者为执行该应用所需的方法或对象相关联的中间语言指令可以由即时(JIT)编译器114来处理。JIT编译器114编译中间语言指令,以生成由计算机系统108内的一个或多个处理器(例如,图14中所示的处理器1422)执行的本机码或机器码。JIT编译器114可以将本机码(即,与计算机系统108兼容的,因而可由计算机系统108执行的机器码)存储在JIT内存缓存(JITIMC)116中。按照这种方式,运行时环境112可以重复使用被调用(invoke或call)一次以上的、与先前编译的方法相关联的本机码。换言之,被编译为本机码并被存储在JITIMC116中的中间语言指令可以被运行时环境112重复使用并执行多次。虽然JITIMC116被描绘为运行时环境112内的JIT编译器114的一部分,但是JITIMC116的其他配置也是可能的。例如,JITIMC116可以是操作系统110所容留的其他运行时模块、会话或环境(未示出)内的另一个数据结构的一部分。在其他实施例中,特别是涉及虚拟调用的实施例中,可以实现JITIMC116,使得与将被调用的方法相关联的本机码被存储在公知的数据结构中,例如虚拟分派表。总的来说,动态程序设计语言例如Java提供两种类型的使软件设计者能够生成线程安全码或软件对象的同步。如上所述,同步后的软件对象一次仅可以由一个执行线程来访问,从而防止与该对象所使用的参数或变量相关的冲突或争用的发生。换言之,全局对象以及可由一个以上的执行线程访问的其他对象可以通过引入软件锁定和解锁机制而成为线程安全的,上述机制防止一个以上的线程访问对象。一种这样类型的同步使得代码块(即,一条或多条语句)被同步。另一种这样类型的同步使得方法(即,对代码块的调用)被同步。动态程序设计语言为了同步代码块和方法,一般既提供高级或语言级同步语句,又提供低级或受控运行时级原语。例如,在Java的情况下,关键字“synchronized(已同步)”在语言级(即,高级)被用来宣告一个块或方法将受到同步保护。另外,在Java的情况下,对应于语言级关键字“synchronized”的低级或受控运行时原语是“monitorenter”和“monitorexit”。然而,为了简化以下的讨论,低级同步原语将被称为“lock(锁定)”和“unlock(解锁)”,而高级或语言级同步语句将使用关键字“synchronized”来表示。图2图示了一个示例性的高级同步代码块,而图3图示了图2中所示的同步代码块的一种示例性的低级形式。从图3中可以看出,图2的关键字“synchronized”已被替换为“lock”和“unlock”原语,这些原语封装需要同步保护的代码块。图4图示了一种示例性的高级同步方法,而图5图示了图4中所示的同步方法的一种示例性的低级形式。和前面一样,关键字“synchronized”被替换为“lock”和“unlock”原语,这些原语封装需要同步保护的方法主体。图6是图1中所示的JIT编译器114可被配置来从面向对象的应用去除同步的示例性方式的流程图。图6中所示的方法包括多个公知的JIT编译阶段,这些阶段通常被称为JIT编译器114(图1)的前端处理。具体地说,在JIT编译处理的预通过(pre-pass)阶段(框600)中,由JIT编译器114(图1)遍历或扫描字节码(例如,编译后的代码106),并收集诸如块边界、操作数堆栈深度等信息。在中间表示(IR)建立或构造阶段(框602)中,JIT编译器114使用在预通过阶段(框600)中收集的信息为每个基本代码块建立控制流图和IR指令序列。另外,JIT编译器114还可以在扩展基础块上执行局部公共子表达式消元。在IR构建(框602)之后,JIT编译器114(图1)执行内联操作(inlining)(框604),其识别作为内联候选的调用地点(即,对象、方法等)。在执行内联(框604)时,JIT编译器114可以重复预通过和IR构建阶段(分别是框600和602),以混合将被内联的方法的中间表示和调用将被内联的方法的代码的中间表示。与已知的JIT编译器前端处理相反,JIT编译器114(图1)从已同步的代码块和/或方法调用中去除同步。下面结合图7将更详细地描述,JIT编译器114判断是否可以去除同步(框606),如果可以,则基于将被去除同步的代码的特性,以不同的方式去除组成编译后代码106(图1)的每个已同步的语句、语句块和/或方法调用的同步,或者说使它们去同步。例如,可以基于代码是否与一个块、方法调用等相关联,以不同的方式来执行去同步。可以基于已知的技术来判断是否可以从编译后的代码中去除同步。例如,逸出(escape)技术是一种公知的完整程序分析,它可以用来识别可从中安全地去除同步(即,不会引发运行时争用或冲突)的没有争用的非全局对象和/或全局对象。然而,用于判断是否可从编译后的动态代码去除同步的逸出分析和其他技术的细节对本领域的技术人员来说是公知的,因而这里不再进一步描述。在确定无法去除同步(框606)之后或者在去除了同步(框608)之后,JIT编译器114(图1)确定是否有更多的语句或方法调用要被处理以去除同步(框610)。如果还有更多的语句或方法调用需要处理,则JIT编译器114返回控制到框606。另一方面,如果已没有多余的语句或方法调用需要处理(框610),则JIT编译器114执行全局优化(框612)。如本领域的技术人员所公知的,当执行全局优化时,JIT编译器114执行拷贝传播、常数折叠、死码消除和空指针校验消除(nullpointercheckelimination)功能或活动。虽然未在图6中示出,但是JIT编译器114可以在完成全局优化(框612)之后,使用多种公知的后端JIT编译处理来继续处理。图7是图1中所示的JIT编译器114可被配置来从面向对象的应用或代码中去除同步的示例性方式的更详细流程图。一开始,JIT编译器114确定或检测正被处理的代码是否包括同步(框700)。总的来说,例如通过判断正被处理的代码是否包含“lock”或“unlock”原语,就可以检测出同步。如果正被处理的代码是基于Java的,则JIT编译器114可以通过判断是否存在原语“monitorenter”和“monitorexit”来做出这样的判断。如果JIT编译器114在框700没有检测到同步,那么JIT编译器114就在框700处等待。另一方面,如果JIT编译器114在框700处检测到同步,则JIT编译器114判断已同步的代码是不是一个块(即,一条或多条语句)。如果JIT编译器114确定已同步的代码是一个块,则JIT编译器114从正被处理的代码中去除与“lock”和“unlock”原语相关联的操作(框704),从而消除该代码的同步。在去除与“lock”和“unlock”原语相关联的操作后,JIT编译器114可以在正被处理的块之前和/或之后插入存储器壁垒(框706)(即,填充物(filler)),以保持与正被处理的代码类型相关联的存储器模型(例如,如果正在处理的是基于Java的代码,就是Java存储器模型)所需的存储器一致性。在某些情形中,有效的同步消除可能随后又变成无效的(例如,在使用动态类加载的情形中)。在这些情形中,可以在正被处理的块之前和/或之后插入某种填充间隔,从而使得该填充间隔可被修补回(patchedback)与“lock”和“unlock”原语相关联的操作。在JIT编译器114确定正在处理的代码不是已同步的块(框702)的情况下,已同步的方法调用正在被处理,并且JIT编译器114接着确定该已同步的方法调用是否被分类为虚拟(即,后期绑定)调用(框708)。众所公知,在后期绑定调用的情况下,与正被调用的代码相关联的地址在JIT编译器114进行编译时是未知的。对于基于Java的代码,包括语言,“invokevirtual”或“invokeinterface”是使用虚拟分派表来调用的虚拟调用。虚拟分派表使得JIT编译器能够索引到在运行时与虚拟方法调用相关联的适当的可执行代码部分。另一方面,包括语言“invokestatic”或“invokespecial”的基于Java的代码不是虚拟调用,因而在编译时包括地址信息。如果JIT编译器114(图1)在框708(图7)处确定所述方法调用不是后期绑定,则该方法调用是早期绑定的(即,与被调用的代码或目标代码相关联的地址在语言编译时是已知的),并且JIT编译器114克隆该方法而无需同步语句(框710)。在克隆所述方法时,JIT编译器114可以拷贝该方法,但省掉同步语句。可替换地,假如该方法不包括同步语言,则JIT编译器114可以只是重新编译该方法。无论如何,在克隆了所述方法(框710)之后,JIT编译器114就用所克隆方法的代码地址来替换调用目标地址(即,去同步的方法的地址)(框712)。如果JIT编译器114在框708处确定正在处理的代码是后期绑定的(例如,包括虚拟方法调用),则JIT编译器114修改与该方法相关联的虚拟分派表(框714),并且使方法调用地址发生偏移(框716),后面将进一步地描述。然而,在讨论JIT编译器114修改虚拟分派表(框714)并且使方法调用发生偏移(框716)的方式之前,下面将简要讨论后期绑定方法或虚拟调用。虚拟分派表通常被称为vtable,它是每个类对象的头部中的结构,其包含与实现在接口中的属性和方法相关联的实际代码的存储器地址。vtable可以以图表形式表示为一列用于构成软件对象的代码(例如,一个方法或一个集合的代码语句)的索引地址。用于调用虚拟调用的代码一般使用语言“call[vtable+offset]”来表示,其中“vtable”是接收方(即,正被调用的对象)的地址,而“offset”是vtable内用于正被调用的具体方法的对象的索引。基于在运行时完成调用的方式,虚拟调用是多态的(即,可以具有超出行为、响应或实现的东西)。结果,根据接收方的运行时类型,虚拟调用可具有多个目标。图8是描绘JIT编译器114(图1)可被配置来完成与图7的框714相关联的虚拟分派表(vtable)修改的示例性方式的更详细的流程图。一开始,JIT编译器114(图1)获得与正被处理的虚拟调用相关联的vtable(框800)。在获得要处理的vtable后,JIT编译器114创建与该vtable相关联的代码的非同步版本(框802)。通过以与图7的框710相似或相同的方式在无同步的情况下克隆方法,可以生成所述非同步版本。在生成了非同步代码后,JIT编译器114判断在框800处获得的vtable中的条目数(N)是否大于在JIT编译处理前所确定的、在与当前正被处理的方法相关联的任何vtable中所能找到的最大条目数(M)(框804)。如果N小于或等于M,则JIT编译器114将正被处理的vtable扩展M个条目(即,向代表vtable的一列索引条目添加或附加M行)(框806)。在扩展了正被处理的vtable(框806)后,JIT编译器114将非同步代码的地址存储在vtable的最后N个条目中(框808),从而造成中间的M-N个条目未被使用。然后,JIT编译器114判断是否还存在其他的与正被处理的方法相关联的vtable(框810)。如果至少还有一个剩余的vtable,则JIT编译器114返回到框800。否则,JIT编译器114将控制返回到图7的框716。如果JIT编译器114在框804处确定与正被处理的vtable相关联的条目数(N)大于M(它是在语言编译时确定的),则JIT编译器114将vtable切割成具有M个条目的多段(框812)。当然,如果条目的总数(即N)不是M的整数倍,那么这些段之一的条目数将少于M。实际上,如果正被处理的代码支持动态类加载,那么N可以超过M。在动态类加载的环境中,用于新加载的类(即,对象)的vtable可以超过值M,M是在语言编译时(即,在新的类被加载的时间之前)确定的。无论如何,在JIT编译器114(图1)将正被处理的vtable切割成M大小的多段(框812)后,每一段都被扩展M个条目(框814),并且非同步代码的地址被存储在每个vtable段的最后M个条目中(框816)。然后,JIT编译器114将扩展后的vtable段级联成单个vtable(框818),并且检查是否还有另一个vtable要处理(框810)。为了更好地理解在图7和8中描绘并且在上面描述的示例性方法使虚拟方法调用(即,后期绑定调用)去同步的方式,下面参考图9-13来描述示例性的方法代码及相关的vtable布局。图9和10描绘了一种示例性的多态方法,图11描绘了当使图9和10的示例性代码去同步时,由图8中所示的示例性方法生成的修改后的vtable。为了图9-11的示例性目的,不支持动态类加载,因而图11中所示的每个vtable的值N不可能大于在语言编译时确定的vtable条目的最大数目(M)。参考图9和10,第一或父对象900定义了一个类“Base”,被称为“Derived”的第一子类对象902覆盖在“Base”之上,被称为“Derived2”的第二子类对象904覆盖在“Base”之上。在图9的实施例中,“Base”和“Derived”实现方法“foo”的同步版本,“Derived2”实现方法“foo”的非同步版本。因而,当JIT编译器114(图1)编译图10中所示的代码时,语句“b.foo()”被编译为“invokevirtualBase.foo”,它可以调用(invoke或call)三个可能的目标(即,“Base.foo”、“Derived.foo”和“Derived2.foo”)。图11中所示的对应于各个目标“Base.foo”、“Derived.foo”和“Derived2”的原始vtable部分1100、1102和1104(下面会更详细地讨论)使得虚拟调用“invokevirtualBase.foo”能够以多态的方式来进行。具体地说,因为对于每种实现(即,“Base.foo”、“Derived.foo”和“Derived2.foo”)而言,方法“foo”被放在各自的vtable中的相同索引(即,“i”)处,所以实现了多态性。因而,如果JIT编译器114(图1)从虚拟调用或多态方法(例如图9和10中所示的实施例)中去除同步,那么该去除过程在不同实现的各自vtable之间保持了与这些不同实现相关联的代码的关系。换言之,多态方法的不同实现位于各个vtable内的相同索引位置处。此外,用来从虚拟方法调用中去除同步的同步去除过程必须确保在运行时调用的所有实现不被同步。为了保持vtable关系并且确保在运行时调用的所有实现不被同步,JIT编译器114修改与虚拟方法的(多种)实现相关联的vtable的布局(图7的框714)。如参考图8所述,vtable修改包括与正在处理的方法调用相关联的一个或多个vtable的扩展以及某些情况下的切割。继续图9-11中的实施例,JIT编译器114将扩展部分1106、1108和1110附加到各自的原始vtable部分1100-1104后面。具体地说,对vtable进行扩展,使得如果原始部分包括N个条目,则附加的M个条目被附到表的后面,以形成总共N+M个条目。值M通常被选择得足够大,以适用于所有可能的对象类型。换言之,因为值N(即,原始vtable部分中的条目数)可以随vtable而不同,所以值M(对所有的vtable都相同)可被选择为总是大于最大的N。可替换地,M可被选择为使未使用的空间最小化(与单纯最大化相反)。例如,设置M=1将产生这样一种vtable布局,其中原始代码和非同步代码在表内是邻接的(即,在原始代码和非同步代码之间没有未使用的空间)。对于图11中所示的每个vtable,最初的N个条目与原始部分(即,1100-1104部分)相关联,最后的N个条目包含与原始部分定址到的方法的非同步版本相关联的地址,而中间的M-N个条目未被使用。因而,在每个vtable内,由原始部分定址到的方法的非同步版本总是位于索引i+M处,其中“i”是与原始部分相关联的方法地址的索引位置。按上述方式修改vtable(图7的框714)的结果就是,通过经由附加的偏移(offset)将虚拟调用变换成“call[vtable+offset+M]”,从而保证无论在运行时期间调用什么样的方法实现,所调用方法的非同步版本或实现都将被调用,JIT编译器114(图1)可以有效地从已同步的虚拟方法调用中去除同步。图12和13提供了示例性的代码,如果支持动态类加载,则该代码将导致在图8的框804处N大于M,从而致使JIT编译器114(图1)执行与图8的框812-816相关联的功能。具体地说,如果在图9和10中所示的代码已被编译后加入类“Derived3”,则与用于“Derived3”的原始vtable相关联的条目数N将超过为图11中所示的vtable计算出的值M。结果,当JIT编译器114使图12中所示的代码去同步时,它通过执行与图8的框812-818相关联的功能,生成图13中所示的vtable。这里描述的去同步技术可以通过恢复所有在先的同步语义而被轻松地逆转。例如,在支持动态类加载的情况下,新类的加载可以使先前生成的同步去除分析(例如,逸出分析)结果(这些结果需要去同步代码的重新同步)无效。在去同步块的情形中,同步语句可被重新插入到它们被从中去除的代码区域中。在早期绑定调用的情形中,目标代码地址可以被修补回原始目标代码地址。在后期绑定调用的情形中,“call[vtable+offset+M]”可以被修补成“call[vtable+offset]”。图14是可用来实现这里所描述的装置和方法的示例性处理器系统1420的框图。如图14所示,处理器系统1420包括被耦合到互连总线或网络1424的处理器1422。处理器1422可以是任何适当的处理器、处理单元或微处理器,例如IntelItanium系列、IntelX-Scale系列、IntelPentium系列等当中的处理器。虽然未在图14中示出,但是系统1420可以是一个多处理器系统,因而可以包括一个或多个与处理器1422相同或相似的附加处理器,这些处理器可被耦合到互连总线或网络1424。图14的处理器1422被耦合到芯片组1428,该芯片组包括存储器控制器1430和输入/输出(I/O)控制器1432。众所公知,芯片组一般提供I/O和存储器管理功能以及多种通用和/或专用寄存器、定时器等,这些器件由耦合到该芯片组的一个或多个处理器来访问或使用。存储器控制器1430实现的功能是使处理器1422(如果有多个处理器则是使多个处理器)能够访问系统存储器1434,系统存储器1434可以包括任何需要类型的易失性存储器,例如静态随机访问存储器(SRAM)、动态随机访问存储器(DRAM)等。I/O控制器1432实现的功能是使处理器1422能够经由I/O总线1440与外围输入/输出(I/O)设备1436和1438通信。I/O设备1436和1438可以是任何需要类型的I/O设备,例如键盘、视频显示器或监视器、鼠标等。虽然在图14中存储器控制器1430和I/O控制器1432被描绘为芯片组1428内的独立功能块,但是这些功能块所完成的功能可以被集成在一个半导体电路内,或者可以使用两个或更多个独立的集成电路来实现。虽然这里已描述了某些方法、装置和制品,但是本发明的覆盖范围不限于此。相反,本发明覆盖按字面意义或等同原则落入所附权利要求书的范围内的所有方法、装置和制品。权利要求1.一种使程序代码去同步的方法,所述方法包括在所述程序代码的即时编译期间,确定所述程序代码的类型;以及基于所述程序代码的类型,在所述程序代码的即时编译期间修改所述程序代码,以使所述程序代码去同步。2.如权利要求1所述的方法,其中所述程序代码的类型是块和方法之一。3.如权利要求1所述的方法,其中所述程序代码的类型是早期绑定方法调用和后期绑定方法调用之一。4.如权利要求1所述的方法,其中所述程序代码包括同步关键字、同步语句和同步原语中的至少一个。5.如权利要求1所述的方法,其中所述程序代码与动态程序设计语言相关联。6.如权利要求5所述的方法,其中所述动态程序设计语言是基于Java的。7.如权利要求1所述的方法,其中修改所述程序代码的操作包括从所述程序代码中去除锁定函数和解锁函数的至少一个。8.如权利要求7所述的方法,还包括在从所述程序代码中去除锁定函数和解锁函数的所述至少一个后,在所述程序代码中插入至少一个存储器壁垒。9.如权利要求1所述的方法,其中修改所述程序代码的操作包括不带同步地克隆所述程序代码,以形成去同步的程序代码。10.如权利要求9所述的方法,还包括用与所述去同步的程序代码相关联的地址来替换所述程序代码的调用目标地址。11.如权利要求1所述的方法,其中修改所述程序代码的操作包括修改虚拟分派表。12.如权利要求11所述的方法,还包括使与所述程序代码相关联的虚拟分派表调用发生偏移,以引用所述虚拟分派表的修改部分。13.如权利要求11所述的方法,其中修改所述虚拟分派表的操作包括将所述虚拟分派表扩展预定数量的条目,以形成扩展虚拟分派表。14.如权利要求13所述的方法,还包括在所述扩展虚拟分派表内的最后一组条目中存储与所述程序代码的去同步版本相关联的地址。15.如权利要求11所述的方法,其中修改所述虚拟分派表的操作包括将所述虚拟分派表切割成多段,并且将每一段扩展预定数量的条目,以形成多个扩展虚拟分派表段。16.如权利要求15所述的方法,还包括在每一个所述扩展虚拟分派表段中存储与所述程序代码的去同步部分相关联的地址。17.如权利要求16所述的方法,还包括级联所述多个扩展虚拟分派表段,以形成扩展虚拟分派表。18.一种计算机系统,包括存储器;以及耦合到所述存储器并且能够执行包括即时编译器的受控运行时环境的处理器,其中所述即时编译器被配置为在程序代码的即时编译期间,确定所述程序代码的类型;以及基于所述程序代码的类型,在所述程序代码的即时编译期间修改所述程序代码,以使所述程序代码去同步。19.如权利要求18所述的计算机系统,其中所述程序代码的类型是块和方法之一。20.如权利要求18所述的计算机系统,其中所述程序代码的类型是早期绑定方法调用和后期绑定方法调用之一。21.如权利要求18所述的计算机系统,其中所述程序代码包括同步关键字、同步语句和同步原语中的至少一个。22.如权利要求18所述的计算机系统,其中所述程序代码与动态程序设计语言相关联。23.如权利要求22所述的计算机系统,其中所述动态程序设计语言是基于Java的。24.如权利要求18所述的计算机系统,其中所述即时编译器被配置为通过从所述程序代码中去除锁定函数和解锁函数的至少一个来修改所述程序代码。25.如权利要求24所述的计算机系统,其中所述即时编译器被配置为在从所述程序代码中去除锁定函数和解锁函数的所述至少一个后,在所述程序代码中插入至少一个存储器壁垒。26.如权利要求18所述的计算机系统,其中所述即时编译器被配置为通过不带同步地克隆所述程序代码以形成去同步的程序代码,来修改所述程序代码。27.如权利要求26所述的计算机系统,其中所述即时编译器被配置为用与所述去同步的程序代码相关联的地址来替换所述程序代码的调用目标地址。28.如权利要求18所述的计算机系统,其中所述即时编译器被配置为通过修改虚拟分派表来修改所述程序代码。29.如权利要求28所述的计算机系统,其中所述即时编译器被配置为使与所述程序代码相关联的虚拟分派表调用发生偏移,以引用所述虚拟分派表的修改部分。30.如权利要求28所述的计算机系统,其中所述即时编译器被配置为通过将所述虚拟分派表扩展预定数量的条目以形成扩展虚拟分派表,来修改所述虚拟分派表。31.如权利要求30所述的计算机系统,其中所述即时编译器被配置为在所述扩展虚拟分派表内的最后一组条目中存储与所述程序代码的去同步版本相关联的地址。32.如权利要求28所述的计算机系统,其中所述即时编译器被配置为通过将所述虚拟分派表切割成多段,并且将每一段扩展预定数量的条目,以形成多个扩展虚拟分派表段,来修改所述虚拟分派表。33.如权利要求32所述的计算机系统,其中所述即时编译器被配置为在每一个所述扩展虚拟分派表段中存储与所述程序代码的去同步部分相关联的地址。34.如权利要求33所述的计算机系统,其中所述即时编译器被配置为级联所述多个扩展虚拟分派表段,以形成扩展虚拟分派表。35.一种其上存储有指令的机器可访问介质,所述指令在被执行时致使机器在程序代码的即时编译期间,确定所述程序代码的类型;以及基于所述程序代码的类型,在所述程序代码的即时编译期间修改所述程序代码,以使所述程序代码去同步。36.如权利要求35所述的机器可访问介质,其中同步的程序代码与动态程序设计语言相关联。37.如权利要求36所述的机器可访问介质,其中所述动态程序设计语言是基于Java的。38.如权利要求35所述的其上存储有指令的机器可访问介质,所述指令在被执行时致使所述机器通过从所述程序代码中去除锁定函数和解锁函数的至少一个来修改所述程序代码。39.如权利要求35所述的其上存储有指令的机器可访问介质,所述指令在被执行时致使所述机器通过不带同步地克隆所述程序代码以形成去同步的程序代码,来修改所述程序代码。40.如权利要求35所述的其上存储有指令的机器可访问介质,所述指令在被执行时致使所述机器通过修改虚拟分派表来修改所述程序代码。41.如权利要求40所述的其上存储有指令的机器可访问介质,所述指令在被执行时,使与所述程序代码相关联的虚拟分派表调用发生偏移,以引用所述虚拟分派表的修改部分。42.如权利要求40所述的其上存储有指令的机器可访问介质,所述指令在被执行时,通过将所述虚拟分派表扩展预定数量的条目以形成扩展虚拟分派表,来修改所述虚拟分派表。43.如权利要求42所述的其上存储有指令的机器可访问介质,所述指令在被执行时,在所述扩展虚拟分派表内的最后一组条目中存储与所述程序代码的去同步版本相关联的地址。44.如权利要求40所述的其上存储有指令的机器可访问介质,所述指令在被执行时,通过将所述虚拟分派表切割成多段,并且将每一段扩展预定数量的条目,以形成多个扩展虚拟分派表段,来修改所述虚拟分派表。45.如权利要求44所述的其上存储有指令的机器可访问介质,所述指令在被执行时,在每一个所述扩展虚拟分派表段中存储与所述程序代码的去同步部分相关联的地址。46.如权利要求45所述的其上存储有指令的机器可访问介质,所述指令在被执行时致使所述机器级联所述多个扩展虚拟分派表段,以形成扩展虚拟分派表。全文摘要公开了用于在受控运行时环境中使面向对象的软件应用去同步的装置和方法。用于使同步的程序代码去同步的装置和方法在所述程序代码的即时编译期间确定所述程序代码的类型,并且基于所述程序代码的类型,在所述程序代码的即时编译期间修改所述程序代码,以使所述程序代码去同步。文档编号G06F9/46GK1813243SQ200480018456公开日2006年8月2日申请日期2004年3月19日优先权日2003年4月30日发明者吴甘沙,路奎元,石小华申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1