一种协程实现方法及装置制造方法及图纸

技术编号:17878590 阅读:46 留言:0更新日期:2018-05-06 00:30
本发明专利技术实施例提供一种协程实现方法及装置,该方法包括:根据协程对应函数的脚本语言字节码,确定协程对应的函数调用栈所需的目标内存空间;其中,一个协程对应一个函数调用栈;为所述函数调用栈分配与所述目标内存空间相应的独立内存空间;其中,各协程对应的函数调用栈的内存空间互不干扰;在所述独立内存空间中,为所述函数调用栈的各结构体填充内容;对所述函数调用栈进行协程执行前的预处理;将虚拟机的执行状态指向所述函数调用栈,以执行所述协程。进一步,本发明专利技术实施例还可以实现协程的切换。本发明专利技术实施例可以提升协程实现的效率。

A co range realization method and device

An embodiment of the invention provides a co process implementation method and device, which includes: the target memory space required by the function call stack corresponding to the co process based on the script language bytecode of the co range corresponding function; in which a co process corresponds to a function call stack; the function call stack is allocated with the target memory. The independent memory space corresponding to the space; in which the memory space of the function call stack corresponding to the co process is not interfered with each other; in the independent memory space, the contents of each structure of the function call stack are filled; the function call stack is preprocessed before the co execution of the function call stack; the execution state of the virtual machine is pointed to the written function. A number call stack to perform the described co process. Further, the embodiment of the invention can also realize the switching of the association. The embodiment of the invention can improve the efficiency of the realization of the association.

