暂停期间进行字节代码优化的方法和装置的制作方法

文档序号:6414409阅读:129来源:国知局
专利名称:暂停期间进行字节代码优化的方法和装置的制作方法
技术领域
本发明一般涉及优化软件应用程序执行的方法和装置。更具体来说,本发明涉及在总体计算机程序执行的暂停期间为优化计算机系统资源的使用而执行编译或其它活动的方法和装置。
计算机系统经常通过计算机系统网络(例如局域网、内连网和因特网)连接起来以便能够共享诸如软件应用程序之类的资源。一般来说,软件应用程序或计算机程序可能要以不同的格式传递给不同的计算机系统,因为每种计算机系统一般都要求软件应用程序有特定的格式。另外,也可以将计算机程序以与机器无关的格式(即按字节代码)传递给计算机系统,以便使一种格式的计算机程序能被许多不同种计算机系统使用。
如果计算机程序是以与机器无关的格式传递的,则可以直接解释该程序,或者,也可以将程序翻译成与机器有关的代码,即“机器代码”。直接解释的程序比翻译成机器代码的程序占用更少的计算机系统空间。然而在多数情况下,直接解释的程序比翻译成机器代码的程序的执行速度慢。因此,决定直接解释计算机程序还是将计算机程序翻译成机器代码,经常是根据存储空间与执行速度之间的相对重要性。
一种编译的法是,当在实际正在执行的程序内部的子程序(method)被初始调用执行时,编译该子程序。这种方法通常被称为“运行时”编译或者动态编译。动态编译的一个问题时,程序相关的编译开销会变得过度。就是说,如果在几乎同一个时间必须编译的子程序的数量较大,则程序编译相关的开销程度之高,对总体程序执行会产生不利的影响。一般来说将系统资源过多地用于编译会导致程序执行的低效率、低速度。此外编译程序在程序实际执行期间编译子程序所花费的时间会导致产生用户可见的程序执行的暂停。例如,如果用户在程序的编译开销很高时向程序输入一条命令,则系统对该用户输入的响应可能会延迟。这种响应延迟是令用户烦恼的。因此人们期望有某种机制能改善动态编译子程序的外在效率。
为了实现本发明的以上目的和其它目的,本文介绍用于在计算机程序执行的空闲期间动态地编译子程序的方法和装置。所介绍的方法特别适用于既执行解释字节代码(interpreted byte code)又执行编译字节代码(compiled byte code)的计算机系统。根据本发明的一个方面,确定处理计算机程序中的空闲时段或低开销时段。然后在所识别的空闲期间,对已经识别出的要进行编译的一个或多个子程序进行动态编译。在有些实施例中,把要动态编译的子程序在一个或多个列表中注明。对该列表进行优先级处理以首先便利最高优先级子程序的编译。在一个实施例中,有一对编译列表,第一个编译列表是一个在处理计算机程序之前创建的数据库列表,另一个是在处理计算机程序期间创建的执行列表。
在一个实施例中,如果在编译子程序期间接到一个中断,则允许编译在预定的时段内继续执行。如果在该预定的时段内编译没有完成,则放弃编译。
根据本发明的另一个方面,在处理计算机程序中的低工作量期间动态编译字节编码的子程序的计算机系统,包含一种确定低工作量的机构。该系统进一步包括一种确定在低工作量期间内编译的子程序的机构。安排一个编译程序在低工作量期间内启动所确定的子程序的编译。在一个实施例中,该系统还包括一个中断处理器以处理在编译所确定子程序期间收到的中断信号,还包括一个中止机构以在必要时使该子程序的编译中止。
本发明的这些优点和其它优点,表现在以下的详细说明和各附图中。
以下说明结合附图来阐述本发明。附图简述

