CN113608843B - 协程实现方法和系统 - Google Patents
协程实现方法和系统 Download PDFInfo
- Publication number
- CN113608843B CN113608843B CN202110772897.XA CN202110772897A CN113608843B CN 113608843 B CN113608843 B CN 113608843B CN 202110772897 A CN202110772897 A CN 202110772897A CN 113608843 B CN113608843 B CN 113608843B
- Authority
- CN
- China
- Prior art keywords
- space
- address
- register
- cooperative
- integer
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 34
- 230000006870 function Effects 0.000 claims abstract description 149
- 238000011084 recovery Methods 0.000 claims abstract description 15
- 230000009191 jumping Effects 0.000 claims abstract description 10
- 238000007667 floating Methods 0.000 claims description 88
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR 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/46—Multiprogramming arrangements
- G06F9/461—Saving or restoring of program or task context
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明公开了一种协程实现方法和系统,可应用于计算机领域。本发明方法包括以下步骤:在线程的上下文环境中,调用协程私有栈空间创建函数创建每个协程的私有空间;在线程的上下文环境中,调用协程上下文创建函数在每个协程的私有空间内预留出预设大小的预留空间;在线程的上下文环境或协程的上下文环境中,根据应用程序的逻辑进行协程的切换,以及通过寄存器传递任务函数的参数,并且跳转到即将投入运行的协程的任务函数的恢复点,继续执行,恢复协程的运行;在线程的上下文环境中,当协程的任务函数执行完毕且协程退出时,调用协程私有栈空间回收函数。本发明能在申威处理器框架下高效地调用协程的两个底层API接口函数,有效提高协程运行能力。
Description
技术领域
本发明涉及计算机领域,尤其是一种协程实现方法和系统。
背景技术
相关技术中,线程池技术是在服务端应用程序初始化时创建多个线程,构成线程池,每当有用户请求到来时,服务端应用程序就从线程池中选择一个空闲的线程来处理请求,并标记该线程状态为繁忙;每当处理完用户请求后,服务端应用程序就会将线程归还到线程池中,并标记线程状态为空闲;当线程池中没有空闲线程可供使用时,用户请求就只能够等待,直到线程池中有可用的线程为止。协程也被称为用户级线程,它与线程一样拥有独立的寄存器上下文以及运行栈,是线程内的分时共享技术,使得单线程可以同时处理多个任务,协程对操作系统内核是透明的。
用于实现协程功能的底层API接口有两种:第一种是POSIX标准提供的通用的用户级上下文API接口及glibc库(glibc库实现POSIX标准的操作系统底层的C语言库)实现,实现了获取当前上下文、恢复当前上下文、指定上下文的任务函数、以及保存当前上下文并且切换到新的上下文等功能。第二种是boost库(boost库是为C++标准库提供扩展的C++程序库的总称,为C++的标准化工作提供可供参考的实现,也是C++的“准标准库”)提供并实现的针对协程专用的API接口,实现了保存当前执行环境的上下文信息(包括栈空间、栈指针、寄存器等),暂停当前的执行状态,跳转到其他位置继续执行等功能。但是,这两种实现协程的方式,均无法适用于申威处理器架构上,因而无法利用申威处理器来实现协程运行。
发明内容
本发明旨在至少解决现有技术中存在的技术问题之一。为此,本发明提出一种协程实现方法和系统,能够有效提高协程运行能力。
第一方面,本发明实施例提供了一种协程实现方法,包括以下步骤:
在线程的上下文环境中,调用协程私有栈空间创建函数创建每个协程的私有空间,所述私有空间用于存储协程的上下文环境、任务函数的地址、任务函数的参数、局部变量、以及分配任务函数的函数调用栈帧;
在线程的上下文环境中,调用协程上下文创建函数在每个协程的私有空间内预留出第一预设大小的预留空间,所述预留空间用于保存挂起协程的上下文环境以及切换协程的任务函数地址;
在线程的上下文环境或协程的上下文环境中,根据应用程序的逻辑进行协程的切换,调用协程上下文切换函数,用于保存调用方的上下文环境、完成协程的私有栈空间的切换、恢复即将投入运行的协程的上下文环境、以及通过寄存器传递任务函数的参数,并且跳转到即将投入运行的协程的任务函数的恢复点,继续执行,恢复协程的运行;
在线程的上下文环境中,当协程的任务函数执行完毕且协程退出时,调用协程私有栈空间回收函数,回收为当前执行完毕的任务函数分配的私有栈空间,将内存空间归还给操作系统。
进一步地,所述协程私有栈空间创建函数的实现步骤,包括:
在当前线程的上下文环境中,动态申请一块连续的第二预设大小的内存空间;
调整所述内存空间的末端地址,使所述内存空间的地址按照第三预设大小的字节对齐,保存地址对齐后的末端地址,将地址对齐后的末端地址作为协程的私有栈空间的底端地址;
根据内存空间末端地址对齐的要求,调整内存空间的大小,保存调整后的内存空间的大小,将整后的内存空间的大小作为协程的私有栈空间的大小;
将动态申请的内存空间的起始地址、协程的私有栈空间的底端地址和协程的私有栈空间的大小放入一个结构体中,作为返回值。
进一步地,所述协程上下文创建函数的实现步骤,包括:
对作为函数参数传递进来的协程私有栈空间的底端地址进行第三预设大小的字节对齐的操作;
从调整后的协程的私有栈空间的底端,向着低地址的方向,预留出第一预设大小的预留空间,所述预留空间用于保存协程的上下文环境和协程的任务函数地址;
使用长字存储指令,将$18号整数寄存器中的值存储到所述预留空间的第四预设大小的字节中;
使用装入全局指针指令,从$27号整数寄存器所代表的内存地址中,将第五预设大小的数据装入到$29号整数寄存器中;
使用长字存储指令,将$29号整数寄存器中的值存储到所述预留空间的用于保存全局指针寄存器的第六预设大小的字节中;
使用子程序返回指令,控制函数返回。
进一步地,所述对作为函数参数传递进来的协程私有栈空间的底端地址进行第三预设大小的字节对齐的操作,包括:
使用装入立即数指令,将0xfffffffffffffff0立即数装入到$2号整数寄存器中;
使用逻辑与指令,将$2号整数寄存器和$16号整数寄存器进行逻辑与操作,并将结果保存到$0号整数寄存器中。
进一步地,所述从调整后的协程的私有栈空间的底端,向着低地址的方向,预留出第一预设大小的预留空间,所述预留空间用于保存协程的上下文环境和协程的任务函数地址,包括:
以协程的私有栈空间的底端为起始,向低地址方向预留出64个字节的空间,所述64个字节的空间用于依次保存$f2号、$f3号、$f4号、$f5号、$f6号、$f7号、$f8号和$f9号对应浮点寄存器的值;
向低地址方向接着预留出48个字节的空间,所述48个字节的空间用于依次保存$9号、$10号、$11号、$12号、$13号和$14号对应整数寄存器的值;
向低地址方向预留出16个字节的保留空间,所述16个字节的保留空间用于扩展;
向低地址方向接着预留出24个字节的空间,所述24个字节的空间用于依次保存$15号、$29号、$26号对应整数寄存器的值;
向低地址方向最后预留出8个字节的空间,所述8个字节的空间用于保存协程的任务函数地址;
使用长字减指令,将$0号整数寄存器中的值减去160,结果保存到$0号整数寄存器中。
进一步地,所述协程上下文切换函数的实现步骤,包括:
使用装入全局指针指令,从$27号整数寄存器所代表的内存地址中,将64位数据装入到$29号整数寄存器中;
使用装入立即数指令,将$30号整数寄存器的值减去160所得的值作为立即数,装入到$30号整数寄存器中;
使用双精度浮点存储指令,将8个浮点寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将6个整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将栈帧指针寄存器和返回地址寄存器中的值存储到预留空间的对应地址中;
切换协程的私有栈空间;
使用装入双精度浮点指令,将保存在预留空间中的8个浮点寄存器的值装入到对应的8个浮点寄存器中,恢复切换后的协程的浮点寄存器的值;
使用装入长字指令,将保存在预留空间中的6个整数寄存器的值装入到对应的6个整数寄存器中,恢复切换后的协程的整数寄存器的值;
使用装入长字指令,将保存在预留空间中的栈帧指针寄存器、全局指针寄存器和返回地址寄存器中的值装入到对应的整数寄存器中,恢复切换后的协程的栈帧指针寄存器、全局指针寄存器和返回地址寄存器的值;
使用长字加指令,将$30号整数寄存器的值加上160所得的值存入到$30号整数寄存器中;
使用移动指令,将$18号整数寄存器中的值移动到$0号整数寄存器中;
使用移动指令,将$18号整数寄存器中的值移动到$16号整数寄存器中;
使用跳转指令,跳转到$27号整数寄存器所表示的地址上。
进一步地,所述使用双精度浮点存储指令,将8个浮点寄存器中的值存储到预留空间的对应地址中,包括:
使用双精度浮点存储指令,将$f2号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f3号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f4号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f5号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f6号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f7号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f8号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f9号浮点寄存器中的值存储到预留空间的对应地址中。
进一步地,所述使用长字存储指令,将6个整数寄存器中的值存储到预留空间的对应地址中,包括:
使用长字存储指令,将$9号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$10号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$11号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$12号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$13号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$14号整数寄存器中的值存储到预留空间的对应地址中。
进一步地,所述使用长字存储指令,将栈帧指针寄存器和返回地址寄存器中的值存储到预留空间的对应地址中,包括:
使用长字存储指令,将$15号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$26号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,再次将$26号整数寄存器中的值存储到预留空间的对应地址中。
第二方面,本发明实施例提供了一种协程实现系统,包括:
协程私有栈空间分配模块,用于为每个协程都动态分配一个私有栈空间,所述私有栈空间用于作为协程的上下文运行空间,并存储协程的上下文环境、任务函数的地址、任务函数的参数、局部变量、以及分配任务函数的函数调用栈帧;
协程上下文创建模块,用于以协程私有栈空间的底端为起始,向着低地址方向,预留出第一预设大小的预留空间,所述预留空间用于保存挂起协程的上下文环境以及切换协程的任务函数地址;
协程上下文切换模块,用于保存调用方的上下文环境、完成协程的私有栈空间的切换、恢复即将投入运行的协程的上下文环境、通过寄存器传递任务函数的参数、以及跳转到即将投入运行的协程的任务函数的恢复点,继续执行,恢复协程的运行;
协程私有栈空间回收模块,用于回收协程私有栈空间,将分配给协程的内存空间归还给操作系统。
本发明实施例提供的一种协程实现方法,具有如下有益效果:
本实施例通过在线程的上下文环境中调用协程私有栈空间创建函数、协程上下文创建函数、协程上下文切换函数和协程私有栈空间回收函数分别执行相应操作的方式,以在申威处理器框架下高效地调用协程的两个底层API接口函数,从而在用户态实现了线程内多个协程任务的自由切换,有效提高协程运行能力。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
下面结合附图和实施例对本发明做进一步的说明,其中:
图1为本发明实施例的一种协程实现方法的流程图;
图2为本发明实施例的协程私有栈空间创建函数的处理流程图;
图3为本发明实施例的协程上下文创建函数的处理流程图;
图4为本发明实施例的步骤S21的子步骤;
图5为本发明实施例的步骤S22执行的协程私有栈空间的内存布局图;
图6为本发明实施例的步骤S22的子步骤;
图7为本发明实施例的协程上下文切换函数的处理流程图;
图8为本发明实施例的步骤S32执行的线程私有栈空间的内存布局图;
图9本发明实施例的步骤S33的子步骤;
图10本发明实施例的步骤S34的子步骤;
图11本发明实施例的步骤S35的子步骤;
图12本发明实施例的步骤S36的子步骤;
图13本发明实施例的步骤S37的子步骤;
图14本发明实施例的步骤S38的子步骤;
图15本发明实施例的步骤S39的子步骤。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
在本发明的描述中,若干的含义是一个以上,多个的含义是两个以上,大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数。如果有描述到第一、第二只是用于区分技术特征为目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系。
本发明的描述中,参考术语“一个实施例”、“一些实施例”、“示意性实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
参照图1,本发明实施例提供的一种协程实现方法,应用于基于申威处理器框架的处理平台。
在实施过程中,本实施例包括以下步骤:
S1、在线程的上下文环境中,调用协程私有栈空间创建函数create_stack,创建每个协程的私有栈空间,该私有空间用于存储协程的上下文环境、任务函数的地址、任务函数的参数、局部变量、以及分配任务函数的函数调用栈帧。
具体地,如图2所示,步骤S1中的协程私有栈空间创建函数create_stack的实现具体,包括以下四个子步骤:
S11、在当前线程的上下文环境中,动态申请一块连续的第二预设大小的内存空间。其中,第二预设大小可根据需要设定其大小,默认情况下,内存空间的大小为8K字节。
S12、调整内存空间的末端地址,使该内存空间的地址按照16字节对齐,保存地址对齐后的末端地址,将地址对齐后的末端地址作为协程的私有栈空间的底端地址。
S13、根据内存空间末端地址对齐的要求,调整内存空间的大小,保存调整后的内存空间的大小,将该大小作为协程的私有栈空间的大小。
S14、将动态申请的内存空间的起始地址、协程的私有栈空间的底端地址和协程的私有栈空间的大小值放入一个结构体中,作为返回值。
S2、在线程的上下文环境中,调用协程上下文创建函数make_fcontext,在协程的私有栈空间中预留出第一预设大小的预留空间,该预留空间用于保存协程的上下文环境以及协程的任务函数地址,从而在协程发生调度和切换时,能够保存挂起协程的上下文环境,并且跳转到切换协程(即将投入运行的协程)的任务函数地址处,执行相应的任务函数。其中,第一预设大小为根据需求定义的大小。
具体地,如图3所示,步骤S2中的协程上下文创建函数make_fcontext的具体实现步骤,包括以下六个子步骤:
S21、对作为函数参数传递进来的协程私有栈空间的底端地址再次进行第三预设大小的字节对齐的操作,以确保协程的私有栈空间的底端地址是16字节对齐的,保存调整后的底端地址。其中,第三预设大小包括16字节。
如图4所示,步骤S21的具体实现包括以下两个子步骤:
S211、使用装入立即数指令,将0xfffffffffffffff0立即数装入到$2号整数寄存器中。
S212、使用逻辑与指令,将$2号整数寄存器和$16号整数寄存器进行逻辑与操作,结果保存到$0号整数寄存器中。$16号整数寄存器中的值就是作为参数传递的协程私有栈空间的底端地址,该操作就是再次对底端地址进行16字节对齐的操作,以确保协程的私有栈空间的底端地址是16字节对齐的,操作结果就是再次确认并调整后的协程的私有栈空间的底端地址,将其保存到$0号整数寄存器中。
S22、从调整后的协程的私有栈空间的底端,向着低地址的方向,预留出一定大小的预留空间,用于保存协程的上下文环境和协程的任务函数地址。预留空间的大小必须足够保存协程的上下文环境和协程的任务函数地址,并且必须是16的整数倍。为了避免浪费内存空间,如图5所示,本步骤执行的协程私有栈空间的内存布局图。从图5可知,该底层API接口函数的实现采用的预留空间的大小是160个字节。除去预留的160个字节外,协程的私有栈空间中剩余的空间则可以用于存储协程任务函数的参数、局部变量、以及分配任务函数的函数调用栈帧。
具体地,如图6所示,步骤S22的具体实现包括以下六个子步骤:
S221、以协程的私有栈空间的底端为起始,向低地址方向预留出64个字节的空间。该64个字节的空间用于依次保存$f2号、$f3号、$f4号、$f5号、$f6号、$f7号、$f8号和$f9号,共8个浮点寄存器的值。本步骤中,申威处理器架构的浮点寄存器长度为64位,即8个字节,因此,保存上述8个浮点寄存器的值需要64个字节。
S222、向低地址方向接着预留出48个字节的空间。该48个字节的空间用于依次保存$9号、$10号、$11号、$12号、$13号和$14号,共6个整数寄存器的值。申威处理器架构的整数寄存器长度为64位,即8个字节,因此,保存上述6个整数寄存器的值需要48个字节。
S223、向低地址方向接着预留出16个字节的保留空间。该16个字节的保留空间用于扩展。
S224、向低地址方向接着预留出24个字节的空间。该24个字节的空间用于依次保存$15号、$29号、$26号,共3个整数寄存器的值。这3个整数寄存器在申威处理器架构下,依次代表栈帧指针寄存器(frame pointer register)、全局指针寄存器(the globalpointer register)、返回地址寄存器(return address register)。
S225、向低地址方向最后预留出8个字节的空间。该8个字节的空间用于保存协程的任务函数地址。申威处理器架构的地址长度为64位,即8个字节,保存上述任务函数的地址需要8个字节。
S226、使用长字减指令,将$0号整数寄存器中的值减去160,结果保存到$0号整数寄存器中。$0号整数寄存器是作为函数调用返回值寄存器使用,因此该操作就是在协程的私有栈空间的底端,向着低地址的方向,预留出160个字节的空间,并将预留了160个字节空间后的协程的私有栈空间的底端地址作为协程上下文创建函数make_fcontext的返回值。
S23、使用长字存储指令,将$18号整数寄存器中的值存储到预留空间的第四预设大小的字节中。例如,第四预设大小选取最后8个字节,内存地址就是$0号整数寄存器所代表的内存地址再加上152字节的偏移所形成的地址。$18号整数寄存器中的值就是该接口函数的第三个参数,即协程的任务函数地址。
S24、使用装入全局指针指令,从$27号整数寄存器所代表的内存地址中,将第五预设大小的数据装入到$29号整数寄存器中。例如,将64位数据装入到$29号整数寄存器中。
S25、使用长字存储指令,将$29号整数寄存器中的值存储到预留空间的用于保存全局指针寄存器的第六预设大小的字节中。例如,保存全局指针寄存器的8个字节中。内存地址就是$0号整数寄存器所代表的内存地址再加上136字节的偏移所形成的地址。
S26、使用子程序返回指令,控制函数返回。$0号整数寄存器中保存的就是该接口函数的返回值,即按照16字节对齐的要求,再次确认并调整后的私有栈空间的底端地址减去160字节后的地址作为该接口函数的返回值。
S3、在线程上下文环境中或者协程的上下文环境中,根据应用程序的逻辑进行协程的切换,调用协程上下文切换函数jump_fcontext,用于保存调用方的上下文环境、完成协程的私有栈空间的切换、恢复即将投入运行的协程的上下文环境、以及通过寄存器传递任务函数的参数,并且跳转到即将投入运行的协程的任务函数的恢复点,继续执行,恢复协程的运行。
如图7所示,步骤S3的协程上下文切换函数jump_fcontext的具体实现步骤,包括以下十三个子步骤:
S31、使用装入全局指针指令,从$27号整数寄存器所代表的内存地址中,将64位数据装入到$29号整数寄存器中。
S32、使用装入立即数指令,将$30号整数寄存器的值减去160所得的值作为立即数,装入到$30号整数寄存器中。
具体地,步骤S32中,如果调用方是线程,该操作将线程的栈顶地址向高地址方向移动160个字节,作为线程栈顶的新地址,即在线程的栈顶处,向高地址方向,预留出160个字节的保留空间,用于保存线程的上下文环境。
其中,本步骤在线程的栈空间的顶端,向着高地址的方向,预留出的160个字节的布局如图8所示。线程的栈空间由操作系统进行维护和管理,栈顶地址保存在栈指针寄存器中。在申威处理器架构下,栈指针寄存器就是$30号整数寄存器。预留出的160个字节的布局为:向高地址方向,以线程的栈顶为起始,先预留出64个字节的空间,用于依次保存$f2号、$f3号、$f4号、$f5号、$f6号、$f7号、$f8号和$f9号,共8个浮点寄存器的值;向高地址方向接着预留出48个字节的空间,用于依次保存$9号、$10号、$11号、$12号、$13号和$14号,共6个整数寄存器的值;向高地址方向接着预留出16个字节的保留空间,用于扩展;向高地址方向接着预留出24个字节的空间,用于依次保存$15号、$29号、$26号,共3个整数寄存器的值;最后,向高地址方向预留出8个字节的空间,用于保存线程上下文环境调用协程上下文切换函数的下一条指令的地址,即保存线程的恢复点地址。
步骤S32中,如果调用方是协程,即在一个协程的任务函数中调用了协程上下文切换函数,在协程的上下文环境中,$30号整数寄存器中保存的值是当前协程的私有栈空间的底端地址。该操作则在协程的私有栈空间的底端处,向低地址方向,预留出160个字节的保留空间,用于保存协程的上下文环境,预留出160个字节后的地址作为协程的私有栈空间底端的新地址。
S33、使用双精度浮点存储指令,将8个浮点寄存器中的值存储到预留空间的对应地址中。
具体地,如图9所示,步骤S33具体实现步骤,包括以下八个子步骤:
S331、使用双精度浮点存储指令,将$f2号浮点寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址。
S332、使用双精度浮点存储指令,将$f3号浮点寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上8字节的偏移所形成的地址。
S333、使用双精度浮点存储指令,将$f4号浮点寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上16字节的偏移所形成的地址。
S334、使用双精度浮点存储指令,将$f5号浮点寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上24字节的偏移所形成的地址。
S335、使用双精度浮点存储指令,将$f6号浮点寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上32字节的偏移所形成的地址。
S336、使用双精度浮点存储指令,将$f7号浮点寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上40字节的偏移所形成的地址。
S337、使用双精度浮点存储指令,将$f8号浮点寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上48字节的偏移所形成的地址。
S338、使用双精度浮点存储指令,将$f9号浮点寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上56字节的偏移所形成的地址。
S34、使用长字存储指令,将6个整数寄存器中的值存储到预留空间的对应地址中。
具体地,如图10所示,步骤S34具体实现步骤,包括以下六个子步骤:
S341、使用长字存储指令,将$9号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上64字节的偏移所形成的地址。
S342、使用长字存储指令,将$10号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上72字节的偏移所形成的地址。
S343、使用长字存储指令,将$11号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上80字节的偏移所形成的地址。
S344、使用长字存储指令,将$12号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上88字节的偏移所形成的地址。
S345、使用长字存储指令,将$13号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上96字节的偏移所形成的地址。
S346、使用长字存储指令,将$14号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上104字节的偏移所形成的地址。
S35、使用长字存储指令,将栈帧指针寄存器和返回地址寄存器中的值存储到预留空间的对应地址中。具体是将栈帧指针寄存器(frame pointer register)和返回地址寄存器(return address register)中的值存储到预留空间的对应地址中。
具体地,如图11所示,本步骤S35具体实现步骤,包括以下三个子步骤:
S351、使用长字存储指令,将$15号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上128字节的偏移所形成的地址。在申威处理器架构下,栈帧指针寄存器就是$15号整数寄存器。函数调用栈帧的下边界和上边界分别由$15号和$30号整数寄存器来指定。
S352、使用长字存储指令,将$26号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上144字节的偏移所形成的地址。在申威处理器架构下,返回地址寄存器就是$26号整数寄存器。当发生函数调用时,返回地址寄存器中保存的值就是调用方调用jump_fcontxt函数处的下一条指令的地址,也就是恢复点地址。该操作将调用方的恢复点地址保存到预留空间的对应地址中。
S353、使用长字存储指令,再次将$26号整数寄存器中的值存储到预留空间的对应地址中。内存地址就是$30号整数寄存器所代表的内存地址再加上152字节的偏移所形成的地址。如果调用方是协程,该操作将会保存当前协程的恢复点地址,使得该协程再次投入运行后,能够在恢复点上继续执行;如果调用方是线程,该操作将会保存线程的恢复点地址,使得协程全部结束运行后,线程能够在此恢复点上继续执行。
S36、切换协程的私有栈空间,即切换到即将投入运行的协程的私有栈空间上。如果调用方是协程,则从当前的协程的私有栈空间切换到即将投入运行的协程的私有栈空间;如果调用方是线程,则从线程的栈空间切换到即将投入运行的协程的私有栈空间。
如图12所示,步骤S36具体实现步骤,包括以下两个子步骤:
S361、使用长字存储指令,将$30号整数寄存器中的值存储到$16号整数寄存器所代表的内存地址中。在申威处理器架构下,$16号整数寄存器是传递函数的第一个参数的寄存器。在协程上下文切换函数中,第一个参数是当前协程的私有栈空间的底端地址,或者是线程的栈顶地址。
步骤S361中,如果调用方是协程,此时,$30号整数寄存器中的值是当前协程的私有栈空间底端的新地址,即底端地址向着低地址方向预留出160个字节之后的底端地址;如果调用方是线程,此时,$30号整数寄存器中的值就是线程栈顶的新地址,即顶端地址向着高地址方向预留出160个字节之后的顶端地址。该操作用当前协程的私有栈空间底端的新地址或者线程栈顶的新地址保存在函数的第一个参数中。
S362、使用移动指令,将$17号整数寄存器中的值移动到$30号整数寄存器中,以完成协程的私有栈空间的切换。在申威处理器架构下,$17号整数寄存器是传递函数的第二个参数的寄存器。在协程上下文切换函数中,第二个参数是切换协程,即将投入运行的协程的私有栈空间的底端地址。该操作使得栈指针寄存器中的值变为即将投入运行的协程的私有栈空间的底端地址,从而使得后续涉及到栈的操作都发生在即将投入运行的协程的私有栈空间中,完成了协程的私有栈空间的切换。
S37、使用装入双精度浮点指令,将保存在预留空间中的8个浮点寄存器的值装入到对应的8个浮点寄存器中,恢复即将投入运行的协程的浮点寄存器的值。
如图13所示,步骤S37具体实现步骤,包括以下八个子步骤:
S371、使用装入双精度浮点指令,将$30号整数寄存器所代表的内存地址中的值装入到$f2号浮点寄存器中。
S372、使用装入双精度浮点指令,将$30号整数寄存器所代表的内存地址再加上8字节的偏移所形成的地址中的值装入到$f3号浮点寄存器中。
S373、使用装入双精度浮点指令,将$30号整数寄存器所代表的内存地址再加上16字节的偏移所形成的地址中的值装入到$f4号浮点寄存器中。
S374、使用装入双精度浮点指令,将$30号整数寄存器所代表的内存地址再加上24字节的偏移所形成的地址中的值装入到$f5号浮点寄存器中。
S375、使用装入双精度浮点指令,将$30号整数寄存器所代表的内存地址再加上32字节的偏移所形成的地址中的值装入到$f6号浮点寄存器中。
S376、使用装入双精度浮点指令,将$30号整数寄存器所代表的内存地址再加上40字节的偏移所形成的地址中的值装入到$f7号浮点寄存器中。
S377、使用装入双精度浮点指令,将$30号整数寄存器所代表的内存地址再加上48字节的偏移所形成的地址中的值装入到$f8号浮点寄存器中。
S378、使用装入双精度浮点指令,将$30号整数寄存器所代表的内存地址再加上56字节的偏移所形成的地址中的值装入到$f9号浮点寄存器中。
S38、使用装入长字指令,将保存在预留空间中的6个整数寄存器的值装入到对应的6个整数寄存器中,恢复即将投入运行的协程的整数寄存器的值。
如图14所示,步骤S38具体实现步骤,包括以下六个子步骤:
S381、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上64字节的偏移所形成的地址中的值装入到$9号整数寄存器中。
S382、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上72字节的偏移所形成的地址中的值装入到$10号整数寄存器中。
S383、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上80字节的偏移所形成的地址中的值装入到$11号整数寄存器中。
S384、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上88字节的偏移所形成的地址中的值装入到$12号整数寄存器中。
S385、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上96字节的偏移所形成的地址中的值装入到$13号整数寄存器中。
S386、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上104字节的偏移所形成的地址中的值装入到$14号整数寄存器中。
S39、使用装入长字指令,将保存在预留空间中的栈帧指针寄存器、全局指针寄存器和返回地址寄存器中的值装入到对应的整数寄存器中,恢复即将投入运行的协程的栈帧指针寄存器、全局指针寄存器和返回地址寄存器的值。
具体地,如图15所示,步骤S39具体实现步骤,包括以下四个子步骤:
S391、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上128字节的偏移所形成的地址中的值装入到$15号整数寄存器中,恢复即将投入运行的协程的栈帧指针寄存器。
S392、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上136字节的偏移所形成的地址中的值装入到$29号整数寄存器中,恢复即将投入运行的协程的全局指针寄存器。
S393、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上144字节的偏移所形成的地址中的值装入到$26号整数寄存器中,恢复即将投入运行的协程的返回地址寄存器,以在投入运行的协程执行完任务函数时,能够回到当前协程或者线程的上下文环境中,在恢复点上继续执行。
S394、使用装入长字指令,将$30号整数寄存器所代表的内存地址再加上152字节的偏移所形成的地址中的值装入到$27号整数寄存器中,将投入运行的协程的任务函数的地址装入到$27号整数寄存器中,恢复即将投入运行的协程的任务函数的地址。
S310、使用长字加指令,将$30号整数寄存器的值加上160所得的值存入到$30号整数寄存器中。该操作完成栈平衡操作,具体是$30号整数寄存器的值重新恢复成预留出160个字节之前的地址。即在协程上下文切换函数开始时,指向协程私有栈空间底端的栈指针向着低地址方向移动了160个字节的偏移,或者指向线程栈空间顶端的栈指针向着高地址方向移动了160个字节的偏移,以重新恢复成预留出160个字节之前的地址。
S311、使用移动指令,将$18号整数寄存器中的值移动到$0号整数寄存器中。在申威处理器架构下,$18号整数寄存器是传递函数的第三个参数的寄存器,$0号整数寄存器作为函数调用返回值寄存器使用。协程上下文切换函数的第三个参数是协程任务函数的参数地址。该操作将协程任务函数的参数地址作为协程上下文切换函数的返回值。
S312、使用移动指令,将$18号整数寄存器中的值移动到$16号整数寄存器中。该操作通过$16号整数寄存器,传递协程任务函数所需参数的地址,使得跳转到任务函数中时能够正确获取所需的参数。
S313、使用跳转指令,跳转到$27号整数寄存器所表示的地址上。$27号整数寄存器表示的是即将投入运行的协程的任务函数的地址,该操作会执行协程的任务函数,任务函数所需的参数在$16号整数寄存器中。该步骤最终完成了从一个协程的上下文或者线程的上下文,跳转到另一个协程的上下文中,并且从任务函数的恢复点处继续执行。
S4、在线程的上下文环境中,当协程的任务函数执行完毕且协程退出时,调用协程私有栈空间回收函数distroy_stack,回收为当前执行完毕的任务函数分配的私有栈空间,将内存空间归还给操作系统。
本发明实施例提供了一种协程实现系统,包括:
协程私有栈空间分配模块,用于为每个协程都动态分配一个私有栈空间,所述私有栈空间用于作为协程的上下文运行空间,并存储协程的上下文环境、任务函数的地址、任务函数的参数、局部变量、以及分配任务函数的函数调用栈帧;
协程上下文创建模块,用于以协程私有栈空间的底端为起始,向着低地址方向,预留出第一预设大小的预留空间,所述预留空间用于保存挂起协程的上下文环境以及切换协程的任务函数地址;
协程上下文切换模块,用于保存调用方的上下文环境、完成协程的私有栈空间的切换、恢复即将投入运行的协程的上下文环境、通过寄存器传递任务函数的参数、以及跳转到即将投入运行的协程的任务函数的恢复点,继续执行,恢复协程的运行;
协程私有栈空间回收模块,用于回收协程私有栈空间,将分配给协程的内存空间归还给操作系统。
本发明方法实施例的内容均适用于本系统实施例,本系统实施例所具体实现的功能与上述方法实施例相同,并且达到的有益效果与上述方法达到的有益效果也相同。
上面结合附图对本发明实施例作了详细说明,但是本发明不限于上述实施例,在所属技术领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。此外,在不冲突的情况下,本发明的实施例及实施例中的特征可以相互组合。
Claims (9)
1.一种协程实现方法,其特征在于,包括以下步骤:
在线程的上下文环境中,调用协程私有栈空间创建函数创建每个协程的私有空间,所述私有空间用于存储协程的上下文环境、任务函数的地址、任务函数的参数、局部变量、以及分配任务函数的函数调用栈帧;
在线程的上下文环境中,调用协程上下文创建函数在每个协程的私有空间内预留出第一预设大小的预留空间,所述预留空间用于保存挂起协程的上下文环境以及切换协程的任务函数地址;
在线程的上下文环境或协程的上下文环境中,根据应用程序的逻辑进行协程的切换,调用协程上下文切换函数,用于保存调用方的上下文环境、完成协程的私有栈空间的切换、恢复即将投入运行的协程的上下文环境、以及通过寄存器传递任务函数的参数,并且跳转到即将投入运行的协程的任务函数的恢复点,继续执行,恢复协程的运行;
在线程的上下文环境中,当协程的任务函数执行完毕且协程退出时,调用协程私有栈空间回收函数,回收为当前执行完毕的任务函数分配的私有栈空间,将内存空间归还给操作系统;
其中,所述协程上下文创建函数的实现步骤,包括:
对作为函数参数传递进来的协程私有栈空间的底端地址进行第三预设大小的字节对齐的操作;
从调整后的协程的私有栈空间的底端,向着低地址的方向,预留出第一预设大小的预留空间,所述预留空间用于保存协程的上下文环境和协程的任务函数地址;
使用长字存储指令,将$18号整数寄存器中的值存储到所述预留空间的第四预设大小的字节中;
使用装入全局指针指令,从$27号整数寄存器所代表的内存地址中,将第五预设大小的数据装入到$29号整数寄存器中;
使用长字存储指令,将$29号整数寄存器中的值存储到所述预留空间的用于保存全局指针寄存器的第六预设大小的字节中;
使用子程序返回指令,控制函数返回。
2.根据权利要求1所述的一种协程实现方法,其特征在于,所述协程私有栈空间创建函数的实现步骤,包括:
在当前线程的上下文环境中,动态申请一块连续的第二预设大小的内存空间;
调整所述内存空间的末端地址,使所述内存空间的地址按照第三预设大小的字节对齐,保存地址对齐后的末端地址,将地址对齐后的末端地址作为协程的私有栈空间的底端地址;
根据内存空间末端地址对齐的要求,调整内存空间的大小,保存调整后的内存空间的大小,将整后的内存空间的大小作为协程的私有栈空间的大小;
将动态申请的内存空间的起始地址、协程的私有栈空间的底端地址和协程的私有栈空间的大小放入一个结构体中,作为返回值。
3.根据权利要求1所述的一种协程实现方法,其特征在于,所述对作为函数参数传递进来的协程私有栈空间的底端地址进行第三预设大小的字节对齐的操作,包括:
使用装入立即数指令,将0xfffffffffffffff0立即数装入到$2号整数寄存器中;
使用逻辑与指令,将$2号整数寄存器和$16号整数寄存器进行逻辑与操作,并将结果保存到$0号整数寄存器中。
4.根据权利要求1所述的一种协程实现方法,其特征在于,所述从调整后的协程的私有栈空间的底端,向着低地址的方向,预留出第一预设大小的预留空间,所述预留空间用于保存协程的上下文环境和协程的任务函数地址,包括:
以协程的私有栈空间的底端为起始,向低地址方向预留出64个字节的空间,所述64个字节的空间用于依次保存$f2号、$f3号、$f4号、$f5号、$f6号、$f7号、$f8号和$f9号对应浮点寄存器的值;
向低地址方向接着预留出48个字节的空间,所述48个字节的空间用于依次保存$9号、$10号、$11号、$12号、$13号和$14号对应整数寄存器的值;
向低地址方向预留出16个字节的保留空间,所述16个字节的保留空间用于扩展;
向低地址方向接着预留出24个字节的空间,所述24个字节的空间用于依次保存$15号、$29号、$26号对应整数寄存器的值;
向低地址方向最后预留出8个字节的空间,所述8个字节的空间用于保存协程的任务函数地址;
使用长字减指令,将$0号整数寄存器中的值减去160,结果保存到$0号整数寄存器中。
5.根据权利要求1所述的一种协程实现方法,其特征在于,所述协程上下文切换函数的实现步骤,包括:
使用装入全局指针指令,从$27号整数寄存器所代表的内存地址中,将64位数据装入到$29号整数寄存器中;
使用装入立即数指令,将$30号整数寄存器的值减去160所得的值作为立即数,装入到$30号整数寄存器中;
使用双精度浮点存储指令,将8个浮点寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将6个整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将栈帧指针寄存器和返回地址寄存器中的值存储到预留空间的对应地址中;
切换协程的私有栈空间;
使用装入双精度浮点指令,将保存在预留空间中的8个浮点寄存器的值装入到对应的8个浮点寄存器中,恢复切换后的协程的浮点寄存器的值;
使用装入长字指令,将保存在预留空间中的6个整数寄存器的值装入到对应的6个整数寄存器中,恢复切换后的协程的整数寄存器的值;
使用装入长字指令,将保存在预留空间中的栈帧指针寄存器、全局指针寄存器和返回地址寄存器中的值装入到对应的整数寄存器中,恢复切换后的协程的栈帧指针寄存器、全局指针寄存器和返回地址寄存器的值;
使用长字加指令,将$30号整数寄存器的值加上160所得的值存入到$30号整数寄存器中;
使用移动指令,将$18号整数寄存器中的值移动到$0号整数寄存器中;
使用移动指令,将$18号整数寄存器中的值移动到$16号整数寄存器中;
使用跳转指令,跳转到$27号整数寄存器所表示的地址上。
6.根据权利要求5所述的一种协程实现方法,其特征在于,所述使用双精度浮点存储指令,将8个浮点寄存器中的值存储到预留空间的对应地址中,包括:
使用双精度浮点存储指令,将$f2号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f3号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f4号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f5号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f6号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f7号浮点寄存器中的值存储到预留空间的对应地址中;
使用双精度浮点存储指令,将$f8号浮点寄存器中的值存储到预留空间的对应地址中;使用双精度浮点存储指令,将$f9号浮点寄存器中的值存储到预留空间的对应地址中。
7.根据权利要求5所述的一种协程实现方法,其特征在于,所述使用长字存储指令,将6个整数寄存器中的值存储到预留空间的对应地址中,包括:
使用长字存储指令,将$9号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$10号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$11号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$12号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$13号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$14号整数寄存器中的值存储到预留空间的对应地址中。
8.根据权利要求5所述的一种协程实现方法,其特征在于,所述使用长字存储指令,将栈帧指针寄存器和返回地址寄存器中的值存储到预留空间的对应地址中,包括:
使用长字存储指令,将$15号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,将$26号整数寄存器中的值存储到预留空间的对应地址中;
使用长字存储指令,再次将$26号整数寄存器中的值存储到预留空间的对应地址中。
9.一种协程实现系统,其特征在于,包括:
协程私有栈空间分配模块,用于为每个协程都动态分配一个私有栈空间,所述私有栈空间用于作为协程的上下文运行空间,并存储协程的上下文环境、任务函数的地址、任务函数的参数、局部变量、以及分配任务函数的函数调用栈帧;
协程上下文创建模块,用于调用协程上下文创建函数,以协程私有栈空间的底端为起始,向着低地址方向,预留出第一预设大小的预留空间,所述预留空间用于保存挂起协程的上下文环境以及切换协程的任务函数地址;
协程上下文切换模块,用于保存调用方的上下文环境、完成协程的私有栈空间的切换、恢复即将投入运行的协程的上下文环境、通过寄存器传递任务函数的参数、以及跳转到即将投入运行的协程的任务函数的恢复点,继续执行,恢复协程的运行;
协程私有栈空间回收模块,用于回收协程私有栈空间,将分配给协程的内存空间归还给操作系统;
其中,所述协程上下文创建函数的实现步骤,包括:
对作为函数参数传递进来的协程私有栈空间的底端地址进行第三预设大小的字节对齐的操作;
从调整后的协程的私有栈空间的底端,向着低地址的方向,预留出第一预设大小的预留空间,所述预留空间用于保存协程的上下文环境和协程的任务函数地址;
使用长字存储指令,将$18号整数寄存器中的值存储到所述预留空间的第四预设大小的字节中;
使用装入全局指针指令,从$27号整数寄存器所代表的内存地址中,将第五预设大小的数据装入到$29号整数寄存器中;
使用长字存储指令,将$29号整数寄存器中的值存储到所述预留空间的用于保存全局指针寄存器的第六预设大小的字节中;
使用子程序返回指令,控制函数返回。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110772897.XA CN113608843B (zh) | 2021-07-08 | 2021-07-08 | 协程实现方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110772897.XA CN113608843B (zh) | 2021-07-08 | 2021-07-08 | 协程实现方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113608843A CN113608843A (zh) | 2021-11-05 |
CN113608843B true CN113608843B (zh) | 2023-08-25 |
Family
ID=78304222
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110772897.XA Active CN113608843B (zh) | 2021-07-08 | 2021-07-08 | 协程实现方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113608843B (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101833476A (zh) * | 2010-05-28 | 2010-09-15 | 西安交通大学 | 基于cmp的推测多线程机制下的独立栈函数调用方法 |
KR20130041540A (ko) * | 2011-10-17 | 2013-04-25 | 엔에이치엔(주) | 코루틴을 이용하여 원격 프로시저 호출 서비스를 제공하는 방법 및 장치 |
CN107992344A (zh) * | 2016-10-25 | 2018-05-04 | 腾讯科技(深圳)有限公司 | 一种协程实现方法及装置 |
CN108021449A (zh) * | 2017-12-01 | 2018-05-11 | 厦门安胜网络科技有限公司 | 一种协程实现方法、终端设备及存储介质 |
CN109298922A (zh) * | 2018-08-30 | 2019-02-01 | 百度在线网络技术(北京)有限公司 | 并行任务处理方法、协程框架、设备、介质和无人车 |
CN112612615A (zh) * | 2020-12-28 | 2021-04-06 | 中孚安全技术有限公司 | 基于多线程内存分配和上下文调度的数据处理方法及系统 |
CN112613276A (zh) * | 2020-12-28 | 2021-04-06 | 南京中孚信息技术有限公司 | 一种流式文档解析的并行执行方法及系统 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8589925B2 (en) * | 2007-10-25 | 2013-11-19 | Microsoft Corporation | Techniques for switching threads within routines |
US10157268B2 (en) * | 2016-09-27 | 2018-12-18 | Microsoft Technology Licensing, Llc | Return flow guard using control stack identified by processor register |
-
2021
- 2021-07-08 CN CN202110772897.XA patent/CN113608843B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101833476A (zh) * | 2010-05-28 | 2010-09-15 | 西安交通大学 | 基于cmp的推测多线程机制下的独立栈函数调用方法 |
KR20130041540A (ko) * | 2011-10-17 | 2013-04-25 | 엔에이치엔(주) | 코루틴을 이용하여 원격 프로시저 호출 서비스를 제공하는 방법 및 장치 |
CN107992344A (zh) * | 2016-10-25 | 2018-05-04 | 腾讯科技(深圳)有限公司 | 一种协程实现方法及装置 |
CN108021449A (zh) * | 2017-12-01 | 2018-05-11 | 厦门安胜网络科技有限公司 | 一种协程实现方法、终端设备及存储介质 |
CN109298922A (zh) * | 2018-08-30 | 2019-02-01 | 百度在线网络技术(北京)有限公司 | 并行任务处理方法、协程框架、设备、介质和无人车 |
CN112612615A (zh) * | 2020-12-28 | 2021-04-06 | 中孚安全技术有限公司 | 基于多线程内存分配和上下文调度的数据处理方法及系统 |
CN112613276A (zh) * | 2020-12-28 | 2021-04-06 | 南京中孚信息技术有限公司 | 一种流式文档解析的并行执行方法及系统 |
Non-Patent Citations (1)
Title |
---|
Go语言在国产CPU平台上应用前景的探索与思考;陈希、胡彬;《电子技术应用》;第44卷(第08期);1-4+9 * |
Also Published As
Publication number | Publication date |
---|---|
CN113608843A (zh) | 2021-11-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CA2275970C (en) | Object and method for providing efficient multi-user access to shared operating system kernal code using instancing | |
US8141076B2 (en) | Cell processor methods and apparatus | |
US9043806B2 (en) | Information processing device and task switching method | |
CN111045786B (zh) | 一种云环境下的基于镜像分层技术的容器创建系统及方法 | |
JP4753549B2 (ja) | キャッシュメモリおよびシステム | |
US9990299B2 (en) | Cache system and method | |
CN110069336A (zh) | 内存资源分配方法、分配装置、芯片和存储装置 | |
CN112000463A (zh) | 一种基于cuda的gpu资源分配方法、系统、终端及存储介质 | |
CN109725977A (zh) | 一种基于Android系统的多应用显示方法及终端设备 | |
CN113608843B (zh) | 协程实现方法和系统 | |
CN114546642A (zh) | 任务执行方法、装置、计算机设备、存储介质和程序产品 | |
CN107451070B (zh) | 一种数据的处理方法和服务器 | |
CN109783145B (zh) | 一种创建基于多映像的多功能嵌入式系统的方法 | |
CN117215491A (zh) | 一种快速数据访问方法、快速数据访问装置及光模块 | |
US9390029B2 (en) | Dynamic management of random access memory | |
CN114721814A (zh) | 一种基于共享栈的任务分配方法、装置、计算机设备 | |
US11275589B2 (en) | Method for managing the supply of information, such as instructions, to a microprocessor, and a corresponding system | |
CN112486679A (zh) | 一种kubernetes集群的pod调度方法、装置及设备 | |
CN113419871B (zh) | 基于同步槽的对象处理方法及相关产品 | |
CN113126884A (zh) | 数据迁移方法、装置、电子设备及计算机存储介质 | |
CN116978305B (zh) | 一种多伽马调光方法、系统和存储介质 | |
WO2021254047A1 (zh) | 分布式数据库重分布的实现方法、数据库、服务器及介质 | |
CN117056031B (zh) | 一种基于虚拟进程的跨容器动态库共享方法 | |
JP2002041310A (ja) | クラス動的バインドシステムおよび方法 | |
CN118283359A (zh) | 一种动效控制方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20240513 Address after: 100085, 2nd Floor, Building 2, No. 35 Shangdi East Road, Haidian District, Beijing, China, 2-520 Patentee after: Beijing Blue Dot Power Data Technology Co.,Ltd. Country or region after: China Address before: 510091 No. 1, Xia Tang Road, Yuexiu District, Guangzhou, Guangdong. Patentee before: THE OPEN University OF GUANGDONG (GUANGDONG POLYTECHNIC INSTITUTE) Country or region before: China |
|
TR01 | Transfer of patent right |