【技术实现步骤摘要】
一种协程实现方法及装置
本专利技术涉及程序
,具体涉及一种协程实现方法及装置。
技术介绍
协程作为用户态的一种可重入的子程序在计算机程序、数据处理过程中应用广泛;目前集成协程能力的框架一般通过Generator(迭代器)提供的函数重入能力实现,即将一个Generator作为一个协程,并在应用层面实现协程的调度器。然而,基于Generator实现协程,必须采用Generator的yield关键字(yield代表一种控制权的放弃、转移);一旦协程对应的函数采用了yield关键字,函数的上层调用都必须采用yield去调用子函数,且同时要定义yield关键字的函数调用和函数返回语义;可见,基于Generator,采用yield关键字实现协程,会带入yield关键字本身存在的实现较复杂的问题,导致协程的实现较为复杂、麻烦,降低了协程的实现效率。
技术实现思路
有鉴于此,本专利技术实施例提供一种协程实现方法及装置,以降低协程实现的复杂度,提升协程实现的效率。为实现上述目的,本专利技术实施例提供如下技术方案:一种协程实现方法,包括:根据协程对应函数的脚本语言字节码,确定协程对应的函数调用栈所需的目标内存空间;其中,一个协程对应一个函数调用栈;为所述函数调用栈分配与所述目标内存空间相应的独立内存空间;其中,各协程对应的函数调用栈的内存空间互不干扰;在所述独立内存空间中,为所述函数调用栈的各结构体填充内容;对所述函数调用栈进行协程执行前的预处理;将虚拟机的执行状态指向所述函数调用栈,以执行所述协程。本专利技术实施例还提供一种协程实现装置,包括:目标内存空间确定模块,用于根据协程对应函数的脚本语言字节码,确定协程对应的函数调用栈所需的目标内存空间;其中,一个协程对应一个函数调用栈;空间分配模块,用于为所述函数调用栈分配与所述目标内存空间相应的独立内存空间;其中,各协程对应的函数调用栈的内存空间互不干扰;内容填充模块,用于在所述独立内存空间中,为所述函数调用栈的各结构体填充内容;预处理模块,用于对所述函数调用栈进行协程执行前的预处理;执行模块,用于将虚拟机的执行状态指向所述函数调用栈,以执行所述协程。基于上述技术方案,本专利技术实施例提供的协程实现方法,可以为协程分配相应的函数调用栈,从而通过确定函数调用栈所需的内存空间,可为协程在内存中分配独立的函数调用栈所用空间,实现不同协程的函数调用栈执行互不干扰;然后在独立的内存空间中,将协程在函数调用栈的各结构体的内容进行填充,并进行协程执行前的处理,可为协程划分独立的可用的函数调用栈,使得协程对应的函数调用栈具有协程能力,进而将虚拟机的执行状态指向所述函数调用栈,可实现相应协程的执行。本专利技术实施例提供的协程实现方法,可直接基于脚本语言的开发环境底层的内存空间,为每个协程划分独立的函数调用栈,从而直接基于协程的函数调用栈的调用,来实现协程执行,降低了协程实现的复杂度,提升了协程实现的效率。附图说明为了更清楚地说明本专利技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要实现的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本专利技术的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。图1为本专利技术实施例提供的函数调用栈的结构示意图;图2为本专利技术实施例提供的协程实现方法的流程图;图3为本专利技术实施例提供的函数调用栈相互独立的示意图;图4为本专利技术实施例提供的协程切换的方法流程图;图5为本专利技术实施例提供的协程切换示意图;图6为本专利技术实施例提供的协程实现装置的结构框图;图7为本专利技术实施例提供的协程实现装置的另一结构框图;图8为本专利技术实施例提供的处理设备的硬件结构框图。具体实施方式下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本专利技术保护的范围。区别于现有基于Generator,采用yield关键字实现协程的方式,本专利技术实施例可在脚本语言(如PHP语言)的开发环境底层(如Zend底层),基于编程语言(如C语言),为应用层的脚本语言以及脚本语言的扩展开发提供协程能力;具体的,本专利技术实施例可直接基于脚本语言的开发环境底层的内存空间,为每个协程划分独立的函数调用栈,且各个协程的函数调用栈对应的内存空间相应独立、互不干扰;从而在执行某一协程时,通过将虚拟机的执行状态指向对应的函数调用栈,则可实现协程的执行。虚拟机的执行状态可以由函数位置指针指示,函数位置指针可以在各个协程对应的函数调用栈中,全局维护当前所执行到的函数调用栈;由于在协程的实现过程中,避免了yield关键字的采用,而是直接通过创建和执行协程对应的函数调用栈,来实现协程的创建和执行,降低了协程实现的复杂度,提升了协程实现的效率。协程的实现可以包括协程的创建和调用执行;进一步可以涉及协程间的切换。下面以脚本语言为PHP语言(HypertextPreprocessor,超文本预处理器,一种服务端脚本语言,常用语网络开发),脚本语言的开发环境底层为Zend(PHP语言的核心组件,提供了PHP的编译能力以及语言的执行器),编程语言为C语言(TheCProgrammingLanguage,一门通用计算机编程语言)为例,对本专利技术实施例提供的协程实现方法进行介绍;相应的,本专利技术实施例可在Zend底层基于C语言,为应用层PHP语言开发以及PHP的扩展开发提供协程能力,且可直接基于Zend的内存空间,为每个协程划分独立的函数调用栈;显然,脚本语言、脚本语言的开发环境底层、编程语言并不限于上段描述的示例,本专利技术实施例还可采用其他形式的脚本语言、开发环境底层、编程语言,进行协程的实现。在介绍具体的协程实现过程前,本专利技术实施例先为协程分配的函数调用栈的结构进行介绍;参照图1,图1所示的一组组合在一起的虚线框表示的结构为一个协程对应的函数调用栈的结构;一个函数调用栈具有,TMP_VAR、CV、CALL_SLOT、ARGUMENTS、zend_execute_data等结构体。其中,TMP_VAR表示协程对应函数的临时变量;CV表示协程对应函数的局部变量;CALL_SLOT表示协程对应函数的嵌套调用信息;ARGUMENTS表示协程对应函数调用的参数;zend_execute_data(简称execute_data)表示协程对应函数的函数执行信息,函数执行信息包括:op_array地址(协程对应函数的PHP字节码的地址),名空间等基本信息。图1所示函数调用栈的结构仅为可选的,需要说明的是,一个协程对应的函数调用栈可以包括:函数执行信息的结构体,函数变量信息的结构体,及函数调用信息的结构体等;在一个函数调用栈中,函数执行信息的结构体可以是zend_execute_data结构体;在一个函数调用栈中,函数变量信息的结构体的数量可以是至少一个,TMP_VAR、CV等结构体,仅是函数变量信息的结构体的可选形式;在一个函数调用栈中,函数调用信息的结构体的数量可以是至少一个,CALL_SLOT、ARGUMENTS仅是函数调用信息的结本文档来自技高网...
一种协程实现方法及装置

