CN102141937B - 在线性栈上高效恢复协同例程 - Google Patents

在线性栈上高效恢复协同例程 Download PDF

Info

Publication number
CN102141937B
CN102141937B CN201110008477.0A CN201110008477A CN102141937B CN 102141937 B CN102141937 B CN 102141937B CN 201110008477 A CN201110008477 A CN 201110008477A CN 102141937 B CN102141937 B CN 102141937B
Authority
CN
China
Prior art keywords
coroutine
stack
single linear
call stack
linear machine
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.)
Active
Application number
CN201110008477.0A
Other languages
English (en)
Other versions
CN102141937A (zh
Inventor
N·M·加夫特
M·托格森
H·J·M·梅杰
N·古斯塔夫松
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 Technology Licensing LLC
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 Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Publication of CN102141937A publication Critical patent/CN102141937A/zh
Application granted granted Critical
Publication of CN102141937B publication Critical patent/CN102141937B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • G06F9/4486Formation of subprogram jump address
    • 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/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/485Task life-cycle, e.g. stopping, restarting, resuming execution

Abstract

未挂起协同例程由机器调用栈机制来处理,其中该栈随着作出递归调用和从递归调用返回而增长和收缩。然而,在协同例程挂起时,执行附加的调用栈处理。发出挂起消息,并且调用栈的整个能恢复部分被移除并被复制到堆。将控制返回给驱动程序方法(恢复器)的帧被复制到调用栈,从而协同例程的恢复不会递归地重新激活整个调用栈。相反,恢复器仅重新激活被称为叶帧的最顶部或最当前帧。在协同例程挂起时,其不返回到其调用者,而是返回到已重新激活它的恢复器。

Description

在线性栈上高效恢复协同例程
技术领域
本申请涉及用于恢复协同例程的系统和方法,尤其涉及在线性栈上高效恢复协同例程的系统和方法。
背景技术
在计算机科学中,协同例程是通常概括子例程并且可允许多个入口点以进行挂起和恢复执行的程序组件。协同例程有时被用于实现协作任务、迭代器、无限列表和管道。虽然子例程通常是后进先出构造,但协同例程的寿命可按其用途来规定。虽然子例程只能返回一次,但协同例程可返回或让步一次以上。虽然子例程的开始通常是其唯一入口点,但协同例程的开始是第一入口点且后续入口点可跟随让步(yield)命令。例如,同子例程一样,在协同例程中让步可将结果和控制返回给调用方协同例程,但不同于子例程,在该协同例程下次被调用时,执行可刚好在让步调用之后开始而非在协同例程开头开始。
由于协同例程可返回多次,因此有可能在后续调用时返回附加的值。其中后续调用产生附加结果的协同例程常常被称为生成器。传统子例程使用可在程序执行开头被预分配的单个栈。相反,由于协同例程能够作为对等体调用其他协同例程,因此通常为协同例程分配附加的栈。有时,预分配栈或者高速缓存预先分配的栈。
生成器还一般化子例程,并且常常被用于简化迭代器的编写。生成器中的让步语句通常不指定要跳转到的协同例程,而是将值回传给父例程。然而,仍然有可能在顶级分派器例程的辅助下在生成器设施上实现协同例程,顶级分派器例程将控制显式地传递给从生成器传回的令牌所标识的子生成器。
许多流行编程语言(包括C、C++和C#)由于基于栈的子例程实现的限制因而在该语言内不直接支持协同例程。在其中协同例程将在逻辑上被用于在可能的情况下实现一机制的情形中,通常创建使用布尔标志和其他状态变量的组合来在调用之间维护内部状态的子例程。条件语句导致基于状态变量的值而执行不同代码路径。或者,实现开关语句形式的显式状态机。
提供使用协同例程的替换方案的方法是使用线程。线程提供用于管理基本上同时执行的代码片断的实时协作交互的能力。线程通常被优先调度。协同例程通常不是。由于线程可在任何时刻被重新调度且能并发地执行,因此使用线程的程序必须注意锁定。相反,由于协同例程只能在程序中的特定点被重新调度并且不并发地执行,因此使用协同例程的程序常常完全避免了锁定问题。
在高级语言中实现协同例程的一种方法放弃了便携性。相反,处理器系列专用的实现对于函数是用汇编语言编写的,以节约和恢复协同例程上下文。必须注意这些函数的使用和编写,从而在协同例程共享相同栈时位于该栈上的变量不被覆写。因此,通常对于高级语言中基于栈的协同例程,需要函数来创建替换栈并在替换栈之间跳转。可提供第三机器专用函数以创建用于新协同例程的上下文。传统上,协同例程的栈大小是固定的且在执行期间不能增长。通常,程序分配比所需的更大的栈以避免潜在的栈溢出。
发明内容
在使用单个线性机器调用栈在没有直接协同例程支持的语言中执行的计算机系统中,驱动程序例程控制协同例程执行。当协同例程最初被另一协同例程调用时,被调用的协同例程被放到栈上调用者的帧之上。协同例程被首次挂起时,其所有栈帧向下直至驱动程序栈帧并且包括驱动程序栈帧被复制到堆。然而,若协同例程被再次挂起,则其栈帧不被再次复制到堆。当协同例程恢复时,驱动程序例程仅将叶例程放到栈上。尽管该方法中的单个挂起对于深度d的栈将花费O(d),但由于每一帧仅被复制到堆一次,因此该方法的总分摊成本为O(m),其中m是曾挂起的帧数,且m通常小于被调用的总帧数n。
若在叶例程中抛出异常,则驱动程序例程检测或抓住该异常。驱动程序在栈上用与调用者相关联的栈帧来代替与被调用者(被调用)叶例程相关联的栈帧。驱动程序执行调用方例程,并且异常被再次抛出。
提供本概述以便以简化形式介绍将在以下详细描述中进一步描述的一些概念。本概述并非旨在标识出要求保护的主题的关键特征或必要特征,亦非旨在用于限定要求保护的主题的范围。
附图说明
在附图中:
图1示出根据本文所公开主题的各方面用于在线性栈上高效恢复协同例程的系统100的示例;
图2是根据如关于图1所描述的本文所公开主题的各方面用于在线性栈上高效恢复协同例程的方法200的示例的流程图。
图3是示出其中可实现本文所公开主题的各方面的计算环境的示例的框图;以及
图4是根据本文所公开主题的各方面的集成开发环境的示例的框图。
具体实施方式
概览
根据本文所公开主题的各方面,未挂起协同例程由调用栈机制来处理,其中该栈随着作出调用和从调用返回而增长和收缩。然而,在协同例程首次挂起时,执行附加的调用栈处理。发出挂起消息,并且调用栈的整个能恢复部分被从机器调用栈移除并被复制到堆。将控制返回给驱动程序方法(恢复器)的帧被复制到调用栈,从而恢复不会递归地重新激活整个调用栈。相反,恢复器仅重新激活被称为叶帧的最顶部或最当前帧。在协同例程挂起时,其不返回到其调用者,而是返回到已重新激活它的恢复器,该恢复器检索将控制返回到的合适地址。
由编译器执行的状态机转换不循环以重复地重新激活被调用者直至被调用栈返回。从调用方状态机的观点而言,当被调用者返回时,其要么同步地返回,在这种情形中,结果(或异常)被自然地消耗且处理继续进行;要么返回包括挂起,在这种情形中,处理被挂起,且期望处理将不恢复直至被调用者完成并且恢复器返回其结果。
在线性栈上高效恢复协同例程
术语协同例程是用于动作序列的通用术语。协同例程类似于程序,除了与程序不同的是,协同例程可在执行期间被暂停(挂起)并在以后恢复。恢复可通过客户机请求来自协同例程的输出来发起。例如,在一些编程语言中,迭代器可被实现为协同例程,其任务是按需产生集合的元素。一旦该协同例程已产生集合的一元素,其暂停。在需要下一个元素时,该协同例程恢复。该过程继续,直至不需要更多元素或者直至已产生了集合中的所有元素。
恢复可通过输入变得可用来驱动或发起。例如,协同例程可在所请求数据不可用时暂停,这可能在较长等待时间通道上请求数据(例如,从盘读取或者从网络访问信息等)时发生。恢复可由回调或事件发起或者可在所请求数据变得可用时以其他方式触发。这种类型的情景很可能在采用异步编程技术时遇到。
通常,当一个程序调用另一个程序时,调用方程序等待结果并随后调用下一个程序,等待其结果,依此类推。相反,可从另一协同例程递归地调用一个或多个协同例程达到无论任何递归深度。在第一协同例程在递归协同例程调用链中调用第二协同例程时,当第二协同例程暂停时,第一协同例程暂停,依此类推。
递归程序调用和子例程调用在传统上是经由称为机器调用栈(也称为执行栈、控制栈、函数栈或运行时栈)的低级数据结构来实现的。调用栈保持跟踪每个有效被调用者在完成执行时将控制返回到的点。活跃被调用者是已被调用但尚未通过返回调用者来完成执行的被调用者。被调用者使调用者的返回地址进栈,并且在被调用者完成时,被调用者使该返回地址出栈并将控制转移到该出栈的地址。因此,被放到栈上的信息随着程序执行而增长和收缩。所描述的调用栈自动支持串行世界中的递归。取决于语言、操作系统和机器环境,调用栈可服务附加函数,包括存储本地数据、参数、逻辑运算、指向当前实例的指针(该指针(thispointer))、外围例程上下文和返回状态。
机器调用栈数据结构由栈帧构成,栈帧是包含被调用者状态信息的取决于机器的数据结构。每个栈帧对应于对子例程的调用,该子例程尚未通过返回而终止。调用栈顶部的栈帧(叶帧)保持关于当前执行的子例程的信息。由子例程调用指令提供给被调用者的返回地址通过被调用者将该值压到调用栈上来保存。在被调用者返回时,整个栈帧出栈并且控制被返回给位于返回地址处的指令。通常,一个调用栈与进程的每个任务或线程相关联。
在高级编程语言环境中,通常不允许程序员操纵调用栈的存储器。通常,程序员仅能访问将在栈上执行的函数的列表。C和C++的实现将单个线性(连续)栈用作栈帧的存储。程序调用使返回地址进栈,并且被调用者将栈上的空间分配给其自己的本地变量等。线性栈机制在串行世界中高效地工作。然而,线性栈固有地不能处理以非串行方式挂起和恢复的协同例程。因此,为了在不支持在机器调用栈级挂起和恢复协同例程的平台上实现协同例程调用,有时采用处理协同例程挂起和恢复的附加处理。
在使用单个线性机器调用栈在没有直接协同例程支持的语言中执行的计算机系统的协同例程的传统实现中,通过将机器调用栈上与协同例程相关联的栈帧存储到模仿该机器调用栈的堆中来挂起协同例程。堆是保留用于对象的存储器区域并且与机器调用栈分开。在协同例程恢复时,与该协同例程相关联的所有栈帧从堆重构到机器调用栈上。因此,当机器调用栈上与协同例程相关联的协同例程深度为d时,执行协同例程的一个步骤(恢复它,执行其计算的一些部分,并随后再次将它挂起)的时间至少为O(d)。若协同例程不被挂起,则机器调用栈上与该协同例程相关联的栈帧不被复制到堆。
另一种已知方法在协同例程每次被调用时(而非等待直至协同例程被挂起)将该协同例程的栈帧从机器调用栈复制到模仿该机器调用栈的堆。驱动程序例程控制协同例程执行。在该方法中,在任何给定时间,与协同例程相关联的仅两个栈帧在机器调用栈上。在机器调用栈上的与协同例程相关联的这两个栈帧为:驱动程序例程和代表协同例程的叶例程的执行的栈帧。叶例程是与协同例程相关联的最顶部栈帧。在叶例程挂起时,最顶部栈帧被从机器调用栈移除并被存储到堆上。在叶例程的执行恢复时,该叶例程的所存储栈帧被重构到机器调用栈上。在叶例程完成执行并返回其调用者时,驱动程序例程将调用者的栈帧放到栈顶作为新叶。若任何当前执行的叶例程调用另一个例程,则驱动程序例程在调用栈上用代表被调用者(被调用例程)的新叶例程来代替当前执行的叶例程。驱动程序在堆中保持跟踪谁调用谁以及协同例程被调用的次序。第二种方法允许协同例程在恒定的时间里被调用、挂起、恢复和返回。然而,所有协同例程栈帧被复制到堆至少一次,即使协同例程不被挂起。
根据本文所公开主题的各方面,帧仅在它们实际上曾被挂起时才被复制到堆。而且,给定帧仅被复制到堆一次。驱动程序例程在栈的协同例程部分的底部。当协同例程最初被另一协同例程调用时,被调用协同例程将不在栈上代替其调用者,(从而被调用协同例程的帧随后将直接位于驱动程序例程之上)。相反,被调用例程将以正常子例程的方式被调用,且被调用例程的帧被放在栈上调用者的帧之上。当首次挂起时,栈上向下直至驱动程序例程的每一帧皆被复制到堆。在恢复时,驱动程序例程仅将叶例程放回栈上,并且通过在栈上用调用者帧代替被调用者帧来处理返回和抛出异常。尽管该方法中的单个挂起对于深度d的栈将花费O(d),但由于每一帧仅被复制到堆一次,因此该方法的总分摊成本为O(m),其中m是曾挂起的帧数。m通常小于被调用的总帧数n。
图1示出根据本文所公开主题的各方面用于在线性栈上高效恢复协同例程的系统100的示例。系统100的所有或部分可驻留在诸如以下参照图3描述的计算机之类的一个或多个计算机上。系统100的所有或部分可驻留在诸如以下参照图4描述的计算机之类的一个或多个软件开发计算机(例如,计算机102)上。系统100或其部分可包括诸如以下参照图4描述和示出的集成开发环境(例如,IDE104)的一部分。或者,系统100或其部分可被提供作为独立系统或作为插件或附件。
系统100可包括以下各项中的一个或多个:处理器(诸如处理器142)、存储器144、和用于在线性栈上高效恢复协同例程的模块106。本领域公知的其他组件也可被包括但不在这里示出。将理解,用于在线性栈上高效恢复协同例程的模块106可被加载到存储器144中以使得诸如处理器142之类的一个或多个处理器执行归因于用于在线性栈上高效恢复协同例程的模块106的动作。根据本文所公开主题的各方面,用于在线性栈上高效恢复协同例程的模块106可接收或生成关于协同例程的挂起或恢复的通知。当协同例程最初被另一协同例程调用时,被调用的协同例程的栈帧被放到栈上调用者的帧之上。若协同例程未曾被挂起,则与该协同例程相关联的帧不被复制到堆。若协同例程被挂起,则在首次挂起时,与被挂起协同例程相关联的所有栈帧向下直至驱动程序栈帧并且包括驱动程序栈帧被复制到堆。然而,后续挂起不导致先前被复制的栈帧被再次复制到堆。当协同例程恢复时,驱动程序例程仅将叶例程放到栈上。返回和抛出异常通过在栈上用调用者帧代替被调用者帧来处理。
用于在线性栈上高效恢复协同例程的模块106可包括以下各项中的一个或多个:编译器114,诸如后台编译器、并行编译器或增量编译器;解析器,诸如后台解析器、并行解析器或增量解析器;或者插件、预处理器、或附件;或者对IDE、解析器、编译器或预处理器的扩展。用于在线性栈上高效恢复协同例程的模块106可被附连到以下各项、合并到以下各项内或与以下各项相关联:编译器,诸如后台编译器、并行编译器或增量编译器;解析器,诸如后台解析器、并行解析器或增量解析器;或者插件、预处理器、或附件;或者对IDE、解析器、编译器或预处理器的扩展。
调用者110可代表程序、子例程或调用方协同例程。被调用者112可代表被调用的协同例程、程序或子例程。用于在线性栈上高效恢复协同例程的模块106可监视调用者110与被调用者112之间的调用。用于在线性栈上高效恢复协同例程的模块106可执行处理以在利用单个线性机器调用栈的计算机环境中挂起和恢复协同例程,该单个线性机器调用栈本身固有地不能挂起和恢复协同例程。用于在线性栈上高效恢复协同例程的模块106可监视协同例程处理。仅响应于检测到协同例程(例如,被调用的协同例程)的首次挂起,单个线性机器调用栈的能恢复部分被保存到分开的数据结构(诸如堆)中。协同例程被首次挂起时,其所有栈帧向下直至驱动程序栈帧并且包括驱动程序栈帧被复制到堆。然而,若协同例程被再次挂起,则其栈帧不被再次复制到堆中。用于调用方协同例程和被调用协同例程的该单个线性机器调用栈的能恢复部分可包括包含调用者的返回地址的栈帧、包含被调用协同例程的返回地址的栈帧以及驱动程序例程的栈帧。
在递归协同例程调用链的情形中,线性机器调用栈的能恢复部分可包括包含到深度d的所有被递归调用的协同例程的所有返回地址的所有栈帧。单个线性机器调用栈的能恢复部分可被保存到诸如但不限于堆数据结构之类的数据结构中。来自线性机器调用栈的栈帧被保存到其中的数据结构可与该线性机器调用栈分开。
在发生挂起时,线性机器调用栈的能恢复部件或部分可被移除,并且恢复器栈帧(包括恢复器的返回地址)可被复制到线性机器调用栈上,以使得当协同例程恢复并且控制返回到调用栈上的最顶部栈帧时,控制被传递到恢复器108。当被调用的协同例程恢复时,只有包括被调用协同例程的返回地址的栈帧才能被复制到该单个线性机器调用栈上,而不将所有被保存的能恢复部分都重构到该单个线性机器调用栈上。响应于检测到暂停协同例程(例如,被调用的协同例程)的恢复,线性机器调用栈上的恢复器栈帧可被处理并且恢复器108可被调用。响应于检测到被调用协同例程的恢复,被调用协同例程可被执行,从而通过将控制返回到放在该单个线性机器调用栈上的关于恢复器的返回地址来将控制返回给恢复器。恢复器108可通过将调用者的栈帧复制到调用栈上来将控制返回到关于调用者的栈帧中的返回地址。即,在协同例程恢复时,恢复器108可仅为合适协同例程将最顶部叶帧复制到调用栈,而不重构整个调用栈。该过程可继续,直至整个调用链已完成。当协同例程返回其调用者时,被调用者栈帧被调用者栈帧代替。
在抛出异常时,根据本文所公开主题的各方面,可抓住该异常,被调用者的栈帧可被调用者的栈帧代替,并且随后可重新抛出该异常。
图2示出根据本文所公开主题的各方面用于在线性栈上高效恢复协同例程的方法200的示例。在202,协同例程(调用者)调用另一协同例程(被调用者)。在204,若被调用协同例程从未挂起,则栈不被复制到堆(206)。即,被调用例程的帧被放在栈上调用者的帧之上并且通过传统的机器调用栈处理来处理。在204,若发生被调用协同例程的挂起,则在208,机器栈的能恢复部分若先前尚未被复制到堆则被复制到堆上。被调用者首次被挂起时,与被挂起协同例程相关联的所有栈帧向下直至驱动程序栈帧并且包括驱动程序栈帧被复制到堆。然而,后续挂起不导致先前被复制的栈帧被再次复制到堆。恢复器栈帧被压到调用栈上。恢复器调用栈在被处理时将控制返回到恢复器而非返回到调用者。当或若被调用者在210恢复时,恢复器在212被调用,并且恢复器在212仅将被调用者的叶帧(最顶部栈帧)从堆重构到栈上并且处理继续。在214,若抛出异常或者若被调用者返回,则栈上的被调用者帧被调用者栈帧代替并且处理继续。
例如,假设协同例程实现按需产生集合结果的迭代器。该集合可由二进制树数据结构表示,其中该二进制树中的每个节点包括包含该集合的成员的值。为了以二进制树规定的指定次序产生该集合的元素,该二进制树可通过协同例程的递归调用来遍历。例如,假设二进制树表示元素1、2和3的集合。为了以该顺序产生元素1、2、3,二进制树的根节点通常可具有值2,根节点的左孩子节点可具有值1且没有左或右子树,而根节点的右孩子节点可具有值3且没有左或右子树。迭代器首先产生根节点的左树的值,随后从根节点产生值,然后产生右树的元素。该过程利用递归协同例程。在产生了每个元素之后,协同例程暂停,直至该集合的下一元素被请求。
当调用方例程在二进制树上调用迭代器函数时,调用者的地址进栈。迭代器在二进制树的根上调用第一协同例程。第一协同例程的下一指令的地址被放在栈上。向根节点的左树作出第二递归协同例程调用。在根节点的左树上调用的第二协同例程的地址被放在栈上。由于根节点的左树没有子树,因此不向左树的左孩子节点作出递归调用。产生存储在左树中的该集合的元素(1)。在左节点上调用的协同例程挂起。在根上的协同例程也挂起。
当树的左孩子节点上的协同例程挂起时,有2帧(在左根上调用的协同例程和在根上调用的协同例程的地址)的调用栈被保存在堆中。恢复器帧被复制到栈上。当协同例程由于要求该集合的元素的客户机要求下一元素而恢复时,并非从堆取出两个所保存帧并将它们放回到栈上,而是仅将与左树上(其中有1的节点上)的协同例程调用相对应的最顶部帧复制到栈中。因此,栈上有一帧,其中栈上的该帧对应于在左节点上被调用的协同例程。第二调用确定其中有1的节点没有右树。
结果将被返回到的协同例程是在根节点上调用的协同例程,但该帧没有被复制回栈上,因此并非如传统模型中那样执行栈返回,而是协同例程返回到恢复器帧(其为栈上的下一帧)上的地址。因此,恢复通过恢复器例程来引导。恢复器确定根的返回地址并引导将结果返回该地址。在根节点上调用的协同例程产生其值(2)并再次挂起。客户机下次要求值时,恢复器被再次调用。恢复器将根帧放在栈上,因为这是自先前开始就挂起的帧。在根节点上调用的协同例程从其产生其自己的值之后的指令开始运行。接下来,在右分支上作出传统的递归协同例程调用以产生右子树中的任何值。
此时,调用栈上有三帧:底部为恢复器帧,其上是关于在根上调用的协同例程的帧,顶部是关于在右叶上调用的协同例程的帧。右叶确定其没有左分支,且将产生其自己的值(3)并且挂起。在挂起时,最顶部的两帧被存储在堆中并且恢复器帧被复制到栈上。当客户机要求另一元素时,发生恢复。最顶部的帧引导至恢复器的处理。恢复器将与右叶相对应的帧放在栈上。在右叶上调用的协同例程确定其没有右子树。其将结果返回给恢复器,表明其完成。恢复器将根帧放在栈上。根上的协同例程恢复。它确定其完成并且返回到驱动程序。栈上的下一帧是调用者的返回地址。调用者接收关于集合中没有更多元素的消息。
将理解,以上描述的方法可通过向恢复器产生关于接下来运行哪个协同例程的指令来应用于具有多个入口点的协同例程。还将理解,以上描述的过程可提供对异步编程的支持。例如,假设异步例程按节读取文件。该例程可在循环中执行,从而递归地调用读取文件的一部分的另一例程。为了避免使线程总是在运行,主例程可被挂起直至读取文件的一部分的协同例程结束。挂起的主例程可在读取文件的一部分的协同例程返回结果时恢复。异步主例程和读取文件的一部分的协同例程两者被挂起直至文件的一部分返回。带回文件内容的线程恢复请求信息的例程,将文件内容给它并且它将内容传回给主例程。
该过程被重复,从而文件的另一节被另一递归调用检索,依此类推。在这种情形中,通过从文件带回内容的操作系统事件来发起恢复。在这种情形中,当操作系统带回文件内容时,其执行对早先安装在栈中的恢复器的回调。恢复器通过回到栈上的最新叶例程(读取文件的节的例程)并从其所到的地方执行它来如上所述地恢复协同例程。当叶例程完成时,其返回到恢复器并且恢复器返回到原始调用者。执行继续,直至文件的下一节被请求,此时被调用例程和调用方例程被再次挂起,依此类推。
合适计算环境的示例
为了提供有关本文所公开的主题的各个方面的上下文,图3以及以下讨论旨在提供其中可以实现各实施例的合适计算环境510的简要概括描述。尽管本文所公开的主题是在诸如程序模块等由一个或多个计算机或其它计算设备执行的计算机可执行指令的通用上下文中描述的,但本领域技术人员将认识到,本文所公开的主题的各部分还能够结合其它程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理人为产物、数据结构等。通常,程序模块的功能可以在各个实施例中按需进行组合或分布。计算环境510只是合适的操作环境的一个示例,并且不旨在对此处所公开的主题的使用范围或功能提出任何限制。
参照图3,描述了计算机512形式的用于线性栈上高效恢复协同例程的计算设备。计算机512可包括处理单元514、系统存储器516和系统总线518。处理单元514可以是各种可用处理器中的任何一种。也可以使用双微处理器及其他多处理器体系结构作为处理单元514。系统存储器516可包括易失性存储器520和非易失性存储器522。非易失性存储器522可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)或闪存。易失性存储器520可包括可充当外部高速缓冲存储器的随机存取存储器(RAM)。系统总线518将系统物理人为产物(包括系统存储器516)耦合到处理单元514。系统总线518可以是几种类型的总线结构中的任何一种,包括存储器总线、存储控制器、外围总线、外部总线或局部总线,并且可以使用各种可用总线体系结构中的任一种。
计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移动和不可移动介质。计算机存储介质可以通过用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现。计算机存储介质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CDROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机512访问的任何其他非瞬态介质。
将理解,图3描述了可充当用户与计算机资源之间的媒介的软件。该软件可以包括可存储在盘存储524上的操作系统528,该操作系统可控制并分配计算机系统512的资源。盘存储524可以是通过诸如接口526的不可移动存储器接口连接到系统总线518的硬盘驱动器。系统应用程序530利用由操作系统528通过存储在系统存储器516中或者存储在盘存储524上的程序模块532和程序数据534对资源的管理。应该明白,计算机可用各种操作系统或操作系统的组合来实现。
用户可通过输入设备536向计算机512输入命令或信息。输入设备536包括但不限于定点设备,诸如鼠标、跟踪球、指示笔、触摸垫、键盘、话筒等。这些及其他输入设备通过系统总线518经由接口端口538连接到处理单元514。接口端口538可表示串行端口、并行端口、通用串行总线(USB)等。输出设备540可与输入设备使用相同类型的端口。提供输出适配器542以举例说明存在像监视器、扬声器、以及打印机的需要特定适配器的一些输出装置540。输出适配器542包括但不限于,在输出设备540和系统总线518之间提供连接的视频卡和声卡。其他设备和/或设备系统,诸如远程计算机544,可提供输入和输出两种能力。
计算机512可以使用到诸如远程计算机544之类的一个或多个远程计算机的逻辑连接来在联网环境中操作。远程计算机544可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见的网络节点,并且通常包括许多或所有以上相对于计算机512所描述的元件,尽管在图4中仅示出了存储器存储设备546。远程计算机544可经由通信连接550逻辑地连接。网络接口548涵盖诸如局域网(LAN)和广域网(WAN)这样的通信网络,但也可包括其他网络。通信连接550是指用来将网络接口548连接到总线518的硬件/软件。连接550可以在计算机512内部或外部并且包括诸如调制解调器(电话、电缆、DSL和无线)和ISDN适配器、以太网卡等内部和外部技术。
应该理解,所示网络连接仅是示例,并且可以使用在计算机之间建立通信链路的其它手段。本领域的普通技术人员可以理解,计算机512或其它客户机设备可作为计算机网络的一部分来部署。在这一点上,本文所公开的主题涉及具有任意数量的存储器或存储单元以及在任意数量的存储单元或卷上发生的任意数量的应用程序和进程的任何计算机系统。本文所公开的主题的各方面可应用于具有部署在网络环境中的具有远程或本地存储的服务器计算机和客户计算机的环境。本文所公开的主题的各方面也可应用于具有编程语言功能、解释和执行能力的独立计算设备。
图4示出集成开发环境(IDE)600和通用语言运行时环境602。IDE600可允许用户(例如,开发者、程序员、设计者、编码者等)在计算机系统中设计、编码、编译、测试、运行、编辑、调试或构建程序、程序集、网站、web应用程序和web服务。软件程序可包括以一种或多种源代码语言(例如,VisualBasic、VisualJ#、C++、C#、J#、JavaScript、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme、Smalltalk等)创建的源代码(组件610)。IDE600可提供本机代码开发环境,或者可提供在虚拟机上运行的托管代码开发,或者可提供其组合。IDE600可提供使用.NET框架的托管代码开发环境。可使用语言专用源编译器620从源代码组件610和本机代码组件611创建中间语言组件650,并且在执行应用时使用中间语言编译器660(例如,即时(JIT)编译器)从中间语言组件650创建本机代码组件611(例如,机器可执行指令)。即,当IL应用被执行时,其在被执行的同时被编译成适合正在其上执行它的平台的合适机器语言,藉此使代码能跨若干平台便携。或者,在其他实施例中,程序可被编译成适合其目标平台的本机代码机器语言(未示出)。
用户可根据已知软件编程技术以及与特定源语言相关联的特定逻辑和句法规则经由IDE600中的用户接口640和源代码编辑器651来创建和/或编辑源代码组件。此后,源代码组件610可经由源编译器620被编译,藉此可创建该程序的中间语言表示,诸如汇编630。汇编630可包括中间语言组件650和元数据642。应用程序设计可以能够在部署前被验证。
此处所述的各种技术可结合硬件或软件,或在适当时以其组合来实现。由此,本文所公开的方法和装置或其特定方面或部分可采取包含在诸如软盘、CD-ROM、硬盘驱动器或任何其它机器可读存储介质等有形介质中的程序代码(即,指令)的形式,其中当程序代码被加载到诸如计算机等机器内并由其执行时,该机器成为用于实现本文所公开的主题的各方面的装置。在程序代码在可编程计算机上执行的情况下,计算设备通常将包括处理器、该处理器可读的存储介质(包括易失性和非易失性的存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可例如通过使用数据处理API等来利用域专用编程模型各方面的创建和/或实现的一个或多个程序可用高级过程语言或面向对象的编程语言来实现以与计算机系统通信。然而,如果需要,该程序可以用汇编语言或机器语言来实现。在任何情形中,语言可以是编译语言或解释语言,且与硬件实现相结合。
虽然已结合附图描述了本文所公开的主题,但是应理解,可作出修改以按不同方式执行相同功能。

Claims (10)

1.一种用于恢复协同例程的方法,包括:
在利用固有地不能挂起和恢复协同例程的单个线性机器调用栈的计算机环境中挂起和恢复包括调用方协同例程(110)和被调用协同例程(112)的协同例程,其中
仅响应于检测到所述被调用协同例程的挂起:
将先前未保存的所述单个线性机器调用栈的能恢复部分保存到堆,所述堆模仿所述单个线性机器调用栈但是与所述单个线性机器调用栈分开以使得所述单个线性机器调用栈的所述能恢复部分仅被复制到所述堆一次,所述单个线性机器调用栈的所述能恢复部分包括所述调用方协同例程的栈帧、所述被调用协同例程的栈帧以及恢复器的栈帧;
将所述单个线性机器调用栈的所述能恢复部分从所述单个线性机器调用栈移除;
将恢复器的返回地址放到所述单个线性机器调用栈上;以及响应于检测到所述被调用协同例程的恢复:
仅将所述被调用协同例程的所述栈帧复制到所述单个线性机器调用栈上,而不将所述单个线性机器调用栈的所有所述能恢复部分复制到所述单个线性机器调用栈上。
2.如权利要求1所述的方法,其特征在于,响应于检测到所述被调用协同例程的恢复,通过将控制返回到放在所述单个线性机器调用栈上的所述恢复器的所述返回地址来将控制返回给所述恢复器,所述恢复器将所述被调用协同例程的所述栈帧放到所述单个线性机器调用栈上。
3.如权利要求1所述的方法,其特征在于,响应于抛出异常,在所述单个线性机器调用栈上所述被调用协同例程的所述栈帧被所述调用方协同例程的所述栈帧代替。
4.如权利要求1所述的方法,其特征在于,通过所述调用方协同例程请求附加信息来发起恢复。
5.如权利要求1所述的方法,其特征在于,通过返回所述调用方协同例程所请求的信息来发起恢复。
6.一种用于恢复协同例程的系统,包括:
用于在利用固有地不能挂起和恢复协同例程的单个线性机器调用栈的计算机环境中挂起和恢复包括调用方协同例程(110)和被调用协同例程(112)的协同例程的模块;以及
用于仅响应于检测到所述被调用协同例程的挂起来执行以下操作的模块:
将先前未保存的所述单个线性机器调用栈的能恢复部分保存到堆,所述堆模仿所述单个线性机器调用栈但是与所述单个线性机器调用栈分开以使得所述单个线性机器调用栈的所述能恢复部分仅被复制到所述堆一次,所述单个线性机器调用栈的所述能恢复部分包括所述调用方协同例程的栈帧、所述被调用协同例程的栈帧以及恢复器的栈帧;
将所述单个线性机器调用栈的所述能恢复部分从所述单个线性机器调用栈移除;
将恢复器的返回地址放到所述单个线性机器调用栈上;以及用于响应于检测到所述被调用协同例程的恢复执行以下操作的模块:
仅将所述被调用协同例程的所述栈帧复制到所述单个线性机器调用栈上,而不将所述单个线性机器调用栈的所有所述能恢复部分复制到所述单个线性机器调用栈上。
7.如权利要求6所述的系统,其特征在于,响应于检测到所述被调用协同例程的恢复,通过将控制返回到放在所述单个线性机器调用栈上的所述恢复器的所述返回地址来将控制返回给所述恢复器,所述恢复器将所述被调用协同例程的所述栈帧放到所述单个线性机器调用栈上。
8.如权利要求6所述的系统,其特征在于,响应于抛出异常,在所述单个线性机器调用栈上所述被调用协同例程的所述栈帧被所述调用方协同例程的所述栈帧代替。
9.如权利要求6所述的系统,其特征在于,通过所述调用方协同例程请求附加信息来发起恢复。
10.如权利要求6所述的系统,其特征在于,通过返回所述调用方协同例程所请求的信息来发起恢复。
CN201110008477.0A 2010-01-07 2011-01-06 在线性栈上高效恢复协同例程 Active CN102141937B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US12/683,447 2010-01-07
US12/683,447 US9003377B2 (en) 2010-01-07 2010-01-07 Efficient resumption of co-routines on a linear stack

Publications (2)

Publication Number Publication Date
CN102141937A CN102141937A (zh) 2011-08-03
CN102141937B true CN102141937B (zh) 2016-03-23

Family

ID=44225396

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110008477.0A Active CN102141937B (zh) 2010-01-07 2011-01-06 在线性栈上高效恢复协同例程

Country Status (2)

Country Link
US (1) US9003377B2 (zh)
CN (1) CN102141937B (zh)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9665348B1 (en) 2011-06-07 2017-05-30 The Mathworks, Inc. Customizable, dual-format presentation of information about an object in an interactive programming enviornment
US9092564B2 (en) 2013-02-15 2015-07-28 Microsoft Technology Licensing, Llc Call stacks for asynchronous programs
US10205640B2 (en) 2013-04-11 2019-02-12 Oracle International Corporation Seasonal trending, forecasting, anomaly detection, and endpoint prediction of java heap usage
CN104317673B (zh) * 2014-10-24 2017-12-15 大唐网络有限公司 应用程序的回收方法、装置及其恢复方法、装置
US10747511B2 (en) * 2015-04-28 2020-08-18 Microsoft Technology Licensing, Llc Compiler optimization of coroutines
CN105354079B (zh) * 2015-09-29 2019-06-07 上海斐讯数据通信技术有限公司 提高系统内存利用率的方法
US11327797B2 (en) 2016-05-09 2022-05-10 Oracle International Corporation Memory usage determination techniques
US10303493B2 (en) * 2016-11-04 2019-05-28 International Business Machines Corporation Performance acceleration in mixed-language applications
US20230401044A1 (en) * 2022-06-14 2023-12-14 Nvidia Corporation Coroutine suspension mechanism for improving performance of a computer device
CN115292201B (zh) * 2022-09-28 2022-12-20 中国人民解放军国防科技大学 函数调用栈解析和回溯方法与装置

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4667290A (en) * 1984-09-10 1987-05-19 501 Philon, Inc. Compilers using a universal intermediate language

Family Cites Families (42)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5522072A (en) * 1990-09-04 1996-05-28 At&T Corp. Arrangement for efficiently transferring program execution between subprograms
US5295256A (en) * 1990-12-14 1994-03-15 Racal-Datacom, Inc. Automatic storage of persistent objects in a relational schema
JPH07182182A (ja) * 1993-12-21 1995-07-21 Mitsubishi Electric Corp システムコール情報採取装置
US5504892A (en) * 1994-09-08 1996-04-02 Taligent, Inc. Extensible object-oriented file system
US5630131A (en) * 1994-11-14 1997-05-13 Object Technology Licensing Corp. Method and apparatus for importing and exporting archive files for a graphical user interface
WO1997027536A1 (en) 1996-01-24 1997-07-31 Sun Microsystems, Inc. Instruction folding for a stack-based machine
US6006230A (en) * 1997-01-15 1999-12-21 Sybase, Inc. Database application development system with improved methods for distributing and executing objects across multiple tiers
US6026233A (en) * 1997-05-27 2000-02-15 Microsoft Corporation Method and apparatus for presenting and selecting options to modify a programming language statement
JP3816961B2 (ja) 1997-10-02 2006-08-30 コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ バーチャルマシン命令を処理するためのデータ処理装置
US6212630B1 (en) * 1997-12-10 2001-04-03 Matsushita Electric Industrial Co., Ltd. Microprocessor for overlapping stack frame allocation with saving of subroutine data into stack area
US6311327B1 (en) * 1998-03-02 2001-10-30 Applied Microsystems Corp. Method and apparatus for analyzing software in a language-independent manner
US6141723A (en) 1998-04-07 2000-10-31 Microware Virtual machine system for accessing external subprogram functions
US6453356B1 (en) * 1998-04-15 2002-09-17 Adc Telecommunications, Inc. Data exchange system and method
US6018628A (en) * 1998-06-16 2000-01-25 Sun Microsystems, Inc. Method of implementing parameterized types to be compatible with existing unparameterized libraries
AU3116300A (en) * 1998-12-11 2000-06-26 Microsoft Corporation Accelerating a distributed component architecture over a network using an implicit flow control
US6356950B1 (en) * 1999-01-11 2002-03-12 Novilit, Inc. Method for encoding and decoding data according to a protocol specification
US6470493B1 (en) * 1999-09-30 2002-10-22 Compaq Information Technologies Group, L.P. Computer method and apparatus for safe instrumentation of reverse executable program modules
US6363523B1 (en) * 1999-11-12 2002-03-26 Sun Microsystems, Inc. Optimization of N-base typed arithmetic expressions
US20020069402A1 (en) 2000-10-05 2002-06-06 Nevill Edward Colles Scheduling control within a system having mixed hardware and software based instruction execution
JP2002182927A (ja) * 2000-12-13 2002-06-28 Hitachi Ltd 異種実行環境におけるレジスタの割当て方法、異種実行環境におけるソフトウェア開発方法、および、それを実行するプログラムが組み込まれたlsi
US6934939B2 (en) * 2001-02-28 2005-08-23 International Business Machines Corporation Method for unwinding a program call stack
US7076773B2 (en) * 2001-03-20 2006-07-11 International Business Machines Corporation Object oriented apparatus and method for allocating objects on an invocation stack in a dynamic compilation environment
US20020144141A1 (en) * 2001-03-31 2002-10-03 Edwards James W. Countering buffer overrun security vulnerabilities in a CPU
US7120879B2 (en) * 2001-04-20 2006-10-10 Peter Pius Gutberlet Hierarchical presentation techniques for a design tool
US20020169738A1 (en) * 2001-05-10 2002-11-14 Giel Peter Van Method and system for auditing an enterprise configuration
US6694435B2 (en) * 2001-07-25 2004-02-17 Apple Computer, Inc. Method of obfuscating computer instruction streams
US7181732B2 (en) * 2001-11-14 2007-02-20 Sun Microsystems, Inc. Method and apparatus for facilitating lazy type tagging for compiled activations
US7278137B1 (en) * 2001-12-26 2007-10-02 Arc International Methods and apparatus for compiling instructions for a data processor
US7225201B1 (en) * 2002-04-01 2007-05-29 Ncr Corp. Extensible data type
US7174354B2 (en) * 2002-07-31 2007-02-06 Bea Systems, Inc. System and method for garbage collection in a computer system, which uses reinforcement learning to adjust the allocation of memory space, calculate a reward, and use the reward to determine further actions to be taken on the memory space
US7150004B2 (en) * 2002-08-21 2006-12-12 International Business Machines Corporation Programmatically serializing complex objects using self-healing techniques
US20040255018A1 (en) * 2002-10-04 2004-12-16 Brian Taraci Method and apparatus for providing universal web access functionality with port contention resolution
US20040128672A1 (en) * 2002-12-13 2004-07-01 Sun Microsystems, Inc., A Delaware Corporation Generic program adapting general algorithm as iteration
US7389498B2 (en) * 2003-03-25 2008-06-17 Microsoft Corporation Core object-oriented type system for semi-structured data
JP2005129001A (ja) 2003-09-30 2005-05-19 Toshiba Corp プログラム実行装置、マイクロプロセッサ及びプログラム実行方法
US7661096B2 (en) * 2004-02-13 2010-02-09 Microsoft Corporation Interaction with nested and non-nested streams
US7937694B2 (en) * 2004-02-13 2011-05-03 Microsoft Corporation Fast flattening of nested streams
US7577961B1 (en) * 2004-08-25 2009-08-18 Sun Microsystems, Inc. Methods and apparatus for exception-based programming
CN101091166B (zh) * 2004-12-30 2010-05-05 英特尔公司 保存多个执行上下文的方法和装置
US8108880B2 (en) * 2007-03-07 2012-01-31 International Business Machines Corporation Method and system for enabling state save and debug operations for co-routines in an event-driven environment
JP2009211190A (ja) 2008-02-29 2009-09-17 Hitachi Ltd 情報処理装置
US9286108B2 (en) * 2008-10-30 2016-03-15 Oracle America, Inc. Method to track application context and application identification

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4667290A (en) * 1984-09-10 1987-05-19 501 Philon, Inc. Compilers using a universal intermediate language

Also Published As

Publication number Publication date
CN102141937A (zh) 2011-08-03
US9003377B2 (en) 2015-04-07
US20110167248A1 (en) 2011-07-07

Similar Documents

Publication Publication Date Title
CN102141937B (zh) 在线性栈上高效恢复协同例程
Fouladi et al. From laptop to lambda: Outsourcing everyday jobs to thousands of transient functional containers
US8495598B2 (en) Control flow graph operating system configuration
Rodríguez et al. CPPC: a compiler‐assisted tool for portable checkpointing of message‐passing applications
CN101681294B (zh) 用于存储器事务分组的方法和系统
JP5518085B2 (ja) ランタイムにおいて生成したコードのキャッシュへの格納
CN104412229A (zh) 自适应可移植库
JP2004310776A (ja) 拡張ランタイムホスティング
CN102859489B (zh) 可恢复的方法
CN102696026B (zh) 一种用于创建数据结构的系统和方法
US8051426B2 (en) Co-routines native to a virtual execution environment
US8543975B2 (en) Behavior-first event programming model
JP2011515741A (ja) 非同期メソッドのための宣言型サポート
US8266189B2 (en) Adapting between coupled and decoupled provider interfaces
CN102388370A (zh) 计算机进程管理
CN117289929B (zh) 一种插件框架、插件及数据处理方法、装置及电子设备
Wampler et al. Guest editors' introduction: multiparadigm programming
CN111078412B (zh) 一种通过api截获对gpu进行资源管理的方法
Brand et al. SFL: A compiler for generating stateful aws lambda serverless applications
CN110347448B (zh) 一种构造终端应用行为的运行时模型的方法
WO2012047134A1 (ru) Система и способ распределенных вычислений
Mount et al. CSP as a Domain-Specific Language Embedded in Python and Jython.
Rellermeyer et al. Cloud platforms and embedded computing: the operating systems of the future
Ortega-Ruiz et al. Continuation-based mobile agent migration
Pedersen et al. Resumable Java Bytecode-Process Mobility for the JVM.

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