一种即时编译系统中的栈运算优化方法技术方案

技术编号:8716351 阅读:158 留言:0更新日期:2013-05-17 19:04
本发明专利技术提供了一种即时编译系统中的栈运算优化方法。采用向量寄存器构成的全局操作数栈,剔除了栈帧中的局部操作数栈,节省了相关开销。为执行引擎的模板表引入了一个新维度,用于指示操作数栈栈顶在向量寄存器文件中位置;分配一个寄存器用来指示溢出区操作数栈的栈顶地址;在每个Java线程初始化时,为溢出区操作数栈分配一个页面存放溢出数据,并且将溢出页面尾地址记录在线程局部缓存中。

【技术实现步骤摘要】

本专利技术涉及计算机
,更具体地说,本专利技术涉及。
技术介绍
在Java 编程语言和环境中,即时编译(JIT compiler, just-1n-time compiler)系统是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序。当写好一个Java程序后,源语言的语句将由Java编译器编译成字节码,而不是编译成与某个特定的处理器硬件平台对应的指令代码(比如,Intel的Pentium微处理器或IBM的System/390处理器)。字节码是可以发送给任何平台并且能在那个平台上运行的独立于平台的代码。现有的即时编译系统,其运算过程的中间表示,一般都是基于操作数栈的,且将操作数栈实现为方法栈帧的一个部分。方法栈帧通常包含局部变量区、信息保留区和操作数栈三个部分,局部变量区存储方法的局部变量,信息保留区记录方法调用返回时需要保留恢复的寄存器内容,操作数栈为方法计算过程提供操作数。由于操作数栈属于方法栈帧,因此当发生方法调用时,首先需要将调用者(caller)传递给被调用者(callee)的参数从将调用者caller栈帧的操作数栈中弹出,存入被调用者callee栈帧的局部变量区,然后被调用者callee才能开始执行,且执行过程需要不断的对局部变量区和操作数栈进行访存操作。上述栈帧设计存在大量的访存操作。具体来说,对方法调用类指令,需要将参数从将调用者caller的操作数栈拷贝到被调用者callee的局部变量区;对计算类指令,需要访问操作数栈以读取操作数,以及将计算结果写入操作数栈。
技术实现思路
本专利技术所要解决的技术问题是针对现有技术中存在上述缺陷,提供,其能够避免即时编译系统实现中计算类指令的访存操作,提高即时编译系统实现的执行效率。根据本专利技术,提供了,其包括:采用由变量区和方法信息保留区构成的全局操作数栈,所述全局操作数栈是线程相关的,且处于向量寄存器文件中;为执行引擎的模板表引入了一个新维度,用于指示操作数栈栈顶在向量寄存器文件中位置;分配一个寄存器用来指示溢出区操作数栈的栈顶地址;在每个Java线程初始化时,为溢出区操作数栈分配一个页面存放溢出数据,并且将溢出页面尾地址记录在线程局部缓存中。优选地,所述即时编译系统的压栈过程包括:第一压栈步骤:初始化新维度值为向量寄存器能够提供的最大槽数,初始化寄存器为溢出页面尾地址;第二压栈步骤:判断新维度值是否大于0 ;第三压栈步骤:如果新维度不大于0,则将待压栈数据存入寄存器指向的地址,同时寄存器减一个槽大小,指向下一个可用位置;第四压栈步骤:如果新维度大于0,则将待压栈数据存入新维度值指示的向量寄存器位置,同时新维度值递减,指向下一个可用的向量寄存器位置。优选地,所述即时编译系统的弹栈过程的包括:第一弹栈步骤:判断寄存器是否等于溢出页面尾地址;第二弹栈步骤:如果寄存器与溢出页面尾地址相等,则从新维度值指示的向量寄存器位置弹出数据,同时新维度值递增;第三弹栈步骤:如果寄存器与溢出页面尾地址不等,从寄存器指示的地址读出数据,同时将寄存器减一个槽大小。根据本专利技术的即时编译系统中的栈运算优化方法能够避免即时编译系统实现中计算类指令的访存操作,提高即时编译系统实现的执行效率,同时避免数据从向量寄存器文件溢出的情况,因此本专利技术提出的基于向量寄存器文件的全局操作数栈的栈帧设计可以显著提高时编译系统的执行性能。附图说明结合附图,并通过参考下面的详细描述,将会更容易地对本专利技术有更完整的理解并且更容易地理解其伴随的优点和特征,其中:图1示意性地示出了根据本专利技术优选实施例的即时编译系统的压栈过程的流程图。图2示意性地示出了根据本专利技术优选实施例的即时编译系统的弹栈过程的流程图。需要说明的是,附图用于说明本专利技术,而非限制本专利技术。注意,表示结构的附图可能并非按比例绘制。并且,附图中,相同或者类似的元件标有相同或者类似的标号。具体实施例方式为了使本专利技术的内容更加清楚和易懂,下面结合具体实施例和附图对本专利技术的内容进行详细描述。本专利技术提出了全局操作数栈的概念。基于全局操作数栈的栈帧结构只需要包括局部变量区和方法信息保留区两个部分,而不包括操作数栈这个部分。同时,本专利技术利用向量寄存器文件实现全局操作数栈。现有技术一般不采用向量寄存器文件实现全局操作数栈,这是因为以向量寄存器文件实现全局操作数栈存在几个问题。首先是执行引擎的实现问题。现有的执行引擎实现的是方法相关的操作数栈,且操作数栈在内存中。与之不同的是,本专利技术提出的全局操作数栈是线程相关的,且处于向量寄存器文件中。第二个问题是溢出问题,当全局操作数栈的深度大于向量寄存器文件所能提供的槽(slot)数目时,就称为溢出,现有执行弓I擎不存在这个问题,因为它的操作数栈就在内存中,而本专利技术需要考虑。下面将以Java虚拟机为例说明针对本专利技术提出方法的执行引擎的实现方法。现有Java虚拟机执行引擎在初始化过程中为每条字节码创建一个模板,该模板有多个入口,对应操作数栈的栈顶状态(TosState )。所有模板构成一个模板表,该表以字节码序号和栈顶状态(TosState)构成二维索引。与之不同的是,本专利技术需要为执行引擎的模板表引入了一个新维度TosPos,用于指示操作数栈栈顶在向量寄存器文件中位置。具体地说,设向量寄存器文件构成的全局操作数栈有n个槽,则新维度TosPos的取值范围是n O。其中,更具体地说,n表示向量寄存器还未使用,0表示向量寄存器已满,即将溢出。为解决溢出问题,需分配一个寄存器(设为寄存器sO)用来指示溢出区操作数栈(当全局操作数栈的深度大于向量寄存器文件所能提供的槽数目时超出部分所处的数栈区域)的栈顶地址;并且在每个Java线程初始化时,为溢出区操作数栈分配一个页面存放溢出数据,并且将溢出页面尾地址(设为addSpillPage)记录在线程局部缓存中。并且,在压栈过程的开始可将溢出页面尾地址设置为寄存器sO的初值,而且在压栈过程的开始可将化寄存器sO初始化为溢出页面尾地址addSpillPage ;这将在下文予以描述。图1示意性地示出了根据本专利技术优选实施例的即时编译系统的压栈过程的流程图。如图1所示,根据本专利技术优选实施例的即时编译系统的压栈过程包括:第一压栈步骤Sll:初始化新维度TosPos值为向量寄存器能够提供的最大槽数n,初始化寄存器sO为溢出页面尾地址addSpillPage ;第二压栈步骤S12:判断新维度TosPos值是否大于0 ;第三压栈步骤S13:如果新维度TosPos不大于0 (说明向量寄存器已满),则将待压栈数据存入寄存器sO指向的地址,同时寄存器sO减一个槽大小,指向下一个可用位置;第四压栈步骤S14:如果新维度TosPos大于0 (说明向量寄存器仍由可用空间),则将待压栈数据存入新维度TosPos值指示的向量寄存器位置,同时新维度TosPos值递减,指向下一个可用的向量寄存器位置。随后执行后续处理。图2示意性地示出了根据本专利技术优选实施例的即时编译系统的弹栈过程的流程图。如图1所示,根据本专利技术优选实施例的即时编译系统的弹栈过程的包括:第一弹栈步骤S21:判断寄存器sO是否等于溢出页面尾地址addSpillPage ;第二弹栈步骤S22:如果寄存器与溢出页面尾地址相本文档来自技高网...

【技术保护点】
一种即时编译系统中的栈运算优化方法,其特征在于包括:由向量寄存器构成全局操作数栈,全局操作数栈是线程相关的;采用由变量区和方法信息保留区构成的栈帧,剔除了局部操作数栈,避免了相关访存开销;为执行引擎的模板表引入了一个新维度,用于指示操作数栈栈顶在向量寄存器文件中位置;分配一个特定寄存器用来指示溢出区操作数栈的栈顶地址;在每个Java线程初始化时,为溢出区操作数栈分配一个页面存放溢出数据,并且将溢出页面尾地址记录在线程局部缓存中。

【技术特征摘要】

【专利技术属性】
技术研发人员:叶俊漆锋滨唐大国杨小川张海军
申请(专利权)人:无锡江南计算技术研究所
类型:发明
国别省市:江苏;32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1