书签 分享 收藏 举报 版权申诉 / 26

虚拟机中方法调用的加速.pdf

  • 上传人:32
  • 文档编号:1046241
  • 上传时间:2018-03-28
  • 格式:PDF
  • 页数:26
  • 大小:1.28MB
  • 摘要
    申请专利号:

    CN03137465.4

    申请日:

    2003.06.24

    公开号:

    CN1495608A

    公开日:

    2004.05.12

    当前法律状态:

    终止

    有效性:

    无权

    法律详情:

    专利权的终止(未缴年费专利权终止)授权公告日:2006.4.12|||授权|||实质审查的生效|||公开

    IPC分类号:

    G06F9/45

    主分类号:

    G06F9/45

    申请人:

    松下电器产业株式会社;

    发明人:

    莫拉德·德巴比; 那蒂亚·塔乌比; 萨米·佐阿; 莫拉德·伊里欧; 拉米亚·凯塔里; 哈姆蒂·雅夏欧

    地址:

    日本大阪

    优先权:

    2002.08.22 US 60/405,266

    专利代理机构:

    北京律诚同业知识产权代理有限公司

    代理人:

    徐金国;陈红

    PDF完整版下载: PDF下载
    内容摘要

    一种基于计算机平台的系统通过提高方法调用的速度来提高代码执行速度。一虚拟机包括一装载器、一解释器和一线程管理器。装载器利用方法特征构建一散列表,解释器搜索该散列表以找到各方法的位置。解释器利用有一指向一接收器的指针的方法调用高速缓冲存储器来提高代码运行速度。线程管理器用一深度水平来提高锁定状态转换的速度。

    权利要求书

    1: 一种用来提高至少一个程序执行速度的基于计算机平台的系统,该系 统包括: 一虚拟机,它有一装载器和一解释器,所述虚拟机利用所述装载器将程序 装入所述虚拟机中,而利用所述解释器执行所述程序; 所述装载器构建与至少一个程序类对应的至少一个散列表,所述装载器利 用所述类的至少一个方法的至少一个被散列方法特征构建所述散列表;和 解释器用一散列表查找代码配置来搜索属于一给定程序类的至少一个给 定方法,所述散列表查找代码配置为与所述给定方法对应的一个散列表入口搜 索所述被散列方法表。
    2: 按照权利要求1的系统,其中所述被散列方法特征是通过将一散列函 数用于所述类的所述方法一个特征得到的。
    3: 按照权利要求2的系统,其中所述散列表包括; 至少一个散列表索引,它对应于所述被散列方法特征; 至少一个方法标志位;和 至少一个指针,它用于所述类的所述方法的定义。
    4: 按照权利要求3的系统,其中所述散列表还包括: 一冲突列表,它用来处理与所述散列表的一个公共所述索引对应的多个被 散列方法特征。
    5: 按照权利要求4的系统,其中所述装载器包括一用来更新所述冲突列 表的冲突处理器。
    6: 按照权利要求5的系统,其中所述冲突处理器被优化为能够处理一些 冲突的情况,这些情况中,多个被散列方法特征对应于所述散列表的一个公共 所述索引。
    7: 按照权利要求6的系统,其中当所述散列表查找代码配置不能找到与 所述给定方法的所述散列表入口的位置时,所述散列表查找代码配置搜索所述 类的所述冲突列表。
    8: 按照权利要求7的系统,其中当所述散列表查找代码配置在所述冲突 列表中不能找到与所述给定方法对应的所述散列表入口的位置时,所述散列表 查找代码配置搜索所述类的一个超类。
    9: 按照权利要求1的系统,其中所述虚拟机是一千字节虚拟机(KVM), 它在与一电子设备有关的存储环境中运行,所述解释器是一字节码解释器。
    10: 按照权利要求1的系统,其中所述虚拟机是一JAVA虚拟机(JVM)。
    11: 按照权利要求1的系统,其中所述散列表需要有关最佳的存储容量。
    12: 一种用来提高至少一个程序执行速度的基于计算机平台的系统,该系 统包括: 一虚拟机,它有一解释器,所述解释器对第一接收对象起作用; 一高速缓冲存储器,它与所述解释器相关,所述高速缓冲存储器包括至少 一个存储高速缓存入口,所述高速缓存入口存储指向第二接收对象的至少一个 第一链接和指向一方法的第二链接;和 当所述第一接收对象与通过存储于所述高速缓存入口中的所述第一链接 访问的所述第二接收对象相匹配时,所述解释器利用所述高速缓冲存储器中的 所述入口,通过所述第二链接直接访问所述方法。
    13: 按照权利要求12的系统,其中当所述第一接收对象不与通过存储在 所述高速缓存入口中的所述第一链接访问的所述第二接收对象相匹配时,所述 解释器对一方法表进行查找,以搜索所述方法。
    14: 按照权利要求12的系统,其中所述解释器包括: 一高速缓存处理模块,它用来使所述第一接收对象与所述第二接收对象相 匹配。
    15: 按照权利要求14的系统,其中当第一类与通过存储在所述高速缓存 入口中的所述第一链接访问的所述第二接收对象的所述第二类相匹配时,所述 高速缓存处理模块通过所述第二链接直接访问所述方法,所述第一接收对象是 所述第一类的一个实例。
    16: 一种用来提高至少一个程序执行速度的基于计算机平台的系统,该系 统包括: 一虚拟机,它有一线程模型,该线程模型用来执行有至少一个类的程序, 所述类具有至少一个对象; 对该对象起作用的所述线程模型的至少两个线程,所述线程模型利用一深 度水平(deep level)控制所述对象的锁定,从而控制所述线程对所述对象的访 问,其中所述深度水平具有至少两个不同的锁定状态。
    17: 按照权利要求16的系统,其中第一深度水平代表一个简单锁定状态。
    18: 按照权利要求17的系统,其中所述第二深度水平代表一个扩展锁定状 态。
    19: 按照权利要求18的系统,其中所述深度水平中的变化产生所述简单锁 定状态与所述扩展锁定状态之间的转换。
    20: 一种执行一个程序的基于计算机平台的虚拟机,该程序具有至少一个 类,该类具有至少一个方法,该虚拟机包括: 一装载器,它采用一个散列表和一个散列表查找代码结构来搜索对该类的 一个对象起作用的方法; 一解释器,它用来执行所述装载器装入的方法,一高速缓冲存储器与所述 解释器相关,所述高速缓冲存储器由至少一个高速缓存入口组成,所述高速缓 存入口包括至少一个指向该对象的链接;和 所述解释器使用的一个线程模型,所述线程模型的至少两个线程对该对象 起作用,所述线程模型用一深度水平控制该对象的锁定,其中深度水平中的变 化产生至少两个不同锁定状态之间的转换。
    21: 一种用来提高至少一个程序执行速度的基于计算机平台的方法,该方 法包括: 用一装载器将该程序装入一虚拟机内; 构建与该程序的至少一个类对应的至少一个散列表; 用所述类的至少一个方法的至少一个被散列方法特征来构建所述散列表; 和 用一散列表查找代码配置来解释所装入的所述程序,以搜索属于该程序一 个给定类的至少一个给定方法。
    22: 按照权利要求21的方法,其中构建步骤还包括: 将一散列函数用于所述类的所述方法的一个特征,以得到至少一个被散列 方法特征。
    23: 按照权利要求21的方法,其中解释步骤还包括: 为与所述给定方法对应的一个散列表入口搜索所述被散列方法表。
    24: 按照权利要求21的方法,其中构建步骤还包括: 创建一个冲突列表,用以处理与所述散列表的一个公共索引对应的多个被 散列方法特征。
    25: 按照权利要求24的方法,其中解释步骤还包括: 当所述散列表查找代码配置无法找到与所述给定方法对应的所述散列表 中一入口的位置时,搜索所述类的所述冲突列表。
    26: 按照权利要求25的方法,还包括: 优化对所述冲突列表的搜索。
    27: 按照权利要求25的方法,还包括: 当所述散列表查找代码配置无法在所述冲突列表中找到与所述给定方法 对应的所述散列表入口的位置时,搜索所述类的一个超类,其中所述类与所述 超类有关。
    28: 按照权利要求21的方法,还包括: 优化所述散列表的尺寸。
    29: 一种用来提高至少一个程序执行速度的基于计算机平台的方法,该方 法包括: 用一虚拟机处理一方法调用,所述虚拟机对第一接收对象起作用; 存储指向第二接收对象的至少一个第一链接和指向一方法的至少一个第 二链接; 使所述第一接收对象与所述第二接收对象相匹配;和 当所述第一接收对象与所述第二接收对象之间成功匹配时,通过所述第二 链接直接访问所述方法。
    30: 按照权利要求29的方法,还包括: 当所述第一接收对象不能与通过存储在所述高速缓存入口中的所述第一 链接访问的所述第二接收对象相匹配时,在一方法表中进行查找,以搜索所述 方法。
    31: 一种用来提高至少一个程序执行速度的基于计算机平台的方法,该系 统包括: 在一虚拟机中提供一线程模型,用以执行具有至少一个类的程序,所述类 具有至少一个对象; 利用一深度水平控制所述线程模型对所述对象的锁定,用以控制所述线程 模型的至少两个线程对所述对象的访问,其中所述深度水平具有至少两个不同 的锁定状态。
    32: 按照权利要求31的方法,还包括: 用第一深度水平代表一简单锁定状态。
    33: 按照权利要求32的系统,还包括: 用所述第二深度水平代表一扩展锁定状态。
    34: 按照权利要求33的方法,还包括: 用所述深度水平中的变化,在所述简单锁定状态与所述扩展锁定状态之间 产生转换。

    说明书


    虚拟机中方法调用的加速

        本申请要求享有2002年8月22日提出的第60/405,266号美国临时申请的利益。以上申请所披露的内容在此引用以作参考。

        【技术领域】

        本发明涉及提高代码执行速度,尤其涉及在象JAVA这样的面向对象的环境中运行的虚拟机中方法调用机制(mechanism)的加速。

        背景技术

        面向对象的语言支持继承性和多态性以允许开发灵活且可重复使用的软件。一种典型的面向对象的程序包括一组类。这些类中的每一个都可以定义一组数据成员。另外,每一个类可以包括一组方法,这些方法对该组数据成员起作用。

        继承性使一个类能够“继承”或派生(derive)一个父类的各个能力(capability)。因此,由于有继承性,所以一个给定的方法可以为父类和子类所共有。当调用这样一个共有方法时,执行机制必须确定所调用的方法是否正在对父类或子类的对象起作用。用方法特征区分对各对象起作用的方法,这些特征通常由以下部分组成:方法名;参数数量、参数类型和参数顺序(order);对象的相关类。

        给定对象地类型通常会在运行时间得以确定。将这种在运行时间确定对象类型的方法称为“动态连接”。在这方面,对所要执行的适当方法的选择是基于一查找机制(lookup mechanism),这意味要在调用之后执行的实际方法是基于该方法接收器的类型、类层次性和方法继承性或重载模式(overloadingschema)而动态确定的。下面描述一种典型的查找机制。

        这种查找机制确定出现调用时所要执行的实际方法。如果一个类执行了与所调用方法具有相同特征的方法,那么执行找到的方法。否则,以递归的方式检查父类,直到找到搜索的方法为止。如果没有找到任何一个方法,那么就发出一个错误信号(MsgNotUnderstood)。就执行时间和其他资源而言,这种操作发生得过于频繁且花费昂贵。因此,需要提高查找机制的速度。

        静态技术对该查找的一部分进行预先计算,而动态技术采用前面查找的结果的一个高速缓冲存储器,这样避免了其他查找。最重要的动态连接算法称为分派表搜索(Dispatch Table Search)(DTS)。就空间成本而言,这种DTS是一种很好的方法,但是,与DTS有关的搜索负担使得该机制过于缓慢。需要减少与DTS有关的开销。现已提出许多技术来减少与DTS有关的开销:对查找的一部分进行预先计算的静态技术和高速缓存前面查找的结果的动态技术,这样避免了其他查找。下面描述上述技术。

        一种称为选择表索引(selector table Indexing)(STI)的技术是用来加速查找机制的静态方法。下面将简述这种STI技术。假定有一C类和S选择器的类层次结构,建立起一个C*S项的二维阵列。在每一个轴上为各个类和选择器赋予连续的号,通过预先计算每一个类和选择器的查找来填充该阵列。一个阵列项含相应方法或一个错误处理程序(error routine)的一个基准值。为一个完整的系统计算这些表。

        STI技术传送快速和恒定的时间查找。但是,STI的主要缺点在于,对于一个具有有限计算资源的普通系统例如一个嵌入式系统来说,对于空间的需求是巨大的。现已提出许多分派表压缩技术以减小所需空间的间接开销,象选择器着色(selector coloring),行位移技术等等。但是,这些技术的实施给象嵌入式系统这样的有限计算资源环境带来了不必要的负担。这种技术的另一个缺点是,编译代码对类层次结构中的变化非常敏感。通过STI建立的二维阵列固定于编译时间。但是对于象JAVA这样的语言来说,这组类能够动态变化。STI无法控制这一情形,因为它不能动态改变该阵列。

        同步技术改善了用来执行多线程应用的线程模型功能。这种用于传统嵌入式JAVA虚拟机中的同步技术(尤其是那些基于千字节虚拟机的技术)与四状态中的一个对象状态相关联:(1)未锁定,(2)简单锁定,(3)扩展锁定(extend locked),或者是(4)与一个监视程序(monitor)有关的状态。因此,需要同步技术不与任何特定的锁定状态相关联。

        所以,就计算资源处理/执行时间、存储器和方法搜索或查找而言,需要一套辅助操作要求低的技术。甚至在接收对象频繁变化的情况下,这套技术也应当有效。另外,需要一种机制,它能够提高象嵌入式系统这样的有限资源计算环境中运行的虚拟机中的代码执行速度。

        【发明内容】

        一种基于计算机的系统通过提高方法调用的速度来提高代码执行速度。一个虚拟机包括一装载器、一解释器、线程管理器和其他模块和/或部件。装载器利用方法特征构建一个散列表(hash-table)。解释器利用所构建的散列表来提高搜索方法的处理速度。该解释器构建一个具有一指针的方法调用高速缓冲存储器,并且将其用于一接收器以提高代码执行速度。该高速缓冲存储器提供修正后的守卫条件(guard condition),这些条件使得能够进行更快的高速缓存操作,这种操作使得执行速度更快。线程管理器采用一个用来提高锁定状态过渡速度的深度级。该深度级表示简单锁定状态和扩展锁定状态,这样,消除了对一分离简单锁定状态的需求。锁定状态数目越小,锁定状态过渡速度越快,从而代码执行速度越快。通常,本发明能够在任何虚拟机中实施,例如JAVA虚拟机(JVM)和千字节虚拟机(KVM)环境中。尤其是,本发明能够在具有相对有限计算资源的嵌入式系统中实施。

        根据下文提供的详细描述,本发明的其他适用范围将变得很明显。应理解的是,表示本发明优选实施例的详细描述和具体实例仅仅用于说明本发明而不是用来限制本发明的范围。

        【附图说明】

        根据详细的说明和附图,能够更完整地理解本发明,这些附图中

        图1是本发明一个实施例中一虚拟机的方框图;

        图2A示出一典型的类层次;

        图2B示出用于查找加速过程中的一个方法散列表;

        图3示出一典型方法散列表构建程序;

        图4描述了一种用来搜索散列表中一方法的典型散列查找程序;

        图6示出包括到接收器的一个链接的高速缓存入口(cache entry);

        图7示出代表一已知线程模型的第一自动过程;

        图8示出用来提高多线程应用速度的最优自动过程;

        图9示出用来表示被继承方法调用中各改进的典型类层次76;

        图10示出本发明一个实施例中比较方法调用时间的柱形图;

        图11示出一饼分图,它表示本发明一个实施例中的加速度/加速变化率。

        【具体实施方式】

        以下对优选实施例的描述实际上仅仅是示例性的,其决不用来限制本发明、其应用或者用途。

        一个面向对象(“OO”)的程序由包含数据成员和对这些数据成员起作用的方法的各个类组成。这样,一个OO程序中的一个方法是一给定类的一部分。前面所表示/定义类的对象可以是例示的。每一个给定类式的各个示例对象拥有在给定类表示/定义中表示的数据成员。通常,那些是给定类式一部分的方法对例示对象起作用。

        一个例子示出了一OO程序中的典型结构。一典型OO程序可以有两个类,它们分别称为类A和类B,其中类B继承类A,或者由类A派生。类A可以定义一个方法m,由于这种继承性,类B也将方法m作为其一部分。类A式的对象将方法m作为它们的一部分,那么,由于继承性,类B的对象也将方法m作为他们的一部分。各方法特征用来区分如下所述的各方法。

        OO环境通常用一些方法特征来区分任何两个表面上类似的方法,这些特征是利用类名、方法名、各参数和返回类型(return type)形成的。当一执行引擎(execution engine)遇到调用关于一给定对象的方法m时,它利用被调用方法的特征来查找方法表中该方法的定义位置。这种方法定义的搜索是一种时间密集型任务(time Intensive task)。本发明使得方法查找和执行所需的时间最少,同时对任意给定环境的计算资源的需求最少。

        OO语言如JAVA采用一种频繁的动态发送机制来搜索一被调用方法的定义。该方法可以定义于一个以上的类中。对适当方法定义的搜索是动态进行的。这导致产生一个相当大的执行时间辅助操作。通常,已有的静态和动态技术不适合象嵌入式JAVA这样在相对严格资源约束条件下运行的嵌入式平台。尤其是,这些技术是存储加强型的,对于具有有限存储资源的普通嵌入式系统来说,这不是一个理想的特性。

        本发明涉及用来加速OO环境中方法调用机制的动态、灵活而有效的技术。为了进行说明,在关于嵌入式系统应用中采用JAVA的虚拟机的上下文描述中讨论这种方法调用加速机制。本领域的那些技术人员会理解的是,采用JAVA的嵌入式系统仅仅用作解释说明,而不是限制性的。本发明可以在任何面向对象的环境中运行和/或应用。本发明的加速技术覆盖方法调用过程的多个方面,例如查找方法、高速缓存方法和同步的方法。以下把一个虚拟机作为将本发明技术用于本发明一个实施例的平台进行描述。

        图1是本发明一个实施例中一虚拟机10的方框图。虚拟机10与一操作系统12密切配合工作。一装载器(loader)14把要执行的代码装入虚拟机10中。装载器14包括诸如散列编制器(hash builder)16和散列查表18之类的散列管理模块。校验器(verifier)20校验所装入的类和代码是否有可能的错误。装载器14还装载来自语言类库18和自然类库(native class library)24的任何程序和/或类。

        解释器26解释并执行装载器14所装入的代码。高速缓冲存储器28和高速缓存信息处理器30是解释器26的一部分,它们用来高速缓存方法调用命令。堆栈管理和无用单元回收模块32被解释器26用来创建和破坏堆栈上的对象。解释器26用线程管理器34来控制正在执行的代码的线程操作。由于各种线程在代码执行的过程中竞争访问各对象,所以线程管理器34对各对象执行锁定和解锁操作。另外,线程管理器34还管理线程切换。

        以上关于虚拟机10的描述涉及一种普通的虚拟机。这样一个普通虚拟机10的具体例子是JAVA虚拟机(JVM)。作为另一个例子,现提及一KVM(千字节虚拟机)。KVM通常用于需要覆盖区小的JVM的嵌入式系统应用环境中。在KVM或JVM中,装载器14作为一个类文件装载器工作,它装载系统和用户定义的类。另外,装载器14构建常数池(constant pool)和类文件结构,并且与类和代码校验器20相互作用,类和代码校验器20在本例中将校验所装载字节码的模式安全性(type safety)。解释器26用来解释一个所装载类文件的字节码。线程管理器34管理应用线程。本领域的那些技术人员会理解的是,以上对JVM和KVM的描述用于解释,他们有助于理解本发明,但并不是限制性的。下面描述方法查找的加速。

        图2A示出一典型类层次36。类A38包括方法‘m’。类B40是父类A38的子类。类B40包括方法m、m1和m2。类B40从类A38继承了方法m。下面描述这种典型类层次36的基于散列表的查找。

        图2B示出用于查找加速过程中的方法散列表42。虚拟机的装载器14(见图1)为上述类层次的每一个虚拟方法表构建一个散列表42。通过象散列法这样的直接访问技术,提高方法表查找速度。它是利用适当的散列技术和一有效的散列函数(hashing function)实现的:

        可以以多种方式构建方法特征(图中未示)。例如,可以用方法的名称及其形式参数的数目和类型来构建一个方法特征。散列表42的每一个索引对应于一个结果,该结果是将一散列函数用于该方法特征得到的。应当仔细选择散列表42的大小,以便令其覆盖区小,同时使各方法特征之间的冲突最小,从而获得更有效和灵活的查找机制。由于通过采用散列法访问的方式对所提供的方法表直接访问,所以能够实现有效性。由于能够调整散列表42的大小以使加速与覆盖区之比最佳,所以能够实现灵活性。

        在装载一类的过程中,散列编制器16构建一个散列方法表。根据方法特征计算散列。散列表42中的每一入口由两个部分组成。第一个部分是一标志位(flag),该标志位表示该类是否含具有这样一个定义的方法。在本例中,示出第一部分441-445。在第一部分441和444中存在标志“1”就表示,对于其方法特征散列在第一第一部分441和444的散列索引上的那些方法来说,与方法定义的链接是有用的。

        第二部分是一个去方法定义的指针。在有冲突的情况下,该第二部分是一个去方法定义列表的指针。这里,第二部分461是第二方法m2的单个方法定义,因为没有其他方法特征散列至第一部分441的散列位置。但是,第一部分444散列位置的第二部分是一冲突列表,因为方法m和m1各自的两个方法特征散列到同一个第一位置444上。因此,分别将方法m和m1方法定义的冲突列表表示为第二部分462和463。

        图3示出一典型的方法散列表构建程序。装载器14(见图1)可以令一内置散列编制器16(见图1)构建散列表42(见图2B),或者该散列编制器16可以是一外部可调用程序。本领域的那些技术人员会理解的是,装载器14内部或外部的散列构建程序的位置并不以任何方式限制本发明。以下详细解释对散列表42的构建和散列编制器16的工作。

        散列编制器16处理装载器14所装入的类。对于给定装入类中的每一个方法来说,散列编制器16根据该方法的特征计算一个散列。利用所产生的散列,散列编制器16得到散列表42中散列索引处的元素(element)。在一方法定义已经存在于所访问散列位置上的情况下,如该散列索引处标志位所确定的那样,那么为新方法创建一冲突入口。但是如果该散列索引处的标志位是“OFF”,指示没有任何方法入口,那么在所计算的散列索引处将该方法记入散列表42中。

        图4描述了一种用来搜索散列表中一方法的典型散列查找程序。散列查表18(见图1)采用一散列值,该散列值是将一散列函数用于访问散列表42(见图2B)中相应入口/索引的方法特征而得到的。采用该散列值,散列查表18确定所访问散列索引/入口处的标志位值。如果与该入口有关的标志位是ON(如图2B中‘1’所示),那么由于有该入口的第二部分,它访问该方法定义。标志位的OFF状态(如图2B中‘0’所示)表示该类没有执行这样一个方法,搜索指向一超类。

        与基于简单表的搜索相比,基于散列的方法定义访问方式使得搜索时间更快。这种查找方法加速取决于散列表尺寸。较大的散列表尺寸需要较大的存储空间,但是使冲突最小。另一方面,较大的散列表尺寸可能在存储管理(分配、无用单元回收、压缩等等)方面导致产生附加开销。

        本领域的那些技术人员会理解的是,本发明可以以多种方式实施。例如,在一个实施例中,虚拟机10可以构建成包括必要的基于散列的查找元素。作为选择,一传统的虚拟机可以如下所述修改成提供基于散列的查找。

        上述查找加速可以在一个传统的嵌入式JAVA虚拟机内实施,例如在以下的KVM(千字节虚拟机)中实施。普通KVM中的方法查找机制是线性的,即,它采用了一个顺序访问的方式。基于散列的查找在用于普通KVM中的线性方法查找之上具有更好的性能。这样一个机制的执行将影响虚拟机10(见图1)的两个部分:装载器14和解释器26。装载器修改成构建每一个所装入类的散列表42。解释器修改成利用散列表42来执行快速而直接的访问查找。

        动态技术存在于前面查找的高速缓存结果中。采用高速缓冲存储器的技术消除了对创建大分派表的需要,这就减少了存储的辅助操作,缩短了表创建时间。全程高速缓存技术存储前面的查找结果。在一全程高速缓存表中,每一入口由三个一组组成(接收类、选择器和方法地址)。接收类和选择器用来计算高速缓冲存储器中的一个索引。如果当前类和方法名与所计算索引处高速缓存入口内的那些匹配,那么执行该方法地址处的代码。因此,避免了方法查找。否则,采用一默认分派技术(通常是DTS),而在该搜索的结尾处,把新的三个一组加到该高速缓存表上,将控制转移给所找到的方法。这种算法所需的运行时间存储量很小,通常是高速缓冲存储器的固定量和DTS技术的辅助操作(overhead)。接收类的频繁变化可能会使执行速度放慢。

        图5示出一种用来存储方法调用命令的已有高速缓冲存储器布局。以一有代表性的格式示出高速缓存入口48,下面描述其内容。内容链接50是一去被调用方法的指针。CodeLoc 52是去调用过该方法的指令的指针。原始参数54代表该方法最初被调用时所用的参数。原始指令56指向用来调用该方法的指令。在传统的内联(Inline)高速缓存技术(如KVM中执行的技术)中,只有去方法定义的指针存储在高速缓存入口48中。下面描述修改后的高速缓冲入口结构和高速缓存处理机制。

        图6示出包括到接收器的一个链接的高速缓存入口58。把调用一方法所涉及的一个对象称为‘接收器’,因为它接收来自其他对象的方法调用请求。接收器指针60指向该接收器。高速缓存入口58的其他成员类似于上述高速缓存入口48。高速缓存入口48除了高速缓存所述的方法调用详细内容外,还高速缓存指向接收器的链接或指针。当调用一方法时,将接收器的类与所调用方法的类作比较。如果这两类相等同,那么由于有该高速缓存入口而重新得到该方法定义。如果不等同,则进行动态查找以在该类层次中搜索该方法定义。这种高速缓冲存储器布局的修改提高了如下所述方法查找过程的速度。

        可以用一高速缓存方式提高方法调用速度。一种内联高速缓存技术能够利用一修改的高速缓冲存储器布局显著提高程序执行速度。这种内联高速缓存技术在于,在每一个调用位置上,自己将前面查找的结果(方法地址)高速缓存在代码中。内联高速缓冲存储器通过借助默认方法查找方式找到的方法直接调用操作来重写调用指令,从而改变该调用指令。内联高速缓冲存储器假定接收器的类频繁改变,但是当不是这种情况时,内联高速缓存技术可以提供缓慢的执行时间。

        通过避免接收器的类与所调用方法的类之间有一失配时的许多动态查找操作,这种内联高速缓存技术可以得到显著改善。万一发生这样的失配,如果高速缓存处理器30能够检查出接收器没有改变,那么可以从该高速缓冲存储器中重新得到该方法定义。这可以通过以下步骤进行:将一指针加到该高速缓存结构中的接收器上;修改守卫高速缓存恢复的条件。

        以上描述了高速缓存入口58中接收指针60的添加。可以将高速缓冲存储器的守卫条件修改成利用接收指针60的存在。当调用一方法时,高速缓存处理器30检查下述的守卫条件。

        第一守卫条件是,一给定高速缓存入口58中的接收器的类是否等于所调用方法的类。第二和另一个守卫条件是,当前接收器是否等于接收指针60所指向的高速缓存的接收器,即,该接收器是否仍未受到改变。如果满足这些守卫条件中的任意一个,高速缓存处理器30就重新得到该高速缓存入口58,从而在不必经受方法表查找或搜索的情况下,访问该方法定义。本领域的那些技术人员会理解的是,检查接收器是否尚未受到改变的该另一个守卫条件使得高速缓存恢复过程更灵活。该另一个守卫条件要求接收指针60设置在修改后的高速缓存入口58中。

        下面描述本发明一个实施例中高速缓存操作的一个例子。在本例中,考虑一对典型的类X和Y(图中未示)。类Y从类X那里继承了一个非静态方法m。在采用类X和Y的一个OOP程序代码中,存在一个指令环(loop),它将被频繁执行。在这样一个指令环中,关于一对象OB而调用方法m,这里OB是类Y一个实例。在第一次调用方法m之后,高速缓存处理器18将存储指向对象OB的接收指针60,还将其他与调用有关的入口存入高速缓存入口58中。对于对方法m后来的调用,接收指针60的类,即,类Y不同于成为类X的所调用方法的类。第一守卫条件,即,高速缓存入口58中接收器的类(类Y)是否等于所调用方法的类(类Y)这一条件将失效,不进行高速缓存恢复操作。但是,第二守卫条件,即,当前接收器是否等于接收指针所指向的高速缓存的接收器这一条件将会得到满足,因为他们都指向同一个对象OB。因此,第二守卫条件便于利用高速缓存入口58中的接收指针对高速缓存方法调用进行更快的查找。

        上述条件下对高速缓存技术的比较显示,本实施例中修改后的高速缓存技术具有较好的查找性能。没有接收指针60的高速缓冲存储器(见图5)将对后来每一次方法m的调用进行动态查找,这导致辅助操作量大。这样一个高速缓冲存储器不能利用将接收指针60所指的对象与当前对象作比较的另外一个守卫条件,因为缺少接收指针。另一方面,高速缓存处理器30将简单地测试当前接收器是否等于接收指针60所指向的那个接收器。因此,在无需任何资源昂贵的查找操作的情况下,对于后来对方法m的所有调用来说,将从该高速缓冲存储器中重新得到该方法定义。这样,本发明的这种高速缓存结构和高速缓存处理机制使得速度大大提高。

        多态内联高速缓存是内联高速缓存技术的一个扩充。编译器产生对特殊存根(stub)程序的一个调用命令.每一个调用位置转到一特定存根函数(stubfunction)。该功能最初是对一方法查找的调用。每次调用该方法查找,就扩展该存根(stub)功能。在最好的情况下,该技术的成本花费在测试和直接跳转。另外,当类层次很大并且接收类频繁改变时,可执行代码能够大大扩充。

        本发明的另一个实施例实现了提供查找加速的异步线程模型。无需任何外部资源的异步单线程程序可以自由工作,而无需管理当前运行线程的状态或活动。在多个同步线程可以访问相同资源且同时运行的情况下,必须管理各种线程的冲突要求。在执行一同步方法之前,一个线程必须受到与接收对象有关的锁定。如果两个线程试图对同一对象执行该方法,那么这一操作是必须的。锁定对象显示出该执行操作。以下描述一种典型的线程模型,该模型用一对象锁定表来管理多个线程的冲突要求。

        图7示出代表一已知线程模型的第一自动过程62。第一自动过程62将对象锁定状态表示为圆圈,将状态转换表示为连接自动过程状态的有向线段。第一自动过程62由状态A-E组成,它们表示一个给定对象的锁定状态。状态A64代表一个未锁定状态;状态B66代表一个简单锁定状态;状态C68代表一个扩展状态;状态D70代表一个监视状态;状态E72代表一个例外状态。各转换由以下字母标明:‘u’、‘s’、‘e’、‘m’和‘x’。尤其是,这些字母代表以下操作:u-设定_未锁定;s-设定_简单_锁定;e-设定_扩展_锁定;m-设定监视;x-提出_例外。

        在有关给定对象的内容中描述各转换操作的相互作用。最初,对象处与一未锁定状态A64。当一线程试图锁定对象以第一次将对象的锁定状态变为简单锁定状态B66时,执行设定_简单_锁定操作。另外,当另一个线程试图锁定正处于简单锁定状态B66下的同一对象时,对象锁定状态变为扩展的锁定状态‘C’68。该对象一直保持在一扩展状态C68下,直到任何其他的线程试图进一步锁定它为止。从任意给定的状态开始,当第二线程试图锁定一对象同时另一个线程已进行了锁定的时候,可以创建一个监视状态D70。可以进行从任何状态向监视状态D70的转换。从一个同步方法中的退出,引发了从监视状态D70或扩展状态C68的转换。

        从任何给定状态向任意其他状态的转换可以有惟一的例外,这个例外就是例外状态E72。当出现一个例外信号时,对象达到例外状态E72。通过将一转换指令或命令发送给例外状态E72,也不可能退出该例外状态E72。对于其他状态,即,A-D来说,通过发送一个适当的转换指令或信号,可以转换到其他状态或转换到其自身。

        图8示出用来提高多线程应用速度的最优自动过程。它改进了虚拟机10(见图1)中所用的同步技术。通过从图7所示的自动过程中去除简单锁定状态B66,该线程模型避免了来自和去向简单锁定状态B66的转换,因此直接从未锁定状态A64转换到锁定状态C68。一深度指示器(图中未示)用来指示如下所述的锁定水平。

        当一线程试图第一次锁定一对象时,该对象从未锁定状态A64转为简单锁定状态B66(见图7)。这种情况下,将深度(对象被锁定的次数)设为一。如上所述,一对象从简单锁定状态B66转为扩展锁定状态C68。当一线程试图第二次锁定该对象时,深度增加到二,指示去向扩展锁定状态C68的转换。扩展锁定状态C68可以看成这样一种状态,即,其中深度水平可以大于或等于一。这样,采用一个深度指示器,可以消除对简单锁定状态B66的需求。

        简单锁定状态的取消改进了线程性能,因为可以避免执行某些部分代码。另外,避免了从简单锁定状态向扩展锁定的转换,使该线程模型更有效。

        图9示出用来表示被继承方法调用中各改进的典型类层次76。这里,基本类是类P78。类Q80继承并派生了类P78。类Q80扩展了类P78的被继承方法m()。类R82派生了类Q80,类S84进一步扩展了类R82。在类S84的主()方法中,对一个新目标‘o’的类型S()进行初始化。把被继承方法‘m’用作进一步描述中的一个例子,用以说明加速的结果。本领域的那些技术人员会理解的是,以上对类层次76的描述是一种典型类层次的实例,它并不以任何方式限制本发明。通常,本发明所介绍的技术表现出能够在JAVA程序执行速度方面进行高达约27%的加速。下面的描述概括了上述类层次,用以说明应用本发明的原理所得到的典型性能增强效果。

        图10示出本发明一个实施例中用来比较原始方法调用与最佳方法调用的柱形图86。假定在KVM环境下执行原始方法调用88,而用本发明的虚拟机10(见图1)执行最佳方法调用90。柱形图86的X轴代表散列表尺寸42(见图2B),而Y轴代表执行时间。如X轴上所示,散列表尺寸42从11个单位变化到29个单位。最佳方法调用90在散列表所有的尺寸42上都表现出有所改善的性能。如Y轴上所示,对于相同的方法调用来说,最佳方法调用90需要约500毫秒的时间,而原始方法调用88需要约800毫秒的时间。因而,与KVM方法调用时间相比,本发明的最佳方法调用90具有改善的执行时间。本领域的那些技术人员会理解的是,以上关于方法调用时间的比较是示例性的并具有代表性特征,但是它并不以任何方式限制本发明。

        图11示出一饼分图92,它表示本发明一个实施例中的加速度/加速变化率。标记94指示出散列表42(见图2B)的尺寸,最终的加速表示为一个相应的扇形区96。该饼分图92反映出将仿形技术(profiling technique)用于图9所示和上述的代码片断的情况。饼分图92示出,当散列表42的尺寸为最佳时,可以有较好的执行时间。在本例中,散列表的最佳尺寸约为29个单位,其相应的执行时间是27.91个单位。这可以与这样一种情况作对照,即,散列表42的尺寸是11,执行时间增加到35.97。采用本发明的灵活技术,可以选择最佳的散列表42的尺寸,从而使冲突最少,并且所需要的存储器覆盖区也有所减小。下面描述本发明总的特征。

        本发明优选用于在嵌入式系统中实施的面向对象系统,与较大的系统相比,嵌入式系统中的计算资源有限。由于系统通常是实时的,所以嵌入式系统中性能增强得很理想。另外,本发明提供灵活的方法,以使性能增强技术的资源要求最佳。这是嵌入式系统中另一个理想的特征,因为它们具有有限的存储器和处理能力。本领域的那些技术人员会理解的是,术语“嵌入式系统”用于一般方式,其覆盖了在某个资源约束条件下运行的任何系统。例如,在其中计算资源具有有限特征的采用蜂窝电话或手表的应用中运行JVM的系统。

        本发明的描述本身仅仅是示例性的,因此,那些不脱离本发明要旨的变换都确定落入本发明的范围内。不认为这些变换脱离本发明的实质和范围。

    关 键  词:
    虚拟机 方法 调用 加速
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:虚拟机中方法调用的加速.pdf
    链接地址:https://www.zhuanlichaxun.net/p-1046241.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
    经营许可证编号:粤ICP备2021068784号-1