CN102193777A - 循环控制流转移 - Google Patents

循环控制流转移 Download PDF

Info

Publication number
CN102193777A
CN102193777A CN2011100658760A CN201110065876A CN102193777A CN 102193777 A CN102193777 A CN 102193777A CN 2011100658760 A CN2011100658760 A CN 2011100658760A CN 201110065876 A CN201110065876 A CN 201110065876A CN 102193777 A CN102193777 A CN 102193777A
Authority
CN
China
Prior art keywords
circulation
address
thread
loop
unit
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.)
Granted
Application number
CN2011100658760A
Other languages
English (en)
Other versions
CN102193777B (zh
Inventor
S·莫热
M·M·马格鲁德
F·V·佩斯彻-盖里
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of CN102193777A publication Critical patent/CN102193777A/zh
Application granted granted Critical
Publication of CN102193777B publication Critical patent/CN102193777B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/322Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
    • G06F9/325Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for loops, e.g. loop detection or loop counter
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

描述了循环控制流转移。循环控制流转移支持线程同步、无用信息收集以及其他涉及长时间运行循环的挂起的情形。可转移循环具有循环主体、循环顶部、包括循环顶部地址的间接单元、以及引用间接单元的循环跳转指令序列。在普通执行中,控制通过间接单元流到循环顶部。然而,在间接单元被更改后,执行流被转移到远离循环顶部的点。诸如无用信息收集等操作被执行而循环(以及由此使用该循环的(诸)线程)被因此转移。内核或另一线程接着将循环顶部地址还原到间接单元内,并且执行流通过被还原的间接单元再一次继续到循环顶部。

Description

循环控制流转移
技术领域
本发明涉及循环控制流,尤其涉及循环控制流转移。
背景技术
在软件内部,控制流机制帮助指定执行或评估各个语句、指令、调用、以及其他项的次序。在源代码级别,并且有时在更低的级别,不同的编程语言和不同的运行时环境可提供不同的控制流机制。
在机器或汇编语言级别,控制流指令通常通过更改程序计数器来工作。在源代码内部,给定的语言可提供控制流语句,这些控制流语句:继续在不同于后面的语句的位置执行(例如,无条件分支(branch)、跳转(jump)、转到(goto));只有在满足某些条件时执行指定的语句(例如,条件分支(branch));取决于某些指定的条件执行指定的语句零次或更多次(例如,循环(loop));执行一组远处的语句并接着返回到其离开的地方(例如,例程、函数、方法、协同例程);和/或无条件地中止执行。
在许多情况下,给定控制流机制对程序的数据的效果能使用若干等效的控制流机制中的任一个来获得。例程主体可以是内联的,例如,不改变程序的关于针对给定输入的数据输出的行为(虽然执行速度和/或存储器要求可改变)。同样,在循环主体中间或末尾有退出条件的循环可具有其退出条件在循环主体的顶部被测试的功能上等效的指令序列。具有一个进入和一个退出的控制流结构通常比那些不具有一个进入和一个退出的控制流结构更容易理解,因为(至少在概念上)这样的结构能在程序的任何地方作为单个语句使用而不会使控制流变得复杂。这样的控制流结构被称为“组成的”。例如,许多循环是组成的结构。
发明内容
在某些计算情形中,同步地暂停某些或全部程序线程是有帮助的或者甚至是必须的。例如,同步线程可以是无用信息收集(回收未使用的存储器)的部分、实时***中高优先级代码的及时执行的部分、和/或允许进程达成协议或提交特定的一系列动作的进程同步的部分。然而,某些线程包括长时间运行循环,诸如没有例程调用的循环,并且某些同步这样的线程的方法***使得程序代码复杂化并降低执行性能的程序状态注释或全局状态检验。
在此讨论的某些实施例提供用于线程同步或其他目的的循环控制流转移的替换方式。例如,假定由虚拟执行***或其他内核管理的可执行模块包括具有循环主体和循环顶部的循环。一间接单元包括循环顶部地址,即,指向循环顶部的地址。循环跳转指令序列引用该间接单元。在该上下文中,第一线程执行循环主体的迭代。执行加载包括在间接单元内的地址,并通过在间接单元中指定的地址继续第一线程的执行流到循环顶部。执行的第二线程更改间接单元的内容使得该间接单元包括除了循环顶部地址之外的地址,例如,内核同步例程地址;该更改可以被原子地执行。无论如何,第一线程的执行流通过被更改的间接单元被转移到远离循环顶部的点。诸如无用信息收集等同步操作被执行而循环(以及由此的使用该循环的线程)被因此转移。内核或另一线程接着将循环顶部地址还原到间接单元内,并且第一线程的执行流通过被还原的间接单元再一次继续到循环顶部。
循环转移能在不限制哪些寄存器在从循环主体底部到循环顶部的连续转换中保持有效的情况下执行。在某些变型中,多个循环和/或多个线程被转移。对强行地从另一线程修改一线程的执行上下文的操作***支持不必是可用的也不必被使用。
在某些实施例中,代码生成器提供具有循环主体和循环顶部的循环。代码生成器将间接单元与循环顶部关联,使得循环跳转指令序列包括到包括在间接单元内的地址的跳转。代码生成器也指定原始值存储位置,该存储位置被调整大小以保存循环顶部地址的表示,即,该地址本身或该地址的已编码版本,诸如压缩的版本。代码生成器发出重定向目标代码,该重定向目标代码在被执行时将准备对应于相应的间接单元的标识符并将控制传送到重定向处理例程。简而言之,如所讨论的,代码生成器生成用于影响循环控制流转移的代码。代码生成器,和/或如此生成的代码,可驻留在计算机***的存储器内,与***的逻辑处理器可操作地通信。
给出的示例仅是说明性的。本概述并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。相反,提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的某些概念。本发明用权利要求书来定义,且在本发明内容与权利要求书冲突的情况下,应以权利要求书为准。
附图说明
将参考附图来给出更具体的描述。这些附图仅示出了所选方面,且因此未完全确定覆盖或范围。
图1是示出在可存在于多个网络节点上的操作环境中的一计算机***的框图,该计算机***具有至少一个处理器,至少一个存储器,包括至少一个循环、内核、以及其它项的可执行件,并且还示出了配置的存储介质实施例;
图2是示出在示例架构内的间接单元、原始值存储位置、以及其他循环转移项的框图;
图3是示出一些过程的步骤和配置的存储介质实施方式的流程图;
图4是示出普通循环执行,即,在其中可转移循环不被转移的执行的控制流图;以及
图5是示出“被劫持的(hijacked)”循环执行,即,在其中可转移循环被转移的执行的控制流图。
具体实施方式
概览
为了执行诸如无用信息收集等某些***任务,虚拟执行***可能需要同步地暂停所有程序线程。为了及时地暂停长时间运行线程(例如,没有调用的循环),编译器可将程序状态注释(诸如变量活跃度信息)或全局状态检验***到程序代码中。然而,这种额外的信息和逻辑往往使程序代码变得复杂并降低其执行性能。
一种暂停长时间运行线程的方法是所谓的完全可中断代码,例如,由微软
Figure BSA00000454397900041
.NET运行时环境实现的(微软和“.NET”是微软公司的标记)。包括没有调用的循环的程序方法用描述无用信息收集指针在该方法内的每单个机器指令处的活跃度的信息来注释。这种注释允许虚拟执行***在该方法内的任意点强行地挂起运行该代码的线程并将其执行重定向到一安全点。然而,这只有在操作***支持特定线程状态管理功能(诸如一线程强行地改变另一线程的上下文的能力)的情况下是可能的。
暂停长时间运行线程的另一方法包括***到长时间运行循环内的状态检验,例如,如用于Mac OS
Figure BSA00000454397900042
软件的微软Silverlight
Figure BSA00000454397900043
方案实现的(Silverlight是微软公司的标记,Mac OS是苹果公司的标记)。这种方法在诸如Mac OS等某些缺乏完全可中断代码所需的支持的操作***上使用。然而,这种方法涉及将额外的代码添加到循环中以显式地检验与无用信息收集器同步的需要。
在此描述的某些实施例提供了一种不同的方法。在某些实施例中,例如,虚拟执行***(VES)使用了称为返回地址劫持(重定向返回地址)的标准技术以在调用返回站点获取程序线程的控制,并使用在此描述的循环控制流转移技术来获取执行缺乏调用的长时间运行循环的程序线程的控制。使用循环转移,长时间运行循环代码生成被改变以使得当控制跳转回循环主体的开头时控制流通过间接单元。在运行时,当无用信息收集器(例如)需要线程停止时,VES修改该间接单元的内容以指向循环专用汇编形实转换程序(thunk),这最终将导致线程在该循环的下一次迭代与无用信息收集器会合。
更一般地,在此提供的循环转移的各方面包括将间接单元用作用于通过循环转移来劫持由VES管理的线程的机制,从而提供了其中对每个候选循环程序内只有一个额外的点需要无用信息收集器活跃度信息的实现方式。间接单元由另一VES线程写为该机制的部分以获取循环内线程的控制。在存在间接跳转指令的x86类处理器架构上,对循环代码的主体,所有寄存器保持对代码生成器可用。所描述的循环转移方式可被移植到发明人已知的所有主要操作***上,因为对强行施加线程上下文改变的专用操作***支持对于循环转移是不需要的。以下描述循环转移的其他各方面。
现在将参考诸如附图中示出的示例性实施例,且此处将使用具体语言来描述这些实施例。但是相关领域且拥有本发明的技术人员将想到的、此处所示的特征的更改和进一步修改以及此处所示的原理的其他应用应被认为是在权利要求书的范围内。
各术语的意义在本发明中阐明,因此权利要求书应仔细注意这些阐明来阅读。给出了具体示例,但是相关领域的技术人员将理解,其他示例也落入所使用的术语的意义内,且在一个或多个权利要求的范围内。各术语不一定需要具有与它们在一般使用中、在特定行业使用中、或在特定字典或一组字典的使用中所具有的意义相同的意义。与各种措辞一起使用附图标记来帮助显示术语的宽度。给定一段文本中省略附图标记并不一定意味着该附图的内容没有被该文本讨论。发明人声称并行使其对于其自己的词典编纂的权利。各术语此处可在详细描述和/或申请文件的别处显式或隐式地定义。
如本文所使用的,“计算机***”可包括例如一个或多个服务器、主板、处理节点、个人计算机(便携式或非便携式)、个人数字助理、蜂窝或移动电话、和/或提供至少部分地由指令控制的一个或多个处理器的其他设备。指令可以是以存储器和/或专用电路中的软件的形式。具体而言,尽管可以想到许多实施例在工作站或膝上型计算机上运行,但其他实施例可以在其他计算设备上运行,且任何一个或多个此类设备可以是给定实施例的一部分。
“多线程化”计算机***是支持多个执行线程的计算机***。术语“线程”应被理解为包括能够或经历同步的任何代码,并且可用另一名称来称呼,如“任务”、“进程”或“协同例程”。线程可以并行地、顺序地、或以并行执行(例如,多处理)和顺序执行(例如,时间分片)的组合来运行。以各种配置设计了多线程化环境。执行线程可以并行地运行,或者线程可以被组织供并行执行但实际依次轮流执行。多线程化可以例如通过在多处理环境中在不同核上运行不同线程、通过对单个处理器核上的不同线程进行时间分片、或通过时间分片和多处理器线程化的某种组合来实现。线程上下文切换可以例如由内核的线程调度器、由用户空间信号、或由用户空间和内核操作的组合来发起。线程可轮流在共享数据上操作,或者每一线程可以例如在其自己的数据上操作。
“逻辑处理器”或“处理器”是单个独立的硬件线程处理单元。例如,每一个核运行两个线程的超线程化四核芯片具有8个逻辑处理器。处理器可以是通用的,或者它们可以针对诸如图形处理、信号处理、浮点算术处理、加密、I/O处理等特定用途来定制。
“多处理器”计算机***是具有多个逻辑处理器的计算机***。多处理器环境以各种配置出现。在一给定配置中,所有处理器可以在功能上是等价的,而在另一配置中,某些处理器可以借助具有不同硬件能力、不同软件分配或两者而不同于其他处理器。取决于配置,处理器可在单个总线上彼此紧耦合,或者它们可以是松耦合的。在某些配置中,处理器共享中央存储器,在某些配置中它们各自具有其自己的本地存储器,且在某些配置中存在共享和本地存储器两者。
在此描述的“内核”包括虚拟执行***、操作***、***管理程序、虚拟机、以及类似的硬件接口软件。
“代码”表示处理器指令、数据(包括常量、变量和数据结构)或指令和数据两者。
“自动”意味着通过使用自动化(例如,由软件针对此处讨论的具体操作配置的通用计算硬件),与不使用自动化相对。具体而言,“自动”执行的步骤并不是在纸张上用手执行或在人的脑海中执行的;它们是用机器来执行的。
贯穿本文,对任选的复数的使用意味着存在一个或多个所指示的特征。例如,“(诸)循环”意味着“一个或多个循环”或等效于“至少一个循环”。
只要参考了数据或指令,就理解这些项目配置了计算机可读存储器,从而将其变换为特定物品,而非简单地存在于纸张上、人的脑海中、或作为例如线路上的瞬时信号。
操作环境
参考图1,用于一个实施例的操作环境100可包括计算机***102。计算机***102可以是多处理器计算机***,也可以不是。操作环境可包括给定计算机***中的一个或多个机器,它们可以群集的、客户机-服务器联网的、和/或对等联网的。
人类用户104可以通过使用显示器、键盘和其他***设备106来与计算机***102交互。***管理员、开发人员、工程技术人员、以及最终用户各自都是特定类型的用户104。代表一个或多个人来行动的自动化代理也可以是用户104。存储设备和/或联网设备在某些实施例中可被认为是***设备。图1中未示出的其他计算机***可以使用经由例如网络接口设备到网络108的一个或多个连接来与计算机***102或与另一***实施例交互。
计算机***102包括至少一个逻辑处理器110。如其他合适的***等计算机***102还包括一个或多个计算机可读非瞬态存储介质112。介质112可以是不同的物理类型。介质112可以是易失性存储器、非易失性存储器、固定在原处的介质、可移动介质、磁介质、光介质、和/或其他类型的非瞬态介质(与诸如仅传播信号的线路等瞬态介质形成对比)。具体地,诸如CD、DVD、记忆棒或其他可移动非易失性存储介质等配置的介质114在被***或以其他方式安装时可以变为计算机***的功能部分,从而使得其内容可被存取来供处理器110使用。可移动的配置的介质114是计算机可读存储介质112的一个示例。计算机可读存储介质112的某些其他示例包括内置RAM、ROM、、硬盘、和不可由用户104容易地移动的其他存储设备。
介质114用可由处理器110执行的指令116来配置;“可执行”在此以宽泛的意义用来包括机器代码、可解释代码、以及在例如虚拟机上运行的代码。介质114还用通过指令116的执行创建、修改、引用和/或以其他方式使用的数据118来配置。指令116和数据118配置它们所在的介质114;当该存储器是给定计算机***的功能部分时,指令116和数据118还配置该计算机***。在某些实施例中,数据118的一部分代表了诸如产品特性、库存、物理测量、设置、图像、读数、目标、量等的真实项目。如本文讨论的,这样的数据也被转换,例如通过改变、间接、转移、还原、绑定、部署、执行、修改、显示、创建、加载和/或其他操作。
可执行件120包括软件应用组件,诸如(诸)模块122、(诸)线程124、和(诸)循环126。开发/运行时环境128也包括软件开发组件,诸如(诸)链接器、(诸)绑定器、(诸)解释器、(诸)编译器以及其他(诸)代码生成器130,并包括(诸)软件运行时组件,诸如(诸)无用信息收集器132和包括各种(诸)低级例程136的(诸)内核134。提供用于执行托管代码和支持Microsoft
Figure BSA00000454397900071
公共中间语言指令集的环境的虚拟执行***138是内核的一个示例。关于某一组件是否主要或完全是应用组件、开发组件、和/或运行时组件的分类仅仅是便于讨论;给定组件可由不同的用户和/或在不同的环境内被不同地分类。
给定操作环境100可包括向开发人员提供一组协同的软件开发工具的集成开发环境(IDE)140。具体而言,对于一些实施方式,合适的操作环境中的一些包括或帮助创建被配置成支持程序开发的Microsoft
Figure BSA00000454397900081
Visual Studio
Figure BSA00000454397900082
开发环境(微软公司的标记)。一些合适的操作环境包括Java
Figure BSA00000454397900083
环境(Sun Microsystems有限公司的标记),并且一些操作环境包括利用诸如C++或C#(“C-Sharp”)等语言的环境,但本文的教导适用于各种各样的程序设计语言、程序设计模型、以及程序,以及软件开发领域本身之外的使用线程、长时间运行循环(在它们的主体内缺乏调用的循环)的努力,或这两者。
图中所示的软件组件和其他项可以部分地或全部地驻留在一个或多个介质112中,从而配置这些介质。除了存储器和(诸)处理器之外,操作环境还包括其他硬件,如总线、电源和加速计,等等。
一些项在图1中以轮廓形式示出以强调它们不是所示操作环境的必需部分,但可以与在此讨论的操作环境中的项进行互操作。在任何附图或任何实施例中,不能得出不采用轮廓形式的项目就一定是不需要的。
***
图2示出适用于一些实施方式的体系结构。常见的循环126被变为在此讨论的可转移循环200。每个可转移循环200具有主体202、顶部204、顶部地址206、以及跳转序列208。循环主体202包括一个或多个语句或指令;语句可由一个或多个指令实现。循环顶部204可以是循环主体的第一个语句/指令,或者循环顶部可以是恰好在控制传送到循环顶部之前被执行的测试。循环顶部地址206可以是循环顶部204的存储器地址,即,在执行过程中将处理器110指向循环顶部的值。跳转序列208指示处理器向循环顶部跳转。在标准循环内,跳转序列直接指向循环顶部。但是在可转移循环内,跳转序列208指向间接单元210,如下讨论的,间接单元210进而指向循环顶部204(普通执行)或指向另一点(被转移的执行)。
更一般地,如在此使用的,“循环”包括使用以下句法指令序列格式布局的循环;方括号内示出可选的项:
Figure BSA00000454397900084
Figure BSA00000454397900091
如在此使用的,“循环”也包括在此作为伪代码或图示示例给出的循环,以及功能上等效于具有以上句法指令序列格式的循环和/或功能上等效于在此给出的伪代码或图示示例中的任一个的循环。虽然本文中有时使用诸如“顶部”以及“后退”之类的术语,但一般所进行的到/通过间接单元210的跳转的方向并不限于向后跳转或跳转到指令序列的顶部处的位置。能使用往其他方向的跳转来实现可转移循环。
作为循环的某些伪代码示例,且不排除能使用在此提供的间接单元210以及其他机制来转移的非顺序代码序列的其他示例,以下各个伪代码表示能如在此所讨论的那样来转移的循环:
Figure BSA00000454397900101
在给定的实施例中,处理器110可具有加载/存储架构、复杂指令集计算机架构、或某些其他架构。尤其,在此使用的诸如“引用”和“指令序列”之类的术语不排除当执行循环时从分支分离出的加载。
当可转移循环200被转移时,间接单元210的内容被更改。单元210的原始内容,即,循环顶部地址206,先前可能以已编码形式被保存在原始值存储位置212内。间接单元210被变为改为指向重定向目标代码214,该重定向目标代码214使用(诸)标识符224来标记该更改并接着将控制传递到转移目的地点216,诸如在其处线程124与内核134同步的同步点218。在转移目的地点,控制可被给予重定向处理例程220,诸如基于无用信息收集器活跃度信息226,控制被给予内核无用信息收集132例程136。重定向处理例程220从(诸)存储位置212中将原始地址还原到(诸)间接单元210中,并且普通循环执行被允许继续进行。重定向目标代码214可被安排在束222中以减小代码大小。
参考图1和2,某些实施方式向计算机***102提供逻辑处理器110和存储器介质112,该存储器介质112由电路、固件和/或软件来配置以通过安装在此描述的间接单元和其他控制流转移功能来变换循环结构。该机制可结合任意有限数量个循环和任意有限数量个线程来使用。
例如,一涉及生成的代码的结构的实施例包括计算机***102,该计算机***102具有逻辑处理器110、以及与该逻辑处理器可操作地通信的存储器。一可执行模块122驻留在存储器内,并由此配置存储器。可执行模块包括多个循环200,每个循环具有相应的循环主体202和相应的循环顶部204。模块122还包括多个间接单元210,每一间接单元在某一时刻包括相应的循环顶部地址206,即,指向相应的循环顶部204的地址。每一循环200还包括相应的循环跳转指令序列208,该序列包括到被包括在相应的间接单元210内的地址的跳转。多个相应的原始值存储位置212也在***内。每一原始值存储位置212被调整大小以保存相应的循环顶部地址206的表示。该表示可以是地址的编码(例如,压缩的版本),或者其可以是未编码的地址。该***还包括多个相应的重定向目标代码214,每一重定向目标代码在执行时将控制传递到单个共享的重定向处理例程220。即,所有重定向目标代码将控制传递到相同的重定向处理例程220。例如,所有循环转移可通向相同的无用信息收集器132。
在某些实施例中,循环控制转移对于循环是透明的,从而提供类似线程挂起的结果。循环的代码能如同间接单元210一直指向原始(循环顶部)地址那样来生成。作为结果,控制被转移到的重定向目标代码214和/或重定向处理例程220将处理器状态(执行寄存器值)重新建立为先前状态(或if(如果)的语义等价),并以允许VES或其他内核重构在转移点处的线程的状态的方式保存处理器状态。由此,某些实施例包括在执行时将为虚拟执行***138跟踪/标注哪些间接单元210已经被修改的代码。在某些实施例中,虚拟执行***138跟踪哪些间接单元已经被修改。例如,间接单元修改跟踪可由试图获取其他线程的控制的虚拟执行***138线程来完成。
在某些实施例中,在生成的代码的结构不控制多少线程可以执行该代码的意义上,线程涉及执行而非存储器内的代码的结构。线程124和循环200不必要是1对1映射。每一线程可以在执行零个或更多循环的进程中,并且每一循环可以在零个或更多个线程上执行。在此讨论的转移机制可结合任意数量个线程以及任意数量个循环来使用。
在某些实施例中,循环转移包括在缺少完全可中断循环代码的情况下,将(诸)线程124和内核134同步。即,VES不具有足够的信息来在循环内部的每一指令处建立线程的完整的托管执行状态。相反,VES仅具有足够的信息以在线程正在执行“通过间接跳转”指令时建立线程的完整执行状态。因此,在某些实施例中,循环转移包括在允许执行环境建立线程的完整执行状态的位置处将线程与控制执行环境的实体同步。
该机制能被用以控制/转移任意数量个线程,包括在托管执行范围内的线程,诸如VES线程。在某些实施例中,虚拟执行***138包括可使用线程来修改间接单元210并因此将其他线程的循环200转移到由虚拟执行***指定的重定向处理例程220的代码。
在某些实施例中,重定向处理例程220包括在执行时将执行无用信息收集同步操作的代码。然而,循环转移也可为了与无用信息收集不同的或另外的目的来执行,诸如循环同步、暂停执行以检查和/或存档存储器内容、软件使用遥测的收集等等。
在某些实施例中,汇编/中间语言形实转换程序(thunks)是重定向目标代码214的示例。形实转换程序可具有指令序列的特定压缩结构。被设计为束222以最大化小“push imm8”和“jmp rel8”指令的使用的形实转换程序的一种安排在以下结合标题为“其他示例”的部分详细讨论。
在某些实施例中,被重定向的目标形实转换程序本身加载对应的间接单元210的标识符224,诸如间接单元数组索引和模块ID。接着,形实转换程序跳转到公共例程220。该公共例程可与无用信息收集器132进行同步、等待无用信息收集器完成、并接着使用间接单元索引来查找循环顶部地址206、并接着跳转到该地址。无用信息收集器代码将在咨询了位图或其他跟踪结构以查看它需要哪些单元210来在其中还原原始地址后还原间接单元210本身。
在某些实施例中,代码生成在两个工具之间拆分,即,编译器和绑定器。编译器产生具有循环主体202的循环126,并且绑定器修改循环126以创建具有通过单元210的间接的跳转的可转移循环200。绑定器不需要对编译器的循环主体代码生成施加要求。即,所描述的循环重定向技术对于产生循环主体代码的代码生成器130而言能是透明的。在某些实施例中,编译器或绑定器均不施加循环对齐要求,而在其他实施例中,循环对齐可由中间语言代码生成器、绑定器、和/或另一工具来强制实施。
在某些实施例中,还原间接单元210的代码在运行时环境内部,并由此不是由编译器作为应用程序的一部分生成的。编译器生成重定向目标代码214,该重定向目标代码214不还原间接单元,而是指出对于该特定的线程,跳转回哪里(循环顶部)。
在某些实施例中,包括与附图4和5一致的某些实施例中,编译器在其标识为可能长时间运行的方法402循环内生成修改的回跳(back-jump)。该修改的回跳代码生成加载间接单元210并跳转到在间接单元内指定的代码地址。x86处理器架构具有可被用于该目的的单个间接的跳转指令。这些仅仅是对于循环内的代码主体的改变。这些代码改变小于“检验全局状态”方案,但大于不需要循环主体改变的“完全可中断代码”方案。
在这些具体实施例中,编译器发出循环目标位置(即,循环主体内的第一指令)的无用信息收集器活跃度信息226。作为结果,循环的执行性能受额外代码非常小的影响,但相比于完全可中断代码(其影响整体虚拟执行***性能),存在所需的相当少量的额外无用信息收集器活跃度信息。而且,代码改变允许线程本身趋向VES会合,而完全可中断代码需要特殊操作***支持以允许一线程强行地重定向另一线程的执行。这使得完全可中断代码在没有该支持的操作***上是难以处理的。
在这些具体实施例中,编译器也为每一被修改的循环发出额外的被重定向的目标形实转换程序502,其在VES试图获取执行该代码的线程的控制时用作间接单元的目标地址。该形实转换程序502是重定向目标代码214的一个示例,其将标记哪个循环是原始循环目标地址所对应的并接着与VES会合。
VES被假定已经能够标识给定的线程124在哪个方法402中执行。一旦查明了给定线程在包括这些循环中的一个或多个的方法内执行,其将与该方法相关联的(诸)间接单元210从指向它们相应的循环顶部204更改为指向它们相应的被重定向的目标形实转换程序502。VES可例如根据其认为合适的只对方法402内的一个循环200、对方法402内的所有循环200、或对模块122内的所有循环200更改(诸)间接单元。在完全可中断方案中,VES使用特殊操作***支持以强行地暂停并修改另一线程的上下文状态。这样的支持不是在所有操作***上都是可用,例如,苹果公司的Mac OS
Figure BSA00000454397900131
操作***。
在这些实施例中,在继续普通执行之前,VES还原其更改的所有间接单元的原始内容。VES跟踪在线程挂起期间其更改了哪些间接单元并接着使用这些单元的索引在查找表或由编译器存储到模块中的其他位置212中查找它们的原始值。
被重定向的目标形实转换程序502将它们的对应的循环索引压入栈上并接着跳转到VES提供的公共会合例程220。该会合例程将线程的寄存器状态保存在无用信息收集器132能找到的地方并接着等待无用信息收集器的完成。在继续执行之前,该例程220将查找原始循环目标地址(对应于由形实转换程序压入的“循环索引”)、还原寄存器状态、并接着跳转回循环主体的顶部。
在某些实施例中,诸如人类用户I/O设备(屏幕、键盘、鼠标、图形输入板、话筒、扬声器、运动传感器等)等的***设备106将存在于与一个或多个处理器110和存储器的可操作通信中。然而,一实施例还可被深嵌入在***中,使得没有人类用户104直接与该实施例交互。软件进程可以是用户104。
在某些实施例中,该***包括通过网络连接的多个计算机。联网接口设备可使用诸如例如存在于计算机***中的分组交换网络接口卡、无线收发机、或电话网络接口等组件来提供对网络108的接入。然而,一实施例也可通过直接存储器存取、可移动非易失性介质、或其他信息存储-检索和/或传输方法来通信,或者计算机***中的一实施例可以在不与其他计算机***通信的情况下操作。
过程
图3以流程图300示出了某些过程实施例。附图中所示的过程在某些实施例中可以例如在需要极少或不需要用户输入的脚本的控制下,由附图1和/或附图2中示出的代码生成器130、内核134、循环200和/或循环转移机制自动执行。各过程可以部分地自动执行,且部分地手动执行,除非另外指明。在给定实施例中,可以重复一过程的零个或多个所示步骤,可能对不同参数或数据进行操作。一实施例中的各步骤也可按与图3中列出的从上到下次序不同的次序来完成。各步骤可以串行地、以部分重叠的方式、或完全并行地执行。遍历流程图300来指示在一过程期间执行的步骤的次序可以在过程的一次执行与过程的另一次执行之间变化。流程图遍历次序也可在一个过程实施例与另一过程实施例之间变化。各步骤可被省略、组合、重命名、重组合、或采用其他方式不偏离所示流程,只要所执行的过程是可操作的且符合至少一个权利要求。
此处提供了各示例来帮助说明该技术的各方面,但是本文中给出的示例并未描述所有可能的实施例。各实施例不限于此处提供的具体实现、排列、显示、特征、方法或情形。给定实施例可以例如包括另外的或不同的特征、机制和/或数据结构,并且还可另外偏离此处提供的示例。
在提供步骤302期间,一实施例提供从中形成可转移循环200的循环。例如,循环126可由编译器生成,或者循环可从网络108连接或本地存储介质112中读出,以实现步骤302。
在关联步骤304期间,间接单元210通过一实施例与在步骤302期间提供的循环关联。例如,在将一循环标识为长时间运行后,绑定器可修改跳转序列208以将控制传递到使用循环顶部地址来初始化的指针;该指针通过存储在该指针内的循环顶部地址担当与循环关联的间接单元。关联304可包括在例如模块的数据区域内部或在运行时环境内部分配存储。
在指定步骤306期间,一实施例指定在其中能存储关联的间接单元的原始值(循环顶部地址)的位置212,以允许稍后在循环被转移后回退到普通执行。存储位置可以具有与间接单元相同的大小,或者如果循环顶部地址被压缩则其比间接单元小。指定306可包括例如在模块的数据区域内部或运行时环境内部分配存储。
在代码发出步骤308期间,一实施例发出重定向目标代码214。具体而言,代码生成器可发出308在执行时将间接单元标识符224传递到指定的内核例程220的代码214,所以当再次希望循环的普通执行时单元210的原始值能被恢复。
在无用信息收集信息输出步骤310期间,一实施例例如在循环顶部内或重定向目标代码内输出无用信息收集器132活跃度信息。
在继续图3示出的步骤的巡视之前,现在考虑在使用上述步骤的某些实施例内的上述步骤以及它们的相互关系。某些实施例提供由诸如编译器、绑定器或两者的组合等的代码生成器执行的便于循环控制流转移的过程。该过程包括提供302如上讨论的具有循环主体和循环顶部的循环。间接单元210与循环顶部关联304,使得循环的跳转指令序列208包括到被包括在间接单元内的地址的跳转。原始值存储位置212被指定306,其大小适于保存循环顶部地址的表示。由代码生成器发出308重定向目标代码214。在执行后,重定向目标代码214将确定对应于相应的间接单元的标识符并接着将控制传递到重定向处理例程220。
在某些实施例中,代码生成器还为循环顶部输出310熟悉的无用信息收集器活跃度信息226。
虽然以上某些描述是按照具有一个间接单元的一个循环的,但在某些实施例中,代码生成器将多个间接单元与多个相应的循环顶部关联304、指定306多个相应的原始值存储位置、并发出308多个相应的重定向目标代码。在某些实施例中,指定306其大小被调整以保存循环顶部地址的表示的原始值存储位置涉及由于地址将被压缩,代码生成器为循环顶部地址的至少某些地址指定小于间接单元210的原始值存储位置212。
返回图3步骤的巡视,在获得步骤312期间,一实施例获得包括(诸)可转移循环200的可执行模块122,例如通过经由网络链路接收该模块或从本地存储中加载该模块。
在循环主体执行步骤314期间,该实施例执行循环200的主体,即,循环主体控制处理器110的行为。
在继续步骤316期间,执行通过间接单元210继续到循环200的顶部204。步骤314和316帮助提供可转移循环的普通执行的示例。
在地址更改步骤318期间,更改与循环200相关联的间接单元210的内容,使得间接单元不再指向该循环200的顶部。
在转移步骤320期间,通过被更改的318间接单元将执行转移到不是循环顶部的位置。
在还原步骤322期间,还原间接单元内容,使得间接单元再一次指向该循环200的顶部。
再次从图3的巡视中移开,上述步骤及其相互关系在下文中结合各种实施方式来更详细地讨论。图3中的其余步骤也将被讨论。
某些实施例提供用于循环控制流转移的过程。该过程使用具有可操作地与至少一个存储器介质112通信的至少一个逻辑处理器110的设备。该过程包括在存储器内获得312包括具有循环主体202和循环顶部204的循环200的可执行模块122。模块122也包括间接单元210,该间接单元210包含循环顶部地址206,即,指向循环顶部204的地址。循环200也包括引用间接单元的循环跳转指令序列208;如所述的,对于间接单元的“引用”能通过各种处理器架构来实现。
在获得模块后,该过程包括执行314循环主体的一迭代的执行的第一线程124。被包括在间接单元内的地址在处理器110内被加载,并且执行流通过在间接单元210内指定的地址继续316到循环顶部204。目前为止,执行是普通的,但不同于标准循环126,控制服从间接单元内容。
然而,在某一时刻,可能在循环主体的其他执行后,执行的第二线程更改318间接单元的内容,使得间接单元包括不是循环顶部地址的地址。可采用例如单独的重定向目标代码214的地址、或重定向处理例程220的地址来填充间接单元。该更改通过被更改的间接单元将第一线程的执行流转移320到远离循环顶部的点,通常在此被称为转移目的地点216。同步点218是转移目的地点216的示例,但是如所述的,可以出于除了同步以外的其他原因来完成转移。在某些实施例中,第一线程和第二线程各自由虚拟执行***138管理。
随后,重定向处理例程220将循环顶部地址还原322到间接单元内。第一线程的执行通过被还原的间接单元再一次继续316到循环顶部;由此继续普通执行。
一实施例可使用324多个循环200,和/或使用326多个线程。在某些实施例中,例如,(诸)线程中的一个执行多个循环200。间接单元被更改318以劫持所有循环,但可能不知道哪个循环将是实际将线程发送到转移目的地点的那个循环。即,一实施例设置所有的间接单元,它们中的一个由线程使用,并且接着所有间接单元被还原322。具体而言,假定以上介绍的循环是第一循环200,第一线程也执行第二循环200,第二循环具有相应的第二循环主体和相应的第二循环顶部,模块也包括包含指向第二循环顶部的第二循环顶部地址的第二间接单元,并且第二循环也包括引用第二间接单元的第二循环跳转指令序列。该过程通过各循环中的一个循环的被更改的第二间接单元将第一线程的执行流转移320到远离该循环的顶部的点。
在某些使用326多个线程124的实施例中,执行循环200的所有线程使用相同的间接单元210。即,间接单元基于每个循环,而不是基于每个线程来关联304。多个线程执行循环主体,并且该过程通过被更改的间接单元将执行循环主体的所有线程的执行流转移320到远离循环顶部的点216。
在某些使用324多个循环的实施例中,存储器包括在用于相应的多个循环200的代码生成期间分配的多个间接单元210(例如,表、数组、块),并且该过程包括标记332哪个(些)间接单元被更改318。注意在某些实施例中,如以下结合位图和地址组讨论的,被更改的单元允许更加高效的原始单元值的还原,但仅仅还原被更改的单元不一定是最高效的方法。
在某些实施例中,相对于设备内的执行的所有线程,更改318间接单元(使得间接单元包括不是循环顶部地址的地址)的步骤是原子的。
在某些实施例中,转移步骤通过被更改的间接单元将执行流转移320到同步点218。在某些情况下,该过程将被转移的线程与内核134在同步点处同步328。在某些实施例中,该过程执行330无用信息收集同步操作。在某些实施例中,将线程与内核同步328隐含地省略334对从另一线程强行地修改一线程的执行上下文的操作***支持,因为循环转移在缺乏这种支持的情况下发生。
在某些实施例中,基于以下考虑,保留处理器寄存器338使用。假定循环主体具有底部。通过被更改的间接单元将执行流转移320到远离循环顶部的点和将循环顶部地址还原322到间接单元内的步骤在这些实施例中是在没有限制哪些寄存器338在从循环主体底部到循环顶部的连续转换中保持有效的情况下执行的。即,这些实施例避免336在寄存器使用上施加限制来适应转移。
配置的介质
某些实施例包括配置的计算机可读存储介质112。介质112可包括盘(磁盘、光盘或其他)、RAM、EEPROM或其他ROM、和/或其他可配置存储器,具体包括非瞬态计算机可读介质(与电线和其他传播信号介质相对)。配置的存储介质可以特别地是诸如CD、DVD或闪存等可移动存储介质114。可以是可移动的或不可移动的且可以是易失性的或非易失性的通用存储器可被配置到使用诸如间接单元210、转移循环跳转序列208、以及重定向目标代码214等项目的实施例中以形成配置的介质,这些项目采用从可移动介质114和/或诸如网络连接等另一源读取的数据118和指令116的形式。经配置的介质112能够使计算机***执行用于通过在此公开的循环转移来变换数据的过程步骤。图1到3因而帮助示出配置的存储介质实施方式和过程实施方式,以及***和过程实施方式。具体而言,图3所示或此处另外教示的过程步骤中的任一个可用于帮助配置存储介质来形成配置的介质实施例。
其他示例
以下多个子节提供其他细节和设计考虑。如同此处的其他示例一样,在一给定实施例中,所描述的特征可个别和/或组合地使用,或完全不使用。
本领域的技术人员将理解,实现细节可涉及诸如具体API和具体样本程序等具体代码,因此不需要出现在每一实施例中。本领域的技术人员还将理解,讨论细节时所使用的程序标识符和某些其他术语是特定于实现的,且因此不需要属于每一实施例。然而,尽管它们不一定需要存在于此,但仍提供了这些细节,因为它们可通过提供上下文来帮助某些读者,和/或可示出此处讨论的技术的许多可能实现中的几个。
在某些实施例中,循环转移可被认为是一种型式的循环劫持,在某些方面类似于线程劫持,但是在机制、假设、替换以及其他方面与线程劫持不同。
记住上述内容之后,现在进而考虑由循环劫持解决的问题的简要概览,对于该问题的微软公共语言运行时环境方案的简要描述以及替换方案。该描述并不旨在是问题空间的完整历史或完整分析。熟悉公共语言运行时环境(CLR)无用信息收集器信息的读者可向前跳到“循环劫持概览”部分。
无用信息收集器(GS)挂起简要概览
与CLR类似,某些目标***在执行无用信息收集之前停止所有线程。这样的***处理CLR必须处理的相同的棘手子问题,即,如何以及时的方式将紧密循环安排成可中断的。在不解决该问题的情况下,在一线程上运行的紧密循环通过防止在其他线程上的进一步分配来使得那些线程饿死。
在该讨论中,想当然的是,返回地址劫持是可能的,并且异常处理遵从那些劫持。通过返回地址劫持,所有调用返回变为在其处我们能获得线程的控制的点。线程不能在没有溢出其栈的情况下无限地递归,由此留下了无调用(call-free)(也称为,“小的”或“长时间运行”)循环作为在其处线程可在没有任何方式中断它的情况下长时间运行的地方。单纯地,我们可简单地将执行检验以查看GC是否想要运行并如果是则停止线程的代码***到这些循环中。但是由于大多数无调用循环最终是非常小的,这种检验相对于循环的大小而言最终是高代价的。大多数时候,由于GC偶尔运行,所有这种检验以查看GC是否想要运行是浪费精力的。换言之,该方案具有不合需要的特性,当不被需要的时候花费太多。
理想地,我们根本不改变循环中的代码,而是安排将允许我们描述这样的循环的“副业”数据的某种方式,使得我们能够获得循环的控制并依然具有循环可能操纵的所有活动对象引用(尤其是登记的那些)的完美的知识。由此诞生“完全可中断代码”,即由CLR使用的方案。
完全可中断代码
在此使用的“完全可中断代码”指代我们为之记录在每一指令偏移处所有对象引用的位置的代码。这个记录被称为完全可中断GC信息,并且其理论上提供正确的特性,其中只有当无调用循环被标识时才需要信息,并且循环的普通执行不受GC的可停止的要求所影响。完全可中断GC信息本质上是非常详细的,但是其仅仅需要在GC时间被咨询。
循环劫持概览
在某些方面,这个方法类似于以上描述的单纯的检验并查看实现。该方法将代码添加到感兴趣的循环,该代码将允许GC获得这些循环的控制。由此,其依然具有不合需要的特性,其增加普通执行花费(始终)以处理在循环期间GC挂起的罕见情况。但是所提出的代码化改变的花费可能是小的。作为奖励,相比于当前的CLR的完全可中断代码,该方法具有较佳的映像大小特征以及较佳的GC时性能。
基本的想法是允许循环的回跳的劫持,其事后认识是我们劫持栈上的返回地址的方式的回忆。我们以此方式来变换回跳:
Figure BSA00000454397900201
该变换在最坏情况下添加6字节的代码。每一跳转目标具有在模块122映像的可写数据部分内的其自己的间接单元210以及在该映像的只读部分内的引用跳转目标表内的条目。这些单元210按照目标地址206排序,使得当内核运行时环境看见一线程正在特定方法402中执行时,其能使用该方法的地址范围来寻找该方法内的所有跳转目标,并将它们设置为将导致线程与GC同步的某些代码214、502的地址。
如同返回地址劫持一样,线程可调用另一函数而不命中循环劫持,由此GC线程可按与其对其返回地址劫持相同的方式继续将这些劫持移动到调用栈更深的地方以便更快捕捉线程。这在GS挂起同步部分中被详细地讨论。
目标间接单元在其被劫持后应该能回到其原始跳转目标。然而,由于我们不知道线程运行在哪个循环内,循环劫持不像返回地址劫持那样容易。我们因此劫持(转移320)方法内的所有循环并且线程可命中它们中的任意一个。因此,线程通过其自己的执行计算在劫持之前,其朝向目标。
我们也***某些形实转换程序502以作为循环回跳的慢路径目标。这些形实转换程序计算我们能用以恢复(还原322)原始跳转目标的数据。在某些实施例中,如在重定向的目标形实转换程序代码部分中描述的,形实转换程序被一起分组到束222中。
由重定向的目标形实转换程序计算的间接单元210索引在标识符224中使用以便在原始目标表(原始值存储位置212的一个示例)内查找原始间接单元值。在某些实施例中,原始目标表包括压缩的地址206,即,表示地址206的编码。这种压缩格式在原始目标表格式部分中描述。
在某些实施例中,为跳转目标地址计算并存储熟悉的GC活跃度信息226。对某些使用中间语言(其中偏移和地址在编译器生成的代码中用符号表示并稍后由生成可执行代码的绑定器解析为数字值)的实施例,在跳转目标处存在GC_PROBE中间语言伪代码指令以通知绑定器应该完成该回跳变换。
该机制的不足是用于修改的跳转目标间接单元210的私有页的引入。然而,在这些单元被紧密地打包的情况下,花费被认为是可接受的。如果这些私有页成为问题,则需要追求进一步的技术,诸如在生成的代码中减少这些可劫持跳转的数量。
重定向的目标形实转换程序代码
劫持循环200的过程涉及将循环的对应间接单元210设置(更改318)为新值。该新值是形实转换程序502的地址,该形实转换程序502将标识符224(以索引和模块句柄的形式)传送到执行等待GC的完成的公共运行时例程220。在某些实施例中,这些形实转换程序被一起分组到束222中并且接着四个束被分组以构成组块(chunk)。这种捆绑的安排允许我们使用每间接单元(per-indirection-cell)代码内的“push imm8”和“jmp rel8”指令,其允许形实转换程序非常小。
在某些实施例中,重定向目标代码214格式相应地看起来像以下代码。在此为促进易读性,标记已经被缩短,但同时符合父文档要求;“cc”表示“组块_公共”,“ci0”表示“组块_索引_0”,“b0c”表示“束0_公共”,依此类推:
组块代码
cc:68 xx xx xx xxpush  imm32(块的起始索引)
68 xx xx xx xx push  imm32(模块标识符)
FF 25 xx xx xx xx  jmp[_imp_CommonLoopHijackHelper]
束0
ci0:6A 00     push  0
EB 7C     jmp   b0c
cil:6A 01     push  1
EB 78     jmp   b0c
...
ci31:6A 1F    push  31
EB 00    jmp   b0c
b0c:E9 xx xx xx xxjmpcc
ci32:6A 20    push  32
EB F9    jmp   b0c
ci33:6A 21        push  33
EB F5        jmp   b0c
...
ci62:6A 3E        push  62
EB 81        jmp   b0c
束1
[组块索引63-125]
束2
[组块索引126-188]
束3
[组块索引189-251]
这种捆绑安排允许我们将252个形实转换程序打包成1033个字节。CommonLoopHijackHelper(公共循环劫持帮手)将特定的组块索引和组块的起始索引组合起来以得到进入给定模块的间接单元数组的索引。该索引进而允许公共代码例程220在GC完成后,将线程返回到其来自的循环220。
GC挂起同步
如先前提到的,在线程挂起尝试获得线程的控制的同时线程继续嵌套是可能的。因此,某些实施例沿着其调用栈向下追踪线程,在线程进入的新方法上继续应用循环劫持(转移),直到其放弃控制。
然而,由于循环劫持被应用到共享的存储器位置的这一事实,将导致复杂;循环间接单元210在可能运行相关联的循环代码的所有线程124中被共享。循环劫持的这个方面和返回地址劫持不同,其修改线程本地存储器(即,线程的栈)。当返回地址劫持时,在追踪线程时仅仅将劫持从一个栈位置移动到另一个栈位置是有效的,但这对于使用循环劫持来实现是困难的,因为当我们进一步深入栈中仅仅追踪多个线程中的一个线程时,多个线程可在相同的方法内执行。
某些实施例因此将保持挂起阶段仅仅限于开启循环劫持。即,某些实施例并不通过还原322间接单元内容来禁用循环劫持,直到所有线程已经与运行时环境同步。接着所有单元210被一次还原。
实现这种情况的一种方式使用被劫持的单元位图,其被生成到模块的数据部分中。给定的位表示一组可调大小的循环间接单元210,以减小位图的大小。只要我们希望劫持一个单元,我们劫持在该单元组内的所有单元并接着将位图内对应的位设置为1。稍后我们咨询位图以寻找哪些单元210需要被重置(被还原322)。
原始目标表格式
为了减小被劫持的单元位图的大小,间接单元210组帮助原始目标表(原始值存储位置212)的紧凑编码。该表的格式利用我们现有的压缩的整数编码。该表的第一部分包括表示从表格的开头到对应的组描述符的偏移的一系列可变长度无符号整数,这为组内的每个间接单元210编码了原始跳转目标地址206。该表的第二部分是组描述符本身。组描述符以可变长度无符号整数开始,其是从代码部分的开头到组内的第一分支目标的偏移。剩余的可变长度无符号整数是增量值,这些增量值当被累加时给出了组内的每个间接单元的原始代码偏移。例如,如果组描述符具有一系列{2000,20,10,30,5,10},该组的原始目标将是{2000,2020,2030,2060,2065,2075}。由于可变长度无符号整数的特性,越小的数字占据越小的空间,所以这种类型的累加导致更加紧凑的编码。
结论
尽管此处将具体实施例明确地图示并描述为过程、配置的介质或***,但可以理解,对一种类型的实施例的讨论一般也可扩展到其他实施例类型。例如,结合图3的过程描述还帮助描述经配置的介质,并帮助描述如结合其他附图讨论的那些***和制品等***和制品的操作。并不能得出一个实施例中的限制一定要加进另一实施例中。具体而言,各过程不一定要限于在讨论诸如配置的存储器等***或产品时提出的数据结构和安排。
并非附图中所示的每一项目都需要存在于每一实施例中。相反,一实施例可以包含附图中未明确示出的项目。尽管此处在文字和附图中作为具体示例示出了某些可能性,但各实施例可以脱离这些示例。例如,一示例的具体特征可被省略、重命名、不同地分组、重复、以硬件和/或软件不同地实例化、或是出现在两个或更多示例中的特征的混合。在某些实施例中,在一个位置处示出的功能也可在不同位置提供。
通过附图标记对全部附图作出了引用。在附图或文字中与给定的附图标记相关联的措辞中的任何明显的不一致性应被理解为仅仅是拓宽了该标记所引用的内容的范围。
如此处所使用的,诸如“一”和“该”等术语包括了所指示的项目或步骤中的一个或多个。具体而言,在权利要求书中,对一个项目的引用一般意味着存在至少一个这样的项目,且对一个步骤的引用意味着执行该步骤的至少一个实例。
标题是仅出于方便起见的;关于给定话题的信息可在其标题指示该话题的节之外找到。
所提交的所有权利要求和摘要是该说明书的一部分。
尽管在附图中示出并在以上描述了各示例性实施方式,但对本领域技术人员显而易见的是,可以作出不背离权利要求书中阐明的原理和概念的多种修改。尽管用结构特征和/或过程动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述权利要求中的具体特征或动作。给定定义或示例中标识的每一装置或方面不一定要存在于每一实施例中,也不一定要在每一实施例中都加以利用。相反,所描述的具体特征和动作是作为供在实现权利要求时考虑的示例而公开的。
落入权利要求书的等效方案的含义和范围内的所有改变应被权利要求书的范围所涵盖。

Claims (15)

1.一种用于循环控制流转移的过程,所述过程使用具有可操作地与至少一个存储器通信的至少一个逻辑处理器的设备,所述逻辑处理器具有至少一个寄存器,所述过程包括以下步骤:
获得(312)存储器内的可执行模块,所述可执行模块包括具有循环主体和循环顶部的循环,所述模块还包括包含循环顶部地址的间接单元,所述循环顶部地址即指向循环顶部的地址,所述循环还包括引用所述间接单元的循环跳转指令序列;
执行的第一线程执行(314)所述循环主体的迭代;
通过在所述间接单元内指定的地址将所述第一线程的执行流继续(316)到所述循环顶部;
执行的第二线程更改(318)所述间接单元的内容,使得所述间接单元包括不是所述循环顶部地址的地址;
通过被更改的间接单元将所述第一线程的执行流转移(320)到远离所述循环顶部的点;
将所述循环顶部地址还原(322)到所述间接单元内;以及
通过被还原的间接单元再一次将所述第一线程的执行流继续到所述循环顶部。
2.如权利要求1所述的过程,其特征在于,以下至少之一被满足:
多个线程(124)执行所述循环主体,并且所述过程通过被更改的间接单元将执行所述循环主体的所有线程的执行流转移到远离所述循环顶部的点;
所述循环是第一循环(126),所述第一线程也执行第二循环,所述第二循环具有相应的第二循环主体和相应的第二循环顶部,所述模块还包括包含指向所述第二循环顶部的第二循环顶部地址的第二间接单元,所述第二循环还包括引用所述第二间接单元的第二循环跳转指令序列,并且所述进程包括通过各循环中的一个循环的被更改的第二间接单元将所述第一线程的执行流转移到远离该循环的顶部的点。
3.如权利要求1所述的过程,其特征在于,更改(318)间接单元(使得间接单元包括不是循环顶部地址的地址)的步骤相对于所述设备内的执行的所有线程是原子的。
4.如权利要求1所述的过程,其特征在于,所述转移步骤通过被更改的间接单元将执行流转移到同步点,并且所述过程进一步包括将线程与内核在同步点处同步(328)。
5.如权利要求1所述的过程,其特征在于,所述转移步骤通过被更改的间接单元将执行流转移到同步点,并且所述过程进一步包括接着执行(330)无用信息收集同步操作。
6.如权利要求1所述的过程,其特征在于,所述存储器包括在用于相应的多个循环的代码生成期间分配的多个间接单元,并且所述过程进一步包括标记(332)哪个/哪些间接单元被更改。
7.如权利要求1所述的过程,其特征在于,所述循环主体具有底部,并且通过被更改的间接单元将执行流转移到远离循环顶部的点和将循环顶部地址还原到间接单元内的步骤是在不限制(336)哪些寄存器在从循环主体底部到循环顶部的连续转换中保持有效的情况下执行的。
8.一种用数据和指令配置的计算机可读非瞬态存储介质,所述指令在被至少一个处理器执行时使所述至少一个处理器执行一种用于方便循环控制流转移的过程,所述过程包括代码生成器的以下步骤:
提供(302)具有循环主体和循环顶部的循环;
将间接单元与所述循环顶部相关联(304),使得循环跳转指令序列包括到被包括在所述间接单元内的地址的跳转;
指定(306)其大小被调整以保存所述循环顶部地址的表示的原始值存储位置;以及
发出(308)重定向目标代码,所述重定向目标代码在执行时将确定对应于相应的间接单元的标识符并将控制传递到重定向处理例程。
9.如权利要求8所述的配置的介质,其特征在于,所述过程包括代码生成器将多个间接单元(210)与多个相应的循环顶部相关联(304),指定(306)多个相应的原始值存储位置(212),以及发出(308)多个相应的重定向目标代码(214)。
10.如权利要求8所述的配置的介质,其特征在于,指定其大小被调整以保存所述循环顶部地址的表示的原始值存储位置的步骤包括代码生成器为循环顶部地址(206)的至少某些地址指定(306)小于间接单元的原始值存储位置。
11.一种计算机***,包括:
逻辑处理器(110);
可操作地与所述逻辑处理器通信的存储器(112);
驻留在所述存储器内的可执行模块(120),所述可执行模块包括各自具有相应的循环主体和相应的循环顶部的多个循环(126),所述模块还包括各自包含相应的循环顶部地址的多个间接单元,所述循环顶部地址即指向相应的循环顶部的地址,每一循环还包括包含到被包括在相应的间接单元内的地址的跳转的相应的循环跳转指令序列;
驻留在所述存储器内的多个相应的原始值存储位置(212),每一原始值存储位置被调整大小以保存相应的循环顶部地址的表示;以及
驻留在所述存储器内的多个相应的重定向目标代码(214),每一重定向目标代码在执行时将控制传递到单个共享的重定向处理例程。
12.如权利要求11所述的***,其特征在于,进一步包括虚拟执行***(138),所述虚拟执行***包括可使用线程来修改间接单元并因此将其他线程的循环转移到由虚拟执行***指定的重定向处理例程的代码。
13.如权利要求11所述的***,其特征在于,所述重定向处理例程(220)包括在执行时将执行无用信息收集同步操作的代码。
14.如权利要求11所述的***,其特征在于,进一步包括在执行时将为虚拟执行***跟踪(332)哪些间接单元已经被修改的代码。
15.如权利要求11所述的***,其特征在于,所述重定向目标代码被一起分组为束(222)。
CN201110065876.0A 2010-03-10 2011-03-09 循环控制流转移 Active CN102193777B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US12/720,788 2010-03-10
US12/720,788 US8887142B2 (en) 2010-03-10 2010-03-10 Loop control flow diversion

Publications (2)

Publication Number Publication Date
CN102193777A true CN102193777A (zh) 2011-09-21
CN102193777B CN102193777B (zh) 2016-01-20

Family

ID=44560944

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110065876.0A Active CN102193777B (zh) 2010-03-10 2011-03-09 循环控制流转移

Country Status (2)

Country Link
US (1) US8887142B2 (zh)
CN (1) CN102193777B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104102971A (zh) * 2013-04-11 2014-10-15 波音公司 管理具有对象循环的模型
CN105765521A (zh) * 2013-11-25 2016-07-13 马维尔国际贸易有限公司 用于Java编程中的循环中止的***和方法
CN107179935A (zh) * 2016-03-11 2017-09-19 华为技术有限公司 一种指令执行方法及虚拟机
CN108604192A (zh) * 2016-02-08 2018-09-28 微软技术许可有限责任公司 等待日志调用返回的线程转移

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2510641A (en) * 2013-02-12 2014-08-13 F Secure Corp Detecting suspicious code injected into a process if function call return address points to suspicious memory area
US20220212100A1 (en) * 2021-01-04 2022-07-07 Microsoft Technology Licensing, Llc Systems and methods for streaming interactive applications

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6178499B1 (en) * 1997-12-31 2001-01-23 Texas Instruments Incorporated Interruptable multiple execution unit processing during operations utilizing multiple assignment of registers
US20020112227A1 (en) * 1998-11-16 2002-08-15 Insignia Solutions, Plc. Dynamic compiler and method of compiling code to generate dominant path and to handle exceptions
CN101373427A (zh) * 2007-08-24 2009-02-25 松下电器产业株式会社 程序执行控制装置
US20090172263A1 (en) * 2007-12-27 2009-07-02 Pliant Technology, Inc. Flash storage controller execute loop

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6151703A (en) 1996-05-20 2000-11-21 Inprise Corporation Development system with methods for just-in-time compilation of programs
US5842016A (en) 1997-05-29 1998-11-24 Microsoft Corporation Thread synchronization in a garbage-collected system using execution barriers
US5995754A (en) 1997-10-06 1999-11-30 Sun Microsystems, Inc. Method and apparatus for dynamically optimizing byte-coded programs
US6851109B1 (en) 1999-05-06 2005-02-01 International Business Machines Corporation Process and system for dynamically compiling a partially interpreted method
US6993754B2 (en) 2001-11-13 2006-01-31 Hewlett-Packard Development Company, L.P. Annotations to executable images for improved dynamic optimization functions
US7395530B2 (en) 2004-08-30 2008-07-01 International Business Machines Corporation Method for implementing single threaded optimizations in a potentially multi-threaded environment
CN101046755B (zh) 2006-03-28 2011-06-15 郭明南 一种计算机自动内存管理的***及方法
US8291393B2 (en) 2007-08-20 2012-10-16 International Business Machines Corporation Just-in-time compiler support for interruptible code
US8276131B2 (en) 2007-08-30 2012-09-25 International Business Machines Corporation Method and system for dynamic loop transfer by populating split variables
US20100122066A1 (en) * 2008-11-12 2010-05-13 Freescale Semiconductor, Inc. Instruction method for facilitating efficient coding and instruction fetch of loop construct

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6178499B1 (en) * 1997-12-31 2001-01-23 Texas Instruments Incorporated Interruptable multiple execution unit processing during operations utilizing multiple assignment of registers
US20020112227A1 (en) * 1998-11-16 2002-08-15 Insignia Solutions, Plc. Dynamic compiler and method of compiling code to generate dominant path and to handle exceptions
CN101373427A (zh) * 2007-08-24 2009-02-25 松下电器产业株式会社 程序执行控制装置
US20090172263A1 (en) * 2007-12-27 2009-07-02 Pliant Technology, Inc. Flash storage controller execute loop

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104102971A (zh) * 2013-04-11 2014-10-15 波音公司 管理具有对象循环的模型
CN104102971B (zh) * 2013-04-11 2020-04-07 波音公司 管理具有对象循环的模型
CN105765521A (zh) * 2013-11-25 2016-07-13 马维尔国际贸易有限公司 用于Java编程中的循环中止的***和方法
CN105765521B (zh) * 2013-11-25 2019-03-19 马维尔国际贸易有限公司 用于Java编程中的循环中止的***和方法
CN108604192A (zh) * 2016-02-08 2018-09-28 微软技术许可有限责任公司 等待日志调用返回的线程转移
CN108604192B (zh) * 2016-02-08 2021-11-19 微软技术许可有限责任公司 用于执行等待事件要被记录时的一个或多个任务的***、方法及介质
CN107179935A (zh) * 2016-03-11 2017-09-19 华为技术有限公司 一种指令执行方法及虚拟机
CN107179935B (zh) * 2016-03-11 2021-01-29 华为技术有限公司 一种指令执行方法及虚拟机

Also Published As

Publication number Publication date
CN102193777B (zh) 2016-01-20
US8887142B2 (en) 2014-11-11
US20110225213A1 (en) 2011-09-15

Similar Documents

Publication Publication Date Title
Kang et al. Performance comparison of OpenMP, MPI, and MapReduce in practical problems
CN105022630B (zh) 一种组件管理***及组件管理方法
CN102193777A (zh) 循环控制流转移
Beard et al. RaftLib: a C++ template library for high performance stream parallel processing
CN103221918A (zh) 上下文切换方法和装置
US9164735B2 (en) Enabling polymorphic objects across devices in a heterogeneous platform
CN102142016A (zh) 跨浏览器交互活动记录、回放以及编辑
CN103729235A (zh) Java虚拟机的编译方法和Java虚拟机
CN103279390A (zh) 一种面向小作业优化的并行处理***
Behan et al. Adaptive graphical user interface solution for modern user devices
CN102257474B (zh) 多个运行时容器共享的值解析
Holcombe et al. A general framework for agent-based modelling of complex systems
Buinevich et al. Method and prototype of utility for partial recovering source code for low-level and medium-level vulnerability search
CN105874436A (zh) 用于自主存储器的方法及***
Montella et al. Enabling android-based devices to high-end gpgpus
Malakar et al. A CUDA-enabled Hadoop cluster for fast distributed image processing
Chen et al. Full-Stack Machine Learning Development Framework for Energy Industry Applications
Zhao et al. HIPLZ: Enabling performance portability for exascale systems
Haine et al. A middleware supporting data movement in complex and software-defined storage and memory architectures
Lehmann et al. Development of context-adaptive applications on the basis of runtime user interface models
Cardall et al. GenASiS Basics: Object-oriented utilitarian functionality for large-scale physics simulations
de Carvalho Junior et al. Contextual contracts for component‐oriented resource abstraction in a cloud of high performance computing services
CN109271182A (zh) 用于搜索引擎升级的方法及装置
Park Improving the performance of HDFS by reducing I/O using adaptable I/O system
Driscoll et al. PyGAS: A partitioned global address space extension for python

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
ASS Succession or assignment of patent right

Owner name: MICROSOFT TECHNOLOGY LICENSING LLC

Free format text: FORMER OWNER: MICROSOFT CORP.

Effective date: 20150727

C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20150727

Address after: Washington State

Applicant after: Micro soft technique license Co., Ltd

Address before: Washington State

Applicant before: Microsoft Corp.

C14 Grant of patent or utility model
GR01 Patent grant