图1是表示根据本发明的一个实施例动态地编译代码的一个计算机系统的示意框图。
图2是表示按照本发明的一个实施例,执行一个具有能在暂停期间编译代码的能力的程序的相关步骤的过程流图。
图3是表示按照本发明的一个实施例,对子程序执行编译的相关步骤(即图2的步骤216)的过程流图。
图4是表示按照本发明的一个实施例,确定最高优先级子程序的相关步骤(即图3的步骤302)的过程流图。
图5是表示一个适于实现本发明的、典型的通用计算机系统。
图6是表示一个适于实现本发明的虚拟机的示意图。
如上所述,在程序实际执行期间动态编译与字节编码的程序相关的子程序,会导致程序执行效率的低下。导致这种低效的原因是,编译程序对可用计算机系统资源的使用过度,或者说编译开销过度。编译程序在程序实际执行期间动态编译子程序所花费的时间会导致程序执行的延迟。如果用户能感觉到这种延迟,则这种延迟就被视为是不可接受的,特别是当延迟时间相对较长(例如大于200毫秒)时。
提高这种程序性能的一个途径是允许混合地既解释字节代码又动态编译字节代码。在这种系统内,依然必须决定何时编译某子程序是有效率的。本发明描述的方法和装置能在编译开销相对较高时推迟动态编译子程序。更具体来说,如果判定编译开销太高,就将至少某些子程序的动态编译推迟,直到总体程序处理中出现工作量相对较低的时段。
通过将拟定要编译的字节编码子程序中至少某些子程序的动态编译推迟,计算机资源能够得到更有效的利用。当处理期间计算机程序实质上处于不活动状态时,例如当计算机程序因等待用户输入而空闲时,程序执行相关的总体资源使用开销一般相对较低。在这些低工作量的时段内,就可以把可用的系统资源用于执行对那些以前确定要编译的子程序的编译。在计算机程序的计算开销较低时进行编译,使得总体计算机系统资源的使用效率高,并且一般不会引起用户可察觉的延迟。
以下首先结合图1,说明根据本发明的一个实施例动态地编译字节代码的一个计算机系统。字节代码44作为输入被提供给运行时计算机系统146。字节代码44一般被组织为计算机程序,它一般被安排成可分析的片断,例如子程序(method)或例程。在一个实施例中,字节代码144被一个虚拟机内部的编译时环境提供到同一虚拟机内部的一个运行时环境,例如计算机系统146。本文以后将结合图6详细讨论本发明赖以实现的一个合适的虚拟机。
当字节代码144被提供给计算机系统146时,字节代码144被解释程序148处理。另外,字节代码144也可以被编译程序150编译,生成编译字节代码152。应当明白,字节代码144一般可几乎同时被输入到解释程序148和编译程序150去处理。
每当一个子程序被调用,如果该子程序未编译,就用解释程序144解释该子程序相关的字节代码144。在一个实施例中,保持一个子程序被解释的次数的量度,这种量度包括在各个被解释子程序中含有的一个计数器(即调用计数器),每解释一次子程序,计数器就递增一次。
当子程序被解释的次数超过某个阈值-即界限值时,就用编译程序150编译该子程序。重复解释某个包含在频繁执行的代码158中的子程序,效率是不不高的,因为解释字节代码154的执行速度一般比编译代码更慢,或者说效率更低。编译频繁执行的代码158能使包含在频繁执行的代码158中的子程序的执行效率更高,这是因为编译该子程序而节省的时间有可能弥补该编译过程带来的编译开销。
在运行期间,要对用编译程序150编译字节代码144相关的编译开销进行监测,以保证编译开销不超过某个预定的最大可接受的水平。编译开销经常用编译要求的处理器时间占执行要求的处理器时间的百分比来表示。预定最大开销水平的范围变动很大,它取决于具体需要以及特定系统的特性。例如,对于期望具有高执行效能的虚拟机来说,预定最大开销水平的范围可以是总体系统资源的约10%~30%。当编译字节代码144相关的编译开销超过预定最大开销水平时,就将这些在编译开销较低时本当编译的子程序放置到一个执行列表(execution list)或队列中。这种执行列表实际上是一个等待在编译开销较低时被处理的子程序列表,就是说,执行列表中的子程序可以在编译开销较低时被编译。具体来说,对执行列表处理的时机是,编译开销以及计算机系统146相关的总体计算开销都处于低水平时。
当字节代码等待着在总体程序执行中的空闲期间(例如在处理字节代码时出现的空闲期间)被编译时,对该程序进行监测,判断何时发生暂停。下面结合图2,说明按照本发明的一个实施例,执行一个能在暂停期间编译代码的程序或应用软件的过程。程序的执行开始于步骤210,在步骤212,判断程序的执行是否到达某个空闲时段。
空闲时段一般是指程序处理中的暂停(例如供思考的暂停(think pause)),在此期间程序基本处于不活动的状态。程序可能正在等待着某种行为,例如来自相关操作系统的定时器信号;程序也可能为了继续执行而正在等待着用户的输入。一般来说,当程序等待用户的动作时,发生一个供思考的暂停。应当明白,空闲时段的时间范围变动很大。例如,空闲时段的时间的变化范围可在数毫秒至半秒钟。当程序等待用户的输入而发生暂停时,空闲时段时间一般更长,例如数以秒计、数以分计、数以天计或更长的时间。
一般来说,用一个阈值来识别“有用的”暂停。例如,如果实际暂停时间延续了预定的数毫秒,则系统识别该暂停是有用的暂停,暂停可能还会延续更长时间。如果暂停有可能延续,就可以允许继续编译,以利用暂停的时间。因此,在步骤212判断程序的执行是否到达某个空闲时段,涉及判断某个低工作量的时段是否达到某个阈值,例如约100毫秒或半秒钟。
一般来说,空闲时段或相对低工作量时段的发生,可以通过监测与程序执行相关的中央处理单元(CPU)使用情况来识别。另一种方法是,通过监测与总体计算机系统相关的各线程(thread)的状态,确定是否存在空闲时段。
如果监测CPU使用来识别相对低工作量的时段,监测CPU使用实际上是要判断CPU使用何时降到某个使用阈值以下。使用阈值即“低工作量阈值”的范围变动很大。例如可以这样设定使用阈值,使得在几乎只有低开销的活动(例如设定光标周期性地闪动)在运行时,程序就可以被视为空闲。在一个实施例中,当程序处理期间CPU使用降到约占总体系统资源20%的使用阈值以下时,则总体程序处理被视为处于低工作量的时段。在这些时候,有约80%的系统资源可供使用。
监测线程的状态可能涉及分析某个线程调度器(thread shceduler),这一点本领域的熟练人员都知道。当线程调度器指示,所有线程都堵塞,即几乎没有一个线程处于“可运行的”状态时,其含义是程序不再消费CPU时间。CPU时间一般要等到某个信号到来时才被消费,因为此时某个线程会被解锁。当CPU时间不被消费时,程序一般处于空闲时段。
如果在步骤212判定程序执行不处于空闲时段,则过程流返回到步骤210,程序继续执行。反之,如果在步骤212判定有空闲时段,则在步骤214判断是否有待执行的任务,例如编译任务。就是说,判断是否有预定在空闲时段执行的任务。这些任务一般包括各种各样的任务,例如编译和收垃圾(garbage collection)。这种任务可以按在系统中的相对重要程度而被赋予优先级。在所述实施例中,以待执行编译来说明这些任务。
获得待执行编译的来源一般有两种数据库列表和执行列表,它们是待编译的“候选”子程序的列表。创建数据库列表的一种装置要涉及一种监测编译子程序(compiled methods)的系统,例如一种当数据库被直接插入时创建数据库列表的装置。在这种系统中,数据库列表实际上是子程序的“工作集合”或“候选集合”,这些子程序在以前的程序执行期间被编译过,并被视为是有可能要在以后的程序执行中编译的子程序。也可以用其它机制来创建数据库列表或向数据库列表添加子程序。应当明白,在有些实施例中,数据库列表中可以包含其它任务,例如执行收垃圾任务。
如上所述,执行列表是在当前程序执行期间创建的一个子程序队列或子程序的候选集合。执行列表可以包含或确定那些被压制不让编译的子程序,不编译这些子程序的原因是,以前认为编译开销太高,所以不能编译这些子程序。执行列表也能确定哪些子程序是被一个独立的扫除机过程(sweeper process)定期添加到该列表中的。扫除机过程检查解释子程序(interpreted methods)相关的调用计数器,即记录子程序被解释的次数的计数器。一般来说,每调用一次子程序,子程序的调用计数器就递增。扫除机定期检查调用计数器,判断最近未被调用的子程序的调用计数器是否处于一个当前看来子程序视为适合编译的水平。阈值是指子程序被考虑编译之前对子程序的调用必须要达到的次数,因为在程序执行期间阈值可能发生变化,所以那些其调用计数器超过当前阈值的子程序就可能被扫除机添加到执行列表中。也可以用其它机制来创建执行列表或向执行列表添加子程序。在有些实施例中,执行列表中可以被关联到一个总的工作列表,后者除含有待执行编译任务外,还包括其它任务,例如执行收垃圾任务。
如果在步骤214通过检查执行列表和数据库列表判定没有待执行的任务,则过程流返回到步骤210,程序在此继续执行。反之,如果在步骤214判定有待执行编译任务,则在步骤216,执行编译任务。下文将结合图3说明执行待执行编译任务的相关步骤。待执行编译任务完成后,过程流返回到步骤210,程序在此继续执行。
如上所述,在所述实施例中,编译子程序的时机是,当预期编译该子程序、调用该编译子程序有可能比解释该子程序的效率更高时。为了避免过度的编译开销,这种编译可能会被推迟到总体程序执行期间出现空闲时段。图3是表示按照本发明的一个实施例,执行推迟的子程序编译(即图2的步骤216)的相关步骤的过程流图。该执行编译的过程开始于步骤302,确定最高优先级的候选子程序。在一个实施例中,最高优先级的子程序是执行列表中的、或者是由执行列表确认的调用次数最多的子程序。另外,最高优先级的子程序也可以是执行列表中预期编译时间最短的子程序。下文将结合图4详细讨论最高优先级的子程序的确定。
在步骤302确定了最高优先级子程序后,在步骤304判断该最高优先级子程序是否已经编译过。最高优先级子程序可能由于各种原因已经编译过。例如,在该子程序被置于执行列表后,在总体程序执行期间,当编译开销较低时该子程序被调用并编译。因此,该子程序已经编译过,并且可能尚未从执行列表中删除,不即时删除的原因是反复更新执行列表的代价很高。从数据库列表中获得的最高优先级子程序也可能是编译过的子程序。就是说,假设同一个子程序既出现在执行列表中又出现在数据库列表中,例如如果已经用执行列表编译过该子程序,而数据库列表因为代价太高而没有更新,那么,该子程序被确定是数据库列表中的最高优先级子程序时,该子程序可以是已经编译了的。
如果在步骤394判定该最高优先级子程序已经编译过,则将该子程序清除出相应的列表,即执行列表或数据库列表,然后过程流返回到步骤302,去确定新的最高优先级子程序。反之,如果判定该最高优先级子程序没有编译过,则在步骤306开始编译该最高优先级子程序。就是说,对该最高优先级子程序的编译被启动。
在编译最高优先级子程序期间,可能收到中断信号。一般来说,中断信号包括但不限于定时器信号和用户输入,例如键盘输入。在步骤308,判断是否收到中断信号。本领域的熟练人员明白,当收到中断信号时,对最高优先级子程序的编译可以自动停止,以便进行必要的中断处理。
如果收到中断,则在步骤314,允许对最高优先级子程序的编译继续预定的一段时间。在一个实施例中,该预定的一段时间实际上是收到一个要将至少一个线程设置到可执行状态的信号后,用于编译的一个“生存时间”。收到中断信号后允许编译继续一段时间,如果编译接近完成,就使编译有可能完成。
尽管该预定时间段的范围变动很大,预定时间段一般只有数毫秒,即“X”毫秒。最好采用范围在10~200毫秒的较短时间段,因为据观察,对用户输入的响应延迟200ms以上就能被用户察觉,经常因此使用户烦恼。时间段根据信号的来源或者处于可运行状态中的线程的优先级的不同可以有所不同,信号或线程的优先级越高,时间段应越短。
在步骤314允许编译继续预定时间段后,在步骤316判断在预定时间段内编译是否成功地完成。如果编译已经完成,则过程流转移到图2的步骤210,总体程序执行继续。应当明白,一旦编译完成,刚刚编译的子程序将被清除出该子程序被取自的执行列表或数据库列表如果在预定时间段内编译没有完成,则过程流从步骤316转移到步骤318,编译中止。编译未被允许完成,原因是如果允许编译完成,就会导致总体程序执行的显著延迟,更具体来说,就会导致中断处理的显著延迟。编译中止时,发生“清算”,即释放试图编译时占用的系统资源,这一点本领域的熟练人员明白。编译中止后,过程流转移到图2的步骤210,总体程序执行继续。
回到步骤308,如果编译最高优先级子程序期间没有收到中断信号,在步骤310继续编译。在步骤312判断编译是否完成。如果判定编译已经完成,就从适当的列表中删除该最高优先级子程序,过程流返回到步骤302去确定新的最高优先级子程序。反之,如果在步骤312判定编译没有完成,则至步骤308,允许编译继续,直到编译完成或是因收到中断信号而中止。
一般来说,执行列表和数据库列表中子程序被编译的“次序”是由多种不同因素决定的。各列表中子程序被分配以优先权值,表示同一列表中子程序之间的相对优先关系。优先权值一般可以在总体程序执行期间的任何时候分配,在程序执行的自始至终可以进一步更新。例如,每当向列表添加一个子程序时,就可以对列表中的各优先权值进行计算和更新(即重新评估)。也可以在各空闲时段的开始重新评估优先权值,以保证在选择子程序进行编译时,执行列表和数据库列表中的子程序的优先权最新。
子程序的优先权值可以根据多种因素的任意组合进行计算,这些因素其中包括子程序的调用次数、子程序在列表中的位置、子程序的估计编译时间以及总体程序执行期间当前空闲时段的长度。另外,在一个实施例中,子程序的优先权值实际上是随机分配的。
列表中调用次数最多的子程序可能具有最高级编译优先权,因为它实际上是最频繁被调用的解释子程序。子程序在列表中的位置也可能影响分配给该子程序的优先权值,因为最晚添加到列表中的子程序经常可能很快就需要使用。列表中期望编译时间最短的子程序可能具有最高级编译优先权,因为编译一个期望编译时间较短的子程序一般比期望编译时间较长的子程序更可能在一个空闲时段内完成。一般来说,子程序的编译时间可以用子程序的长度来估计,例如,相对短的子程序一般来说编译时间相对较短。
当前空闲时段的长度也可能影响子程序的优先权值。例如,如果当前空闲时段已经相对较长,则该空闲时段延续更长时间的可能性通常就会增大。造成空闲时段时间长的原因,是用户长时间地离开总体程序执行正在进行的计算机。因此,据观察,如果判定当前空闲时段已经相对的长,那么该空闲时段将延续更长时间的可能性一般相当高。因此,当预计空闲时段会持续相当长时间时,预期编译时间较长的子程序可以具有较高的编译优先权,因为预期编译时间较短的子程序一般完全有机会可以在以后较短的空闲时段内编译。
如上所述,子程序的优先权值有许多不同的决定因素。换言之可以用一个优先权函数来确定优先权值。这种优先权函数的形式一般可能差别很大。例如一种优先权函数将子程序的调用次数除以子程序的预期编译时间,得出子程序的优先权值。另外,一种优先权函数是,对于较短预期编译时间的子程序,取其调用次数;对于较长预期编译时间的子程序,取其调用次数除以某个常数。
下面结合图4,说明表示按照本发明的一个实施例,确定最高优先级子程序的相关步骤(即图3的步骤302)。最高优先级子程序的确定开始于步骤402,该步骤判断程序相关的执行列表是否有子程序一般来说,执行列表中的子程序比数据库列表中的子程序的编译优先权更高。执行列表中的子程序是程序执行期间被确定的子程序,因为这些子程序被反复调用,所以要求编译,以更高效地执行而克服相关的编译开销。另外,数据库列表中的子程序可能是潜在会反复调用的子程序,因此编译这些子程序可能是有益的。换言之,执行列表反映子程序的当前的、或实际的利用,而数据库列表实质上反映子程序的长远的利用。因此,一般先选择执行列表中的子程序进行编译,然后选择数据库列表中的子程序,因为编译执行列表中的子程序更可能使使用这些子程序的程序的总体执行的效率更高。
如果在步骤402判定执行列表中有子程序,就在步骤404,选择执行列表中最高优先级子程序用于编译。一旦从执行列表中选出该子程序,则确定最高优先级子程序的过程完成。反之,如果在步骤402判定执行列表中没有子程序,就选择数据库列表中最高优先级子程序用于编译。一旦从数据库列表中选出该子程序,则确定最高优先级子程序的过程完成。
本发明一般可以在任何适当的计算机系统上实现。具体来说,在总体程序执行中空闲时段内可以用任何适当的虚拟机对排队的子程序进行编译。下文将结合图6描述这种虚拟机。图5表示一个适于实现本发明的、典型的通用计算机系统。计算机系统530包括任意数量的处理器532(也称中央处理单元或CPU),处理器与内存设备相连,内存设备包括基本存储器534(一般是只读存储器即ROM)和基本存储器536(一般是随机存取存储器即RAM)。
计算机系统530,更具体来说,CPU532,可以被安排去支持一个虚拟机,这一点本领域的熟练人员都知道。下文讨论图6时将描述一例计算机系统530支持的虚拟机。本领域众所周知,ROM的作用是向CPU532单向传输数据和指令,而RAM一般则用于双向传输数据和指令。CPU532一般可以包括任意数量的处理器,两个基本存储器534和536都可以包括任何计算机可读的合适的介质。二级存储器538一般是大容量存储器,它也双向地连接CPU532,提供额外的存储器量。大容量存储器538是一种计算机可读的介质,可用于存储包括计算机代码、数据等的程序。一般来说,大容量存储器538是一种诸如硬盘或磁带的存储介质,速度一般比基本存储器534、536慢。大容量存储器538的形式可以是磁带机、纸带机或其它已知设备。应当明白,大容量存储器538中存储器的数据,在适当的情况下可以采用与RAM536相同的方式而充当虚拟内存。诸如CD-ROM的特殊基本存储器534也可以单向地向CPU532传递数据。
CPU532也连接一个或输入/输出设备540。输入/输出设备540包括但不限于视频监视器、轨迹球、鼠标、键盘、麦克风、触摸屏、穿卡机、磁带机、纸带机、书写板、记录笔、声音或手书识别器或其它已知的输入设备,当然也包括其它计算机。最后,CPU532最好用图中512简单表示的网络连接,连接到计算机网络或通信网络,例如局域网、内连网或因特网。有了这种网络连接,就可以考虑在执行以上所述方法步骤的过程中用CPU532从网络接收信息,或者向网络输出信息。这种信息经常表现为要由CPU532执行的指令序列,例如以在载波中体现的计算机数据信号的形式,既可以从网络接收,也可以向网络输出。计算机软件和硬件的熟练人员都知道上述设备和材料。
如上所述,计算机系统530上可以运行一个虚拟机。图6是表示一个由图5的通用计算机系统支持的虚拟机的示意图。当计算机程序(例如用JavaTM程序设计语言编写的计算机程序)执行时,源代码610被提供给编译时环境605内的编译程序620,Java是由美国加州Palo Alto的Sun Microsystems公司开发的一种程序设计语言。编译程序620将源代码610翻译成字节代码630。一般来说,源代码610是在软件开发人创建源代码610的时候被翻译成字节代码630的。
字节代码630一般可以被复制、下载、或通过网络(例如图10的网络1012)以其它方式分发、或者在图10基本存储器534之类的存储器上存储。在所述实施例中,字节代码630是独立于平台的。就是说,字节代码630可以在运行适当的虚拟机640的几乎任何计算机系统上执行。例如,在JavaTM环境中,字节代码630可以在运行JavaTM虚拟机的计算机系统上执行。
字节代码630被提供给包含虚拟机640的运行时环境635。运行时环境635一般可用图10的CPU532之类的处理器执行。虚拟机640包括编译程序642、解释程序644和运行时系统646。字节代码630一般既可以提供给编译程序642,也可以提供给解释程序644。
如果将字节代码640提供给编译程序642,如上所述,字节代码630中含有的子程序被翻译成机器指令。另一方面,如果将字节代码640提供给解释程序644,则字节代码630被读入解释程序644,一次一个字节代码。解释程序644然后一边读入各字节代码一边执行由各字节代码定义的操作。一般来说,解释程序644几乎是连续地处理字节代码630并执行字节代码630相关的操作。
当操作系统660调用一个子程序时,如果判定调用的子程序是个被解释的子程序,运行时系统646就可以从解释程序644获得该子程序。另一方面,如果判定调用的子程序是个编译子程序,运行时系统646就启动编译程序646。编译程序646然后根据字节代码630输出机器指令,并执行这些机器语言指令。一般来说,当虚拟机640停止时,机器语言指令就被丢弃。
尽管本文只描述了本发明的几个实施例,应当明白,在不偏离本发明本质或范围的前提下,本发明可以以许多其它方式实施。举例来说,在空闲时段执行编译涉及的诸步骤可以调换顺序,也可以增、减。一般来说,在不偏离本发明本质或范围的前提下,本发明的诸多方法所涉及的诸步骤均可以调换顺序,也可以增、减。
本文所描述的用于编译的一个最高优先级子程序,是从执行列表和数据库列表中的几乎所有子程序中选出来的。检索执行列表或数据库列表或二者中的所有子程序,以找到最高编译优先级子程序这种方法,在执行列表中项目很多时,其代价是很高的。因此,在一个实施例中,对执行列表的一个子集而不是执行列表全体进行检索,确定用于编译的一个最高优先级子程序。例如,检索执行列表中的前“N”个候选子程序,从这前“N”个候选子程序中确定最高优先级子程序。
如上所述,至少部分地通过使用调用计数器来确定子程序编译优先级。调用计数器一般是随子程序每次被访问而递增的计数器。应当明白,在有些实施例中,调用计数器可以随时间推移而衰减。例如,如果某子程序在程序执行的开始部分被反复调用并预定进行编译,但是在以后没有再被调用,那么调用计数器就会衰减,以降低该子程序的编译优先级。一旦某子程序的调用计数器已经衰减,例如指数级地衰减,就不再值得编译该子程序。因此可以定期将这类子程序从执行列表中删除。
与此类似,在进行编译期间,要判断某个预期要编译的子程序此前已经编译过。可以将已经编译过的子程序从执行列表或数据库列表中适当的列表中删除,或者同时从这两种列表中删除。一般来说,在执行列表和数据库列表中检查编译过的子程序,其相关的开销是相当大的。然而,例如可以在空闲时段的开始,定期地清除编译过的子程序。这一点并不偏离本发明的实质或范围。
尽管本文将执行列表描述成是一种含有要编译的解释子程序的列表或队列,但是执行列表也可以包含要被推迟到有空闲时段时重新编译的编译子程序。例如,在一个有两级编译程序的系统中,一旦某子程序被编译后,如果该子程序反复被调用,就希望更高效地重新编译该子程序。在这种系统中,预定要重新编译或第二级编译的子程序,可以与预定要编译的解释子程序放在同一个执行列表内。然而,预定要重新编译的子程序,也可以放在单独的执行列表内。
在一个实施例中,执行列表一般是只有延迟任务或者既有延迟任务又有待编译任务的工作列表。可以为这类任务分配优先级。应当明白,当工作列表中的任务正在运行时,如果收到中断信号,可以允许该任务完成,例如,假设该任务涉及收垃圾,如果将收垃圾的过程挂起以及“放弃”收垃圾过程,代价可能会很高,如果代价不是太大就完成该过程。因此可以允许收垃圾过程完成。收到中断信号时,一般也可以将任务挂起。因此,本文的例子应视为是解释性的而不是限制性的,本发明也不局限于本文的所述的细节,可以在权利要求的范围内作出改进。
权利要求
1.一种在处理计算机程序中的空闲时段动态地编译子程序的计算机实现的方法,该计算机实现的方法包括确定空闲时段;在空闲时段内确定一个从多个子程序中选择的第一个子程序,该多个子程序包含在计算机程序中,其中计算机程序被安排既执行解释的程序代码又执行编译的程序代码;启动编译第一个子程序,其中,对编译第一个子程序的启动在空闲时段内发生。
2.权利要求1所述的计算机实现的方法,其中,多个子程序被登记在一个与计算机程序相关的第一列表中,第一个子程序是第一列表相关的一个最高优先级的子程序。
3.权利要求1所述的计算机实现的方法,其中,从多个子程序中选择的第一个子程序集合与一个第一列表关联,从多个子程序中选择的第二个子程序集合与一个第二列表关联,第一列表是在处理计算机程序期间创建的,第二列表是在处理计算机程序之前创建的,其中确定第一个子程序包括从第一列表选择作为最高优先级的子程序的第一个子程序。
4.权利要求1所述的计算机实现的方法,其中,从多个子程序中选择的一个第一个子程序集合与第一列表关联,从多个子程序中选择的一个第二个子程序集合与第二列表关联,第一列表是在处理计算机程序期间创建的,第二列表是在处理计算机程序之前创建的,其中确定第一个子程序包括从第二列表选择作为最高优先级的子程序的第一个子程序。
5.以上权利要求中任一个权利要求所述的计算机实现的方法,进一步包括在对第一个子程序的编译启动之后判断计算机程序是否收到一个中断信号;当判定收到一个中断信号时,对第一个子程序的编译继续一个预定的时间段;预定时间段过后,判断对第一个子程序的编译是否完成;如果判定预定时间段过后第一个子程序的编译没有完成,对第一个子程序的编译中止。
6.一种在总体处理计算机程序中的低工作量时段动态地编译子程序的计算机实现的方法,该计算机实现的方法包括确定低工作量时段;在低工作量时段内确定一个从多个子程序中选择的第一个子程序,该多个子程序包括在计算机程序中;判断第一个子程序是否编译过,其中判断是在该低工作量时段内进行的;如果判定第一个子程序没有编译过,在该低工作量时段启动编译第一个子程序。
7.权利要求6所述的计算机实现的方法,进一步包括如果判定第一个子程序被编译过,在该低工作量时段内确定一个从多个子程序中选择的第二个子程序;判断第二个子程序是否编译过,其中判断第二个子程序是否编译过是在该低工作量时段内进行的;如果判定第二个子程序没有编译过,在该低工作量时段启动编译第二个子程序。
8.权利要求6和7中的其中之一所述的计算机实现的方法,进一步包括为多个子程序中每个子程序确定一个优先权值,其中,第一个子程序是根据第一个子程序的优先权值确定的。
9.权利要求8所述的计算机实现的方法,其中,为多个子程序中的每个子程序确定优先权值包括在低工作量时段内处理与多个子程序中每个子程序相关的调用计数器。
10.权利要求8所述的计算机实现的方法,其中,为多个子程序中每个子程序确定优先权值包括在低工作量时段内估计多个子程序中每个子程序的编译时间。
11.权利要求6所述的计算机实现的方法,其中,从多个子程序中选择的第一个子程序集合与一个第一列表关联,从多个子程序中选择的第二个子程序集合与一个第二列表关联,第一列表是在处理计算机程序期间创建的,第二列表是在处理计算机程序之前创建的,其中确定第一个子程序包括从第一列表选择作为最高优先级的子程序的第一个子程序。
12.权利要求6~11中任一个权利要求所述的计算机实现的方法,进一步包括在对第一个子程序的编译启动之后判断计算机程序是否收到一个中断信号;当判定收到一个中断信号时,对第一个子程序的编译继续一个预定的时间段;预定时间段过后,判断对第一个子程序的编译是否完成;如果判定预定时间段过后第一个子程序的编译没有完成,对第一个子程序的编译中止。
13.权利要求12所述的计算机实现的方法,进一步包括如果判定未收到一个中断信号,完成对第一个子程序的编译;在低工作量时段内确定一个从多个子程序中选择的第二个子程序;在低工作量时段内判断第二个子程序是否编译过;如果判定第二个子程序没有编译过,在该低工作量时段内启动对第二个子程序的编译。
14.一种在处理计算机程序中的空闲时段动态地处理延迟任务的计算机实现的方法,该计算机实现的方法包括确定在处理计算机程序中的空闲时段;在处理计算机程序的空闲时段内确定一个从多个任务中选择的第一个任务,该多个任务包括在计算机程序中,其中计算机程序被安排既执行解释的程序代码又执行编译的程序代码;启动第一个任务,其中,对编译第一个任务的启动在空闲时段内发生。
15.权利要求14所述的计算机实现的方法,进一步包括在接到中断信号时完成该第一个任务。
16.权利要求14所述的计算机实现的方法,进一步包括在接到中断信号时挂起该第一个任务。
17.一种在处理计算机程序中的低工作量时段动态地编译字节编码子程序的计算机系统,该计算机系统包括一个用于确定低工作量时段的机构;一个用于在低工作量时段内确定一个从多个子程序中选择的第一个子程序的机构;一个用于低工作量时段内启动对第一个子程序编译的机构。
18.权利要求17所述的计算机系统,进一步包括一个被安排去引用多个子程序的第一个集合的第一列表,其中第一列表与计算机程序关联,第一个子程序是第一列表关联的最高优先级子程序;一个被安排去引用多个子程序的第二个集合的第二列表,其中第二列表是在处理计算机程序之前创建的,第一列表是在处理计算机程序期间创建的。
19.权利要求17所述的计算机系统,进一步包括一个被安排在第一个子程序的编译期间接收中断信号的中断处理器,该中断处理器与编译程序通讯,其中该编译程序被进一步安排去根据中断处理器的信号继续对第一个子程序编译一个预定的时间段;一个中止机构,该中止机构与编译程序通讯,其中该中止机构被安排去中止对第一个子程序的编译。
20.权利要求17~19中任一个权利要求所述的计算机系统,进一步包括一个诊断机构,该诊断机构被安排去确定第一个子程序何时被编译。
21.一种包含计算机程序代码设备的计算机可读的介质,其中的计算机程序代码设备被安排去在处理计算机程序中的空闲时段动态地编译子程序,该计算机可读的介质包括确定空闲时段的计算机程序代码设备;在空闲时段内确定一个从多个子程序中选出的第一个子程序的计算机程序代码设备,其中多个子程序包括在计算机程序中;在空闲时段内启动对第一个子程序编译的计算机程序代码设备。
22.根据权利要求21的计算机可读的介质,其中,计算机程序代码设备在载波中实现。
全文摘要
本文介绍用于在计算机程序执行的空闲期间动态地编译与子程序有关的字节代码的方法和装置。所介绍的方法特别适用于既执行解释字节代码又执行编译字节代码的计算机系统。在有些实施例中,把要动态编译的子程序在一个或多个列表中注明。为各列表分配优先级,使优先级最高的子程序最先编译。在一个实施例中,有一对编译列表,第一个编译列表是一个在处理计算机程序之前创建的,另一个是在处理计算机程序期间创建的。
文档编号G06F9/445GK1234552SQ9811829
公开日1999年11月10日 申请日期1998年10月6日 优先权日1997年10月6日
发明者U·赫尔茨勒, L·巴克 申请人:太阳微系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1