没有合适的资源?快使用搜索试试~ 我知道了~
后端研究-保证Java精确异常的指令调度技术.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 155 浏览量
2022-06-23
16:12:43
上传
评论
收藏 1.85MB PDF 举报
温馨提示
试读
43页
后端研究-保证Java精确异常的指令调度技术.pdf
资源推荐
资源详情
资源评论
保证Java精确异常的指令调度技术
第1章引言
Java语言[3]是Sun
Microsystems于1995年推出的程序设计语言,最初Java
语言被称为Oak,其主要是为消费类电子产品而开发的程序设计语言,但是在这
一领域Oak并没有取得巨大成功。然而,由于Oak语言的高效性、鲁棒性和平台无
关性,Sun看到了其在Internet应用上的潜力,从而将其进一步改造并命名为
“Java’’。从此,Java语言伴随着Internet的迅猛发展得到了异常快速的发展与
壮大。
Java作为一种面对对象的语言,与C/C++等传统言语相比,具有以下突出的
特性和优点:
①简单性:Java略去了运算符重载、多重继承等模糊的概念,并通过实现自
动垃圾回收[3]大大简化了程序的内存管理工作,使软件的设计开发工作相对更
加简单和快速。
②平台无关性:Java源代码经过编译后变成Java字节码[5],而Java字节码
运行在Java虚拟机[5]之上,虚拟机负责解释或即时编译执行Java字节码文件
[5][7][8][10]。Java语言之所以实现了平台中立,其根本原因在于各操作系统
平台都配有Java虚拟机,这使得Java程序可以做到“一次编译随处运行”。
③易移植性:平台无关性使Java程序可以方便地被移植到不同的硬件平台
之上,同时,Java的类库主要是由Java语言实现的,其中少数与系统相关的函
数才用本地方法实现,这使这些类库的移植也非常容易。
④鲁棒性:Java在编译和运行程序时,都要对可能出现的问题进行检查,以
消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存
时产生错误。通过集成的面向对象的异常处理机制[3],Java源代码编译器javac
可以在编译时揭示出程序可能出现但未被处理的异常,帮助程序员正确地进行处
理以防止系统崩溃。另外,Java在源代码编译时还可捕获类型声明中的许多常见
错误,防止动态运行时类型不匹配问题的出现。
⑤安全性:Java程序是指针安全[3]的。此外,Java程序有着非常完善的安
全体系,Java字节码在装载至UJava虚拟机运行之前要经过严格的检验[5],同时
Java程序在Java虚拟机上运行时受至tJJava虚拟机的严格控制与监控,这些措施使
得系统难以被恶意程序所破坏,保证了系统的安全性。
保证Java精确异常的指令调度技术
⑥以网络为中心:Java在语言层面对多线程、并发和同步提供了非常好的支
持,其内置的远程方法调用机制[3](RMI)加上平台无关特性等使得Java在以网
络为中心的分布式计算中尽显优势。
以上提及的Java语言的诸多特性,使其在Internet应用、分布式计算等领域
大行其道、得到广泛的应用[21][22]。同时Java纯粹面对对象和指针安全等特性
为软件工程提供了良好的支持,这使得其在通用应用程序开发领域同样备受青
睐。除此之外,Java的易移植性、平台无关性和对分布式计算的内在支持等特性
使其可以有效解决以网格计算为主的科学计算领域中平台异构、并发、通信、同
步和可靠性等问题,这也同样让Java深受该领域用户的喜爱、具有极大的应用潜
力[21][22][23]。
然而,Java程序相对较低的执行效率却阻碍了Java语言在诸多领域进一步的
广泛应用和深入发展,随着Java即时编译(JIT
Compilation,Just.In-Time
Compilation)[8]和自适应动态编译优化(Adaptive
Compi
lation)[103等Java
动态编译技术的不断完善与进步,现如今造成Java程序性能瓶颈的主要问题之一
与Java运行期异常检测和Java精确异常模型(Precise
Exception
Model)[1][2][3]
有关。
首先,Java程序在运行期伴随着非常大量和频繁的异常检测,这些异常检
测普遍存在于程序的各个部分,因为异常检测本身需要占用程序执行的时间,所
以这些频繁出现的异常检测很大程度的影响了程序的执行效率,特别对于热点区
域包含大量异常检测的程序而言,这样的负面性能影响更为严重。
除了程序中频繁出现的异常检测产生的负面影响之外,Java语言引入的精确
异常模型严重限制和阻碍了指令调度(Instruction
Scheduling)等重要编译优
化方法在Java中的应用,从而严重阻碍了Java程序性能的提升。指令调度[6]是
在编译优化过程中提高代码指令级并行度(ILP,
Instruction—Level
Parallelism)
[6][13]的一种重要方法,其通过调整指令顺序和对代码的重新组织、变换可以
使程序代码有效利用硬件提供的并行能力从而大大提高代码的执行效率。在体系
结构提供大量并行能力的今天,这种优化方法对程序性能的提升往往起到至关重
要的作用。然而,Java语言规范中对Java精确异常模型的定义却与指令调度构成
了冲突与矛盾,Java精确异常模型规定:①当一个异常被抛出后,优化后的程序
在相应的异常处理旬柄入口处看到的程序状态必须和未优化的原程序一致;②优
化后的程序的异常抛出顺序必须和未优化的原程序一致。Java精确异常模型的严
格规定为程序引入了额外的精确异常相关依赖关系(Precise.Exception
Related
Dependence)[1],而这些依赖关系的出现极大地限制或阻碍了指令调度的应用。
2
保证Java精确异常的指令调度技术
在大部分情况下,指令调度只能在程序中不存在异常检测的区域发挥比较好的作
用,但是,由于异常检测在程序中频繁大量的出现,使得不存在异常检测的区域
在大小和数量上都非常有限,这使得对这些区域进行指令调度优化所起到的性能
提升效果非常不明显。为了保证Java精确异常模型不被破坏,很多被证明行之有
效的指令调度方法在存在异常检测的区域中或是无法起到显著的效果、或是根本
无法被应用,从而大大降低了Java程序代码的指令级并行度,并使程序的执行性
能无法得到显著的提升。
目前已经存在较多的旨在解决上述问题的研究工作,这些研究工作主要可以
分为两类。第一类研究主要通过对程序的分析和变换来尽量消除程序中存在的冗
余的异常检测,以此增加程序中不含异常检测的区域的数量并扩大这种区域的大
小,这样既可以有效减少异常检测的时间,又能使包括指令调度在内的各种编译
优化方法得以更加有效的应用于这类区域,从而增加优化对程序整体执行效率提
升的贡献。文献[19][20]试图通过理论分析和证明来消除程序中冗余的数组边界
检测,但算法复杂度太高,应用该算法需要大量的资源和时间,因此不适用于Java
动态编译。ABCD算法[24]是一种用于消除程序中数组边界检查的方法,它通过分
析边界检查之间的关系来消除不必要的边界检查,该算法可以消除典型Java程序
中45%的动态数组边界检查,即半数以上的边界检查无法在编译时消除。文献
[14][18]描述了通过代码复制来消除循环体中的Java数组边界检查的方法,然而
在当有内嵌循环并且循环中包括很多条件制约的数组访问时,消除效果则不理
想。
这一类研究工作对提高Java程序的性能起到了一定的作用,但是也存在如
下缺点。首先,冗余异常检测消除算法一般都针对某些特定的异常检测,比如数
组边界检测、空引用检测等,虽然这类异常检测在程序中普遍存在,但是除此之
外,Java程序还包含其它诸多各种类型的异常检测,对于这些其它类型的异常
检测而言,这些研究工作往往无能为力。其次,当程序代码或异常检测模式比较
复杂时,这些工作对冗余异常检测的消除效果则不太理想。最后,不论异常检测
算法效果如何,程序中总会存在无法被消除的异常检测,而这些残留的异常检测
同样会对Java程序的性能提升产生影响。
第二类研究主要旨在化解Java精确异常模型和指令调度之间的矛盾,使指令
调度既能比较好地应用于存在异常检测的程序区域,又可以保证Java精确异常模
型不被破坏。这些研究主要通过深入分析精确异常模型引入的额外依赖关系对程
序整体依赖关系和指令调度的影响,来改进程序依赖关系或指令调度,从而达到
以上目的。文献[1]在对精确异常相关依赖进行深入分析的基础上提出一种消除
保证Java精确异常的指令调度技术
冗余依赖关系的方法,以使调度指令的算法可以更好的发挥效用。文献[2]提出
了在保证Java精确异常模型情况下的超级块调度[6]和哨兵调度[16]方法,以处
理代码块内部顺序指令的调度,但是算法效果并不是非常理想。
这一类研究工作对提高Java程序的性能起到了一定的作用,但是也存在如
下缺点。首先,很多研究工作是针对特定的指令调度方法进行改进,不具有通用
性。其次,这些研究工作虽然尽量减少Java精确异常模型对指令调度的影响,
但是指令调度在应用时仍然要考虑到精确异常的存在、仍然受限于Java精确异
常模型和其引入的相关依赖关系,即编译器在进行指令调度时还是无法将Java
精确异常模型完全忽略进而发挥指令调度的最大作用,这也使得最终程序的性能
提升效果有限。
如何既能打破精确异常模型限制使指令调度畅通无阻,同时又能保证Java
精确异常模型不被破坏,是化解指令调度与Java精确异常模型之间矛盾并大大
提高程序执行效率的关键。本文在现有研究工作的基础上提出了一种全新的保证
Java精确异常的指令调度技术,真正完全化解了指令调度与Java精确异常模型
之间的矛盾。该方法允许编译器在进行指令调度的同时完全忽略Java精确异常
模型和其引入的相关依赖关系的存在与限制,使指令调度算法能够以最为有效的
方式优化程序代码并充分发掘代码的指令级并行度,同时,通过一定的机制保证
当程序运行期抛出异常时,Java精确异常模型不会被之前所应用的指令调度破
坏。与现有的研究工作相比,本文提出的方法具有以下优势:
①通用性:该方法对Java程序中出现的异常检测普遍适用,同时也对现有
的指令调度算法普遍适用;
②高效性:该方法可以保证Java精确异常模型的前提下,使指令调度的效
果在整个程序区域得到最大的发挥,而不是只限制于不存在异常检测的区域,从
而更加有效地提升程序的整体性能。
实验结果显示本文提出的方法使基准程序达到了平均超过50%的净加速,从
而证明了方法的可行性和有效性。
本文组织结构如下:第二章对与本文提出的方法相关的概念、技术进行简单
的介绍和阐述;第三章对Java精确异常模型和指令调度之间的矛盾冲突进行了
深入的描述与分析;第四章在第三章分析的基础上提出本文的核心算法以化解
Java精确异常模型与指令调度之间的矛盾,进而统一两者;第五章针对本文提
出的算法进行了实验并分析了实验数据;最后第六章根据实验结果对全文进行总
结。
4
保证Java精确异常的指令调度技术
第2章背景介绍
本章将对全文中涉及的一些关键概念、技术等背景内容作简介和阐述:首先
较详细地介绍了指令调度技术的概念、分类及主要方法;其次描述了Java动态
编译技术的内容与发展;最后给出Java异常分类与异常处理的具体的描述。这
些背景概念和技术都是与本文提出的保证Java精确异常的指令调度技术息息相
关、紧密联系的。
2.1指令调度
现代计算机体系结构[131,如流水线(Pipeline)、超标量(Supersealar)、超
长指令流(VLIW,very
Long
Instruction
Word)等,在硬件层面提供了很好的并
行性,编译器必须通过提高生成代码的指令级并行度来充分使用硬件的并行能
力,从而大幅度提高程序的执行效率。指令调度就是一种以提高程序的指令级并
行度为目的的重要编译优化手段,通常发生在编译过程的后端并与目标体系结构
相关。指令调度在中间表示(Intermediate
Representation)或汇编代码层面对程
序代码进行重新组织和变换,通过调整指令执行顺序、填充延迟槽、拼装可并行
的操作等方法缩短被优化代码的执行时间并提高硬件吞吐量,从而极大地提高程
序的执行效率。编译器在进行指令调度优化的同时,必须同时遵守被调度指令间
的依赖关系以保证最终优化代码的正确执行。
在现代编译器中,指令调度对决定最终生成代码执行效率起到了越来越重要
的作用,本节将对现有的指令调度作一个简单的介绍。
4.2.1体系结构并行性
在最原始的计算机体系结构模型中指令是一条一条按顺序被执行的。如图表
l所示,当前指令必须在前一条指令执行完毕后才能开始执行。指令的顺序执
行模式最为简单,但是其缺点是指令执行效率非常低。在这种原始的体系结构
下,硬件本身没有提供任何的并行性。
5
剩余42页未读,继续阅读
资源评论
programhh
- 粉丝: 8
- 资源: 3838
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功