CN105765521B - 用于Java编程中的循环中止的系统和方法 - Google Patents
用于Java编程中的循环中止的系统和方法 Download PDFInfo
- Publication number
- CN105765521B CN105765521B CN201480064229.XA CN201480064229A CN105765521B CN 105765521 B CN105765521 B CN 105765521B CN 201480064229 A CN201480064229 A CN 201480064229A CN 105765521 B CN105765521 B CN 105765521B
- Authority
- CN
- China
- Prior art keywords
- cyclic process
- instruction
- code cache
- interpreter
- execution
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45508—Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Executing Machine-Instructions (AREA)
- Advance Control (AREA)
- Debugging And Monitoring (AREA)
Abstract
系统和方法被提供用于循环过程中止。与循环过程相关联的一个或多个循环指令被加载在代码高速缓存中。代码高速缓存中的与循环过程的分支相关联的一个或多个分支指令被确定。中止事件被检测。一经检测到中止事件,在代码高速缓存中,分支指令被替换为一个或多个跳转指令。如果跳转指令在代码高速缓存中被执行,则代码高速缓存中的分支指令被恢复,并且循环过程被中止。与中止事件相关联的一个或多个中止指令在解释器中被执行。
Description
相关申请的交叉引用
本公开内容要求对2013年11月25日提交的美国临时专利申请No.61/908,429的优先权和来自该美国临时专利申请的权益,它的整体通过引用并入本文。
技术领域
本专利文件中所描述的技术一般性地涉及计算机编程并且更特别地涉及Java编程。
背景技术
Java程序可以运行在Java虚拟机(JVM)正在其上执行的任何机器上。在JVM(例如,Dalvik)中,在Java程序的启动时,可以使用解释器(interpreter)来执行Java字节代码。例如,在Java程序被执行之前,程序的源代码被分解为Java字节代码。在运行时,JVM的Java解释器对字节代码进行解释。作为一种备选,JVM可以选择不对字节代码进行解释,而是将字节代码编译分为本机(native)代码。JVM然后促使本机代码直接由一个或多个处理器执行。例如,频繁使用的字节代码被编译为本机代码以改进运行性能。
即时(Just-in-time)编译(JIT)(也被称为动态转换)是程序或应用在运行时的执行期间而不是在执行之前进行的编译。经常地,JIT牵涉到向用于Java程序的本机代码的转换/编译。例如,本机代码(例如,轨迹(trace))被放入到JIT代码高速缓存中以用于执行。如图1中所示出的,JIT代码高速缓存100包括通常使用的子例程(例如,TEMPLATE_CMP_LONG)和本机代码(例如,轨迹-1)。
发明内容
根据本文所描述的教导,系统和方法被提供用于循环过程中止。与循环过程相关联的一个或多个循环指令被加载在代码高速缓存中。代码高速缓存中的与循环过程的分支相关联的一个或多个分支指令被确定。中止事件被检测。一经检测到中止事件,在代码高速缓存中,分支指令被替换为一个或多个跳转指令。如果跳转指令在代码高速缓存中被执行,则代码高速缓存中的分支指令被恢复,并且循环过程被中止。与中止事件相关联的一个或多个中止指令在解释器中被执行。
在一个实施例中,一种用于循环过程中止的系统包括:代码高速缓存,被配置为存储与循环过程相关联的一个或多个循环指令;监测器组件,被配置为确定代码高速缓存中的与循环过程的分支相关联的一个或多个分支指令,并且一经检测到中止事件,在代码高速缓存中将分支指令替换为一个或多个跳转指令;运行组件,被配置为响应于跳转指令在代码高速缓存中被执行,恢复代码高速缓存中的分支指令并且中止循环过程;以及解释器组件,被配置为执行与中止事件相关联的一个或多个中止指令。
在另一实施例中,一种用于循环过程中止的系统包括:代码高速缓存,被配置为存储与循环过程相关联的一个或多个循环指令;以及一个或多个数据处理器。这些数据处理器被配置为:确定代码高速缓存中的与循环过程的分支相关联的一个或多个分支指令;检测中止事件;一经检测到中止事件,在代码高速缓存中将分支指令替换为一个或多个跳转指令;在代码高速缓存中执行跳转指令;恢复代码高速缓存中的分支指令;中止循环过程;以及在解释器中执行一个或多个中止指令,这些中止指令与中止事件相关联。
附图说明
图1描绘了示出JIT代码高速缓存的示例示图。
图2描绘了示出循环过程中止的示例示图。
图3描绘了示出循环过程中止的另一示例示图。
图4(A)和图4(B)描绘了示出用于循环过程中止的代码布局(layout)的示例示图。
图5(A)和图5(B)描绘了示出用于恢复分支指令的代码的示例示图。
图6描绘了示出用于循环过程中止的某些本机代码的示例示图。
图7描绘了用于循环过程中止的示例流程图。
具体实施方式
通常,JIT代码高速缓存中的代码执行比在解释器中更快速。然而,解释器能够执行不适合于JIT代码高速缓存的大量的复杂处理逻辑和辅助操作。因此,在某些情形下可能需要从JIT代码高速缓存切换到解释器。例如,垃圾收集(GC)过程可能更好地是使用解释器来执行。具体地,监测线程可以在JVM中设置中止标记以指示需要暂停对当前过程的执行。解释器定期地检测中止标记。如果检测到该标记被设置,则当前(例如,正在JIT代码高速缓存中被执行)的过程被中止并且使用解释器来执行GC过程。一经完成GC过程,就传输信号以唤醒被中止的过程。在当前过程对应于经常要求长时间来执行的循环过程时,在执行GC过程之前等待直到整个循环过程结束可能就太迟了。因此,循环过程可能需要不时地被中止以便执行GC过程。
图2描绘了示出循环过程中止的示例示图。如图2中所示出的,(例如,作为Java程序的一部分的)循环过程的源代码202被分解为字节代码204,并且一些字节代码被编译为本机代码206。在循环过程的每次迭代中的循环返回边缘处检查中止标记。如果中止标记被设置,则(例如,JIT代码高速缓存中执行的)循环过程被中止并且进入解释器以便执行(例如,与GC过程有关的)某些中止指令。
具体地,(例如,在“000d”处的)字节代码208对应于循环返回边缘,并且与循环返回边缘相关联的本机代码210被执行以检查中止标记。如图2中所示出的,[r6,#42]对应于中止标记的地址。如果中止标记不是零,则它指示中止标记被设置。(例如,与重构DalvikPC有关的)本机代码212被执行。JIT代码高速缓存中执行的循环过程被中止。如图2中所示出的,[r6,#108]对应于解释器的入口,并且[r15pc,#64]对应于解释器的一个或多个参数的设置。
图3描绘了示出循环过程中止的另一示例示图。如图3中所示出的,当中止事件发生时,与JIT代码高速缓存302中的循环过程的关键路径(例如,循环返回边缘)相关联的一个或多个分支指令被替换为用于跳转到解释器304的指令。因此,循环过程响应于中止事件而被中止,并且(例如,与GC过程有关的)某些中止指令在解释器304中被执行。
具体地,监测器线程306响应于(例如,与GC过程有关的)中止事件来设置中止标记。另外,监测器线程306确定与循环过程的关键路径(例如,循环返回边缘)相关联的一个或多个分支指令,并且将这些分支指令替换为一个或多个跳转指令。当与JIT代码高速缓存302中的循环过程相关联的指令的执行到达关键路径(例如,循环返回边缘)时,运行线程308JIT在代码高速缓存302中恢复(restore)分支指令并且跳转到解释器304。例如,可以在解释器304中的(例如,与GC过程有关的)中止指令的执行之后立即重新开始(resume)循环过程。在另一示例中,可以在解释器304中的(例如,与GC过程有关的)中止指令的执行时的一个延迟之后重新开始循环过程。
在一些实施例中,运行线程308在JIT代码高速缓存302中恢复分支指令时测试中止标记。如果中止标记没有被设置,则它指示没有中止事件发生,并且运行线程308促使循环过程继续。如果中止标记被设置,则运行线程308促使JIT代码高速缓存302的退出以及解释器304的进入。
在某些实施例中,对于包括单个循环返回边缘的简单循环过程,监测器线程306选择一个或多个分支指令,该一个或多个分支指令表示为了循环过程中止而将被替换的该单个循环返回边缘。对于包括多个循环返回边缘的复杂循环过程,监测器线程306选择如下的分支指令,这些分支指令表示为了循环过程中止而将被替换的一个或多个循环返回边缘。中止标记在循环过程中不被检查。
图4(A)和图4(B)描绘了示出用于循环过程中止的代码布局的示例示图。如图4(A)中所示出的,分支指令“T1”(例如,“B入口”)表示(例如,正在JIT代码高速缓存中被执行的)循环过程的循环返回边缘并且指向该循环过程的第一指令。当中止事件发生时,如图4(B)中所示出的,分支指令“T1”被选择并且被替换为跳转指令(例如,“B T3”)。当“T1”处的跳转指令被执行时,它跳转到指令“T3”,而不是循环过程的第一指令。
具体地,一经指令“T3”的执行,分支指令(例如,“B入口”)就在“T1”处被恢复。指令“T4”被执行以中止循环过程并且跳转到用于执行与中止事件相关联的中止指令的解释器。指令“T5”被执行以继续该循环过程(例如,在解释器中的中止指令的执行之后)。
如图5(A)中所示出的,一个或多个寄存器中所存储的值被保存并且分支指令“B入口”在“T1”处被恢复,从而下一次分支指令被执行时,它将跳转到循环过程的第一指令。中止标记被测试。如果中止标记没有被设置,则提供去往指令“T5”的返回地址用于继续循环过程。然后,寄存器被恢复。图5(B)描绘了用于图5(A)中所示出的过程的示例本机代码。
图6描绘了示出用于循环过程中止的某些本机代码的示例示图。如图6中所示出的,分支指令602表示循环过程的循环返回边缘并且指向循环过程的第一指令604。当中止事件发生时,分支指令602被选择并且被替换为跳转指令。当跳转指令被执行时,“中止轮询”区域612中的指令被执行。具体地,分支指令602被恢复。指令606被执行以中止循环过程并且跳转到解释器,以便执行(例如,以指令608开始的)与中止事件相关联的中止指令。在解释器中的中止指令的执行之后,指令610被执行以继续循环过程。
图7描绘了用于循环过程中止的示例流程图。在702处,与循环过程相关联的一个或多个循环指令被加载在代码高速缓存中。例如,代码高速缓存与JIT编译器相关联。在704处,代码高速缓存中的与该循环过程的分支相关联的一个或多个分支指令被确定。例如,该分支对应于与该循环过程相关联的循环返回边缘。在706处,中止事件被检测。在一些实施例中,中止标记被设置以指示中止事件发生。在708处,一经检测到中止事件,在代码高速缓存中,分支指令被替换为一个或多个跳转指令。在710处,确定跳转指令是否在代码高速缓存中被执行。如果跳转指令在代码高速缓存中被执行,则在712处,代码高速缓存中的分支指令被恢复。在714处,循环过程被中止。在716处,与中止事件相关联的一个或多个中止指令在解释器中被执行。例如,该解释器与Java虚拟机(例如,Dalvik)相关联。
本书面描述使用示例来公开本发明,包括最佳模式,并且还使得本领域的技术人员能够作出并使用本发明。本发明的可专利范围可以包括本领域的技术人员想到的其他示例。然而,也可以使用其他的实施方式,诸如被配置为执行本文所描述的方法和系统的固件或适当设计的硬件。例如,本文所描述的系统和方法可以被实施在独立的处理引擎中,被实施为协处理器,或者被实施为硬件加速器。在又另一示例中,本文所描述的系统和方法可以被提供在包含指令(例如,软件)的许多不同类型的计算机可读介质上,包括计算机存储机构(例如,CD-ROM、磁盘、RAM、闪存、计算机的硬驱动器,等等),这些指令(例如,软件)用于在由一个或多个处理器进行的执行中使用,以执行方法的操作并实施本文所描述的系统。
Claims (17)
1.一种用于循环过程中止的方法,所述方法包括:
将与循环过程相关联的循环指令加载到代码高速缓存中;
标识所述代码高速缓存中的所述循环过程的分支指令;
检测中止事件;
响应于检测到所述中止事件,将所述代码高速缓存中的所述分支指令替换为跳转指令用于跳转到解释器,所述解释器被配置为执行与所述中止事件相关联的一个或多个中止指令;
继续程序执行直到所述跳转指令被达到;
在所述跳转指令被达到时,通过跳转到所述解释器来执行所述跳转指令;
响应于所述跳转指令的执行,恢复所述代码高速缓存中的所述分支指令,以及
由所述解释器执行所述一个或多个中止指令,其中在所述一个或多个中止指令的执行完成之前,所述代码高速缓存中的所述分支指令的所述恢复被执行;以及
在所述一个或多个中止指令的执行之后,返回到所述循环过程的执行。
2.根据权利要求1所述的方法,其中所述分支对应于与所述循环过程相关联的循环返回边缘。
3.根据权利要求1所述的方法,进一步包括:
设置中止标记。
4.根据权利要求3所述的方法,其中在所述循环过程期间不测试所述中止标记。
5.根据权利要求1所述的方法,进一步包括:
响应于所述分支指令在所述代码高速缓存中被恢复,测试中止标记;以及
响应于所述中止标记没有被设置,继续所述循环过程。
6.根据权利要求1所述的方法,其中所述代码高速缓存与即时(JIT)编译器相关联。
7.根据权利要求1所述的方法,其中所述解释器与Java虚拟机相关联。
8.一种用于循环过程中止的系统,所述系统包括:
非暂态计算机可读介质,存储有代码高速缓存,所述代码高速缓存被配置为存储与循环过程相关联的一个或多个循环指令;
数据处理器,被配置为执行指令以实现:
监测器组件,被配置为标识所述代码高速缓存中的所述循环过程的分支指令,
检测中止事件;以及
响应于检测到所述中止事件,将所述代码高速缓存中的所述分支指令替换为跳转指令用于跳转到解释器,所述解释器被配置为执行与所述中止事件相关联的一个或多个中止指令;
运行组件,被配置为继续程序执行直到所述跳转指令被达到;
在所述跳转指令被达到时,通过跳转到所述解释器来执行所述跳转指令;以及
响应于所述跳转指令的执行,恢复所述代码高速缓存中的所述分支指令,以及
所述解释器被配置为执行所述一个或多个中止指令,其中在所述一个或多个中止指令的执行完成之前,恢复所述代码高速缓存中的所述分支指令被执行;以及
处理引擎,被配置为在所述一个或多个中止指令的执行之后,返回到所述循环过程的执行。
9.根据权利要求8所述的系统,其中所述分支对应于与所述循环过程相关联的循环返回边缘。
10.根据权利要求8所述的系统,其中所述监测器组件进一步被配置为设置中止标记。
11.根据权利要求10所述的系统,其中所述运行组件被配置为在所述循环过程期间不测试所述中止标记。
12.根据权利要求8所述的系统,其中所述运行组件进一步被配置为:
一经所述分支指令的所述执行,测试中止标记;以及
响应于所述中止标记没有被设置,继续所述循环过程。
13.根据权利要求8所述的系统,其中所述代码高速缓存与即时(JIT)编译器相关联。
14.根据权利要求8所述的系统,其中所述解释器与Java虚拟机相关联。
15.一种用于循环过程中止的系统,所述系统包括:
代码高速缓存,被配置为存储与循环过程相关联的循环指令;
一个或多个数据处理器,被配置为:
标识所述代码高速缓存中的所述循环过程的分支指令;
检测中止事件;
响应于检测到所述中止事件,将所述分支指令替换为跳转指令用于跳转到解释器,所述解释器被配置为执行与所述中止事件相关联的一个或多个中止指令;
继续程序执行直到所述跳转指令被达到;
在所述跳转指令被达到时,在所述代码高速缓存中执行所述跳转指令;
响应于所述跳转指令的执行,恢复所述代码高速缓存中的所述分支指令;以及
在解释器中执行所述一个或多个中止指令,其中在所述一个或多个中止指令的执行完成之前,恢复所述代码高速缓存中的所述分支指令被执行;以及
在所述一个或多个中止指令的执行之后,返回到所述循环过程的执行。
16.根据权利要求15所述的系统,其中所述分支对应于与所述循环过程相关联的循环返回边缘。
17.根据权利要求15所述的系统,其中所述一个或多个数据处理器进一步被配置为:
一经所述代码高速缓存中的所述分支指令的所述恢复,测试中止标记;以及
响应于所述中止标记没有被设置,继续所述循环过程。
Applications Claiming Priority (3)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| US201361908429P | 2013-11-25 | 2013-11-25 | |
| US61/908,429 | 2013-11-25 | ||
| PCT/IB2014/003009 WO2015075550A2 (en) | 2013-11-25 | 2014-11-05 | Systems and methods for loop suspension in java programming |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| CN105765521A CN105765521A (zh) | 2016-07-13 |
| CN105765521B true CN105765521B (zh) | 2019-03-19 |
Family
ID=53180324
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN201480064229.XA Expired - Fee Related CN105765521B (zh) | 2013-11-25 | 2014-11-05 | 用于Java编程中的循环中止的系统和方法 |
Country Status (4)
| Country | Link |
|---|---|
| US (1) | US9250935B2 (zh) |
| EP (1) | EP3074860A4 (zh) |
| CN (1) | CN105765521B (zh) |
| WO (1) | WO2015075550A2 (zh) |
Citations (5)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US6643803B1 (en) * | 1999-02-19 | 2003-11-04 | Texas Instruments Incorporated | Emulation suspend mode with instruction jamming |
| CN1688974A (zh) * | 2001-12-31 | 2005-10-26 | 英特尔公司 | 挂起线程执行直到发生指定的存储器访问的方法和设备 |
| US20070067573A1 (en) * | 2005-09-20 | 2007-03-22 | Bruening Derek L | Thread-shared software code caches |
| US20090055814A1 (en) * | 2007-08-20 | 2009-02-26 | Gallop Patrick G | Just-in-time compiler support for interruptible code |
| CN102193777A (zh) * | 2010-03-10 | 2011-09-21 | 微软公司 | 循环控制流转移 |
-
2014
- 2014-11-05 EP EP14864276.2A patent/EP3074860A4/en not_active Withdrawn
- 2014-11-05 WO PCT/IB2014/003009 patent/WO2015075550A2/en not_active Ceased
- 2014-11-05 CN CN201480064229.XA patent/CN105765521B/zh not_active Expired - Fee Related
- 2014-11-05 US US14/533,540 patent/US9250935B2/en not_active Expired - Fee Related
Patent Citations (5)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US6643803B1 (en) * | 1999-02-19 | 2003-11-04 | Texas Instruments Incorporated | Emulation suspend mode with instruction jamming |
| CN1688974A (zh) * | 2001-12-31 | 2005-10-26 | 英特尔公司 | 挂起线程执行直到发生指定的存储器访问的方法和设备 |
| US20070067573A1 (en) * | 2005-09-20 | 2007-03-22 | Bruening Derek L | Thread-shared software code caches |
| US20090055814A1 (en) * | 2007-08-20 | 2009-02-26 | Gallop Patrick G | Just-in-time compiler support for interruptible code |
| CN102193777A (zh) * | 2010-03-10 | 2011-09-21 | 微软公司 | 循环控制流转移 |
Also Published As
| Publication number | Publication date |
|---|---|
| EP3074860A4 (en) | 2017-10-11 |
| CN105765521A (zh) | 2016-07-13 |
| US9250935B2 (en) | 2016-02-02 |
| US20150149986A1 (en) | 2015-05-28 |
| EP3074860A2 (en) | 2016-10-05 |
| WO2015075550A2 (en) | 2015-05-28 |
| WO2015075550A3 (en) | 2015-09-17 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US8359496B1 (en) | Fault-resistant just-in-time compiler | |
| KR102025556B1 (ko) | 처리 장치, 추적 유닛 및 진단 장치 | |
| US10089126B2 (en) | Function exit instrumentation for tail-call optimized code | |
| US9678816B2 (en) | System and method for injecting faults into code for testing thereof | |
| US10466988B2 (en) | Systems and methods for automatic computer code parallelization | |
| CN101814049A (zh) | 一种内存泄漏探测方法 | |
| US10725889B2 (en) | Testing multi-threaded applications | |
| US20180365127A1 (en) | Method and device for non-intrusively collecting function trace data | |
| KR20120083803A (ko) | 가상머신을 위한 추가코드 생성장치 및 방법 | |
| US9471583B2 (en) | Data race analysis with improved detection filtering | |
| CN110187884B (zh) | 一种多线程应用场景下的访存指令插桩优化方法 | |
| CN109885489B (zh) | 驱动程序中数据竞争检测方法及装置 | |
| US20150113251A1 (en) | Systems and Methods for Register Allocation | |
| Bai et al. | Effective detection of sleep-in-atomic-context bugs in the Linux kernel | |
| EP3619612B1 (en) | Temporary de-optimization of target functions in a cloud debugger | |
| US11029929B2 (en) | Using emulation to improve startup time for just-in-time compilation | |
| US8726244B2 (en) | Software breakpoint handling by eliminating instruction replacement and execution under certain conditions | |
| Sato et al. | On-the-fly detection of precise loop nests across procedures on a dynamic binary translation system | |
| JP4763743B2 (ja) | プログラム動作比較装置及び方法及びプログラム | |
| US9250935B2 (en) | Systems and methods for loop suspension in java programming | |
| Yuan et al. | Synchronization identification through on-the-fly test | |
| CN106897051B (zh) | 一种进程清理的方法及装置 | |
| US9286090B2 (en) | Method and system for compiler identification of code for parallel execution | |
| Meng et al. | Dynamic instrumentation for nested fork-join parallelism in openmp programs | |
| US20100192023A1 (en) | Optimizing Exception and Error Propagation Through Scopes |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| C06 | Publication | ||
| PB01 | Publication | ||
| C10 | Entry into substantive examination | ||
| SE01 | Entry into force of request for substantive examination | ||
| GR01 | Patent grant | ||
| GR01 | Patent grant | ||
| CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20190319 Termination date: 20191105 |
|
| CF01 | Termination of patent right due to non-payment of annual fee |