[发明专利]在线性栈上高效恢复协同例程有效
申请号: | 201110008477.0 | 申请日: | 2011-01-06 |
公开(公告)号: | CN102141937A | 公开(公告)日: | 2011-08-03 |
发明(设计)人: | N·M·加夫特;M·托格森;H·J·M·梅杰;N·古斯塔夫松 | 申请(专利权)人: | 微软公司 |
主分类号: | G06F9/48 | 分类号: | G06F9/48 |
代理公司: | 上海专利商标事务所有限公司 31100 | 代理人: | 黄嵩泉;高见 |
地址: | 美国华*** | 国省代码: | 美国;US |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 线性 高效 恢复 协同 例程 | ||
背景技术
在计算机科学中,协同例程是通常概括子例程并且可允许多个入口点以进行挂起和恢复执行的程序组件。协同例程有时被用于实现协作任务、迭代器、无限列表和管道。虽然子例程通常是后进先出构造,但协同例程的寿命可按其用途来规定。虽然子例程只能返回一次,但协同例程可返回或让步一次以上。虽然子例程的开始通常是其唯一入口点,但协同例程的开始是第一入口点且后续入口点可跟随让步(yield)命令。例如,同子例程一样,在协同例程中让步可将结果和控制返回给调用方协同例程,但不同于子例程,在该协同例程下次被调用时,执行可刚好在让步调用之后开始而非在协同例程开头开始。
由于协同例程可返回多次,因此有可能在后续调用时返回附加的值。其中后续调用产生附加结果的协同例程常常被称为生成器。传统子例程使用可在程序执行开头被预分配的单个栈。相反,由于协同例程能够作为对等体调用其他协同例程,因此通常为协同例程分配附加的栈。有时,预分配栈或者高速缓存预先分配的栈。
生成器还一般化子例程,并且常常被用于简化迭代器的编写。生成器中的让步语句通常不指定要跳转到的协同例程,而是将值回传给父例程。然而,仍然有可能在顶级分派器例程的辅助下在生成器设施上实现协同例程,顶级分派器例程将控制显式地传递给从生成器传回的令牌所标识的子生成器。
许多流行编程语言(包括C、C++和C#)由于基于栈的子例程实现的限制因而在该语言内不直接支持协同例程。在其中协同例程将在逻辑上被用于在可能的情况下实现一机制的情形中,通常创建使用布尔标志和其他状态变量的组合来在调用之间维护内部状态的子例程。条件语句导致基于状态变量的值而执行不同代码路径。或者,实现开关语句形式的显式状态机。
提供使用协同例程的替换方案的方法是使用线程。线程提供用于管理基本上同时执行的代码片断的实时协作交互的能力。线程通常被优先调度。协同例程通常不是。由于线程可在任何时刻被重新调度且能并发地执行,因此使用线程的程序必须注意锁定。相反,由于协同例程只能在程序中的特定点被重新调度并且不并发地执行,因此使用协同例程的程序常常完全避免了锁定问题。
在高级语言中实现协同例程的一种方法放弃了便携性。相反,处理器系列专用的实现对于函数是用汇编语言编写的,以节约和恢复协同例程上下文。必须注意这些函数的使用和编写,从而在协同例程共享相同栈时位于该栈上的变量不被覆写。因此,通常对于高级语言中基于栈的协同例程,需要函数来创建替换栈并在替换栈之间跳转。可提供第三机器专用函数以创建用于新协同例程的上下文。传统上,协同例程的栈大小是固定的且在执行期间不能增长。通常,程序分配比所需的更大的栈以避免潜在的栈溢出。
概述
在使用单个线性机器调用栈在没有直接协同例程支持的语言中执行的计算机系统中,驱动程序例程控制协同例程执行。当协同例程最初被另一协同例程调用时,被调用的协同例程被放到栈上调用者的帧之上。协同例程被首次挂起时,其所有栈帧向下直至驱动程序栈帧并且包括驱动程序栈帧被复制到堆。然而,若协同例程被再次挂起,则其栈帧不被再次复制到堆。当协同例程恢复时,驱动程序例程仅将叶例程放到栈上。尽管该方法中的单个挂起对于深度d的栈将花费O(d),但由于每一帧仅被复制到堆一次,因此该方法的总分摊成本为O(m),其中m是曾挂起的帧数,且m通常小于被调用的总帧数n。
若在叶例程中抛出异常,则驱动程序例程检测或抓住该异常。驱动程序在栈上用与调用者相关联的栈帧来代替与被调用者(被调用)叶例程相关联的栈帧。驱动程序执行调用方例程,并且异常被再次抛出。
提供本概述以便以简化形式介绍将在以下详细描述中进一步描述的一些概念。本概述并非旨在标识出要求保护的主题的关键特征或必要特征,亦非旨在用于限定要求保护的主题的范围。
附图简述
在附图中:
图1示出根据本文所公开主题的各方面用于在线性栈上高效恢复协同例程的系统100的示例;
图2是根据如关于图1所描述的本文所公开主题的各方面用于在线性栈上高效恢复协同例程的方法200的示例的流程图。
图3是示出其中可实现本文所公开主题的各方面的计算环境的示例的框图;以及
图4是根据本文所公开主题的各方面的集成开发环境的示例的框图。
详细描述
概览
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于微软公司,未经微软公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201110008477.0/2.html,转载请声明来源钻瓜专利网。