【技术保护点】
一种协程实现方法,其特征在于,包括:根据协程对应函数的脚本语言字节码,确定协程对应的函数调用栈所需的目标内存空间;其中,一个协程对应一个函数调用栈;为所述函数调用栈分配与所述目标内存空间相应的独立内存空间;其中,各协程对应的函数调用栈的内存空间互不干扰;在所述独立内存空间中,为所述函数调用栈的各结构体填充内容;对所述函数调用栈进行协程执行前的预处理;将虚拟机的执行状态指向所述函数调用栈,以执行所述协程。

【技术特征摘要】
1.一种协程实现方法,其特征在于,包括:根据协程对应函数的脚本语言字节码,确定协程对应的函数调用栈所需的目标内存空间;其中,一个协程对应一个函数调用栈;为所述函数调用栈分配与所述目标内存空间相应的独立内存空间;其中,各协程对应的函数调用栈的内存空间互不干扰;在所述独立内存空间中,为所述函数调用栈的各结构体填充内容;对所述函数调用栈进行协程执行前的预处理;将虚拟机的执行状态指向所述函数调用栈,以执行所述协程。2.根据权利要求1所述的协程实现方法,其特征在于,所述函数调用栈包括:函数执行信息的结构体,函数变量信息的结构体,及函数调用信息的结构体;所述根据协程对应函数的脚本语言字节码,确定协程对应的函数调用栈所需的目标内存空间包括:根据协程对应函数的脚本语言字节码,计算所述函数调用栈的函数变量信息的结构体,及函数调用信息的结构体所需的内存空间;根据所述函数调用栈的函数执行信息的结构体,预设定的所需内存空间,及所确定的函数变量信息的结构体,和函数调用信息的结构体所需的内存空间,确定所述函数调用栈所需的目标内存空间。3.根据权利要求2所述的协程实现方法,其特征在于,所述函数执行信息的结构体包括:协程对应函数所调用的函数信息;所述函数调用栈通过关联指针指向上一次调用的函数调用栈的函数执行信息。4.根据权利要求2所述的协程实现方法,其特征在于,所述对所述函数调用栈进行协程执行前的预处理包括:将所述函数调用栈的函数执行信息的结构体进行初始化;初始化脚本语言字节码缓存;初始化This指针;更新协程信息。5.根据权利要求1-4任一项所述的协程实现方法,其特征在于,所述将虚拟机的执行状态指向所述函数调用栈,以执行所述协程包括:确定函数位置指针当前指向的函数调用栈;其中,所述函数位置指针在各个函数调用栈中,全局维护虚拟机当前执行的函数调用栈,并指向该函数调用栈;将虚拟机的执行状态,指向所述函数位置指针所指向的函数调用栈,以执行所述协程。6.根据权利要求1所述的协程实现方法,其特征在于,所述方法还包括:在执行协程时,创建当前执行状态的存档...

【专利技术属性】
技术研发人员:朱新宇司超王广超袁易之杨锡坤
申请(专利权)人:腾讯科技深圳有限公司
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1