发明内容
有鉴于此,本公开提出了一种有利于容纳更多协程的方法。本公开还提出了相应的装置。
根据本公开的一方面,提供了一种协程运行栈的分配方法,所述方法包括:确定要切换的目标协程是否是当前协程;在确定所述目标协程不是所述当前协程的情况下,切换上下文,所述切换上下文包括将所述当前协程的运行栈中的数据复制到私有内存,并将所述私有内存中所述目标协程的数据复制到所述运行栈,所述私有内存由包括所述当前协程和所述目标协程在内的多个协程所共享;为所述目标协程分配CPU,以执行所述目标协程。
根据本公开的另一方面,提供了一种协程运行栈的分配装置,所述装置包括:目标协程确定单元,用于确定要切换的目标协程是否是当前协程;上下文切换单元,用于在确定所述目标协程不是所述当前协程的情况下,切换上下文,所述切换上下文包括将所述当前协程的运行栈中的数据复制到私有内存,并将所述私有内存中所述目标协程的数据复制到所述运行栈,所述私有内存由包括所述当前协程和所述目标协程在内的多个协程所共享;协程执行单元,用于为所述目标协程分配CPU,以执行所述目标协程
根据本公开的另一方面,提供了一种协程运行栈的分配装置,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行上述方法。
根据本公开的另一方面,提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其中,所述计算机程序指令被处理器执行时实现上述方法。
通过多个协程共享私有内存,以存储被切换走但尚未完成的协程,使得无需为每个协程分配一个较大的内存,这大大节省了运行协程所占用的内存,有利于在内存一定的情况下,运行更多协程。
根据下面参考附图对示例性实施例的详细说明,本公开的其它特征及方面将变得清楚。
具体实施方式
以下将参考附图详细说明本公开的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。
另外,为了更好的说明本公开,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本公开同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本公开的主旨。
实施例1
图1示出根据本公开的一个实施例的协程运行栈的分配方法。该分配方法可以应用于操作系统中的协程执行器。如图1所示,该方法包括下列步骤。
步骤102,确定要切换的目标协程是否是当前协程。
在一种可能的实现方式中,步骤102可以包括:在所述目标协程的协程号和所述当前协程的协程号一致时,确定要切换的目标协程是当前协程;在所述目标协程的协程号和所述当前协程的协程号不一致时,确定要切换的目标协程不是当前协程。协程号可以任意能够唯一地标识协程的标记。
步骤104,在确定所述目标协程不是所述当前协程的情况下,切换上下文,所述切换上下文包括将所述当前协程的运行栈中的数据复制到私有内存,并将所述私有内存中所述目标协程的数据复制到所述运行栈,所述私有内存由包括所述当前协程和所述目标协程在内的多个协程所共享。
步骤106,为所述目标协程分配CPU,以执行所述目标协程。
在一种可能的实现方式中,如果在步骤102中确定所述目标协程是所述当前协程,则可不切换上下文,换言之,可跳过步骤104,直接跳到步骤106,分配CPU以执行所述目标协程。
在上述实施例中,通过多个协程共享私有内存,以存储被切换走但尚未完成的协程,使得无需为每个协程分配一个较大的内存,这大大节省了运行协程所占用的内存,有利于在内存一定的情况下,运行更多协程。该私有内存可以是指定的一段内存空间。该私有内存可以是栈内存。
例如,设共有X个协程,单个协程的安全运行栈大小为Y,则根据现有技术,共占用X*Y大小的内存空间,而根据本公开,仅需要占用Y+(a1+a2+……+an)大小的内存空间,其中,n表示X个协程中被切换走但尚未完成的协程总数,所以n必然小于X;ai表示协程i被切换走时存储在运行栈中的数据所占的内存,其是运行协程i所必需的内存,可以认为ai最大的情况下也应该小于Y,例如,很多情况下,ai可能仅为Y的百分之一大小。在一些测试中,设置私有内存为Y+(a1+a2+……+an)仅为X*Y的百分之一大小,即可满足需求。
在一种可能的实现方式中,在上述步骤102之前,如图1所示的方法还可以包括:触发协程切换事件;从协程调度器响应于所述协程切换事件而分派的待执行协程中取出所述目标协程。
图2示出根据本公开的一个示例性实施例的协程运行栈的分配示意图。协程调度器202被配置为处理协程的创建、分派、销毁等。协程执行器204在执行协程时,如果遇到yield指令,则可触发协程切换事件。被触发的协程切换事件可包括:协程yield原语、IO事件、Sleep事件、同步事件等。协程调度器202可监听协程执行器204所触发的协程切换事件,并响应于监听到的协程切换事件来给协程执行器204分派待执行的协程,例如如图所示,可为协程执行器204分派M个待执行协程。协程执行器204可按一定顺序从协程调度器202所分派的待执行协程中取出目标协程并执行协程切换。例如,待执行的协程可以是队列,协程执行器204可按照先进先出的原则依次从该队列中取出目标协程。也可采用本领域技术人员认为适用的其他技术手段从待执行协程中选择目标协程,本公开对此不作限定。根据本公开执行协程切换的过程可参加图1的相关描述。
本领域技术人员可以理解地是,一个操作系统可以具有多个协程执行器,协程调度器可以给这多个协程执行器分派待执行协程。
实施例2
图3示出根据本公开的一个示例性实施例的协程运行栈的分配装置300的示意图。装置300可以应用于操作系统中的协程执行器。如图3所示,装置300包括:目标协程确定单元302,用于确定要切换的目标协程是否是当前协程;上下文切换单元304,用于在确定所述目标协程不是所述当前协程的情况下,切换上下文,所述切换上下文包括将所述当前协程的运行栈中的数据复制到私有内存,并将所述私有内存中所述目标协程的数据复制到所述运行栈,所述私有内存由包括所述当前协程和所述目标协程在内的多个协程所共享;协程执行单元306,用于为所述目标协程分配CPU,以执行所述目标协程。
在一种可能的实现方式中,所述装置300还可以包括:切换触发单元(未示出),用于触发协程切换事件;目标协程获取单元(未示出),用于从协程调度器响应于所述协程切换事件而分派的待执行协程中取出所述目标协程。
在一种可能的实现方式中,上下文切换单元304中,确定要切换的目标协程是否是当前协程,可以包括:在所述目标协程的协程号和所述当前协程的协程号一致时,确定要切换的目标协程是当前协程;在所述目标协程的协程号和所述当前协程的协程号不一致时,确定要切换的目标协程不是当前协程。
在一种可能的实现方式中,协程执行单元306还可以用于在确定所述目标协程是所述当前协程的情况下,分配CPU以执行所述目标协程。
实施例3
图4是根据一示例性实施例示出的一种协程运行栈的分配装置1900的框图。例如,装置400可以被提供为一服务器。参照图4,装置400包括处理组件422,其进一步包括一个或多个处理器,以及由存储器432所代表的存储器资源,用于存储可由处理组件422的执行的指令,例如应用程序。存储器432中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件422被配置为执行指令,以执行上述方法。
装置400还可以包括一个电源组件426被配置为执行装置400的电源管理,一个有线或无线网络接口450被配置为将装置400连接到网络,和一个输入输出(I/O)接口458。装置400可以操作基于存储在存储器432的操作系统,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM或类似。
在示例性实施例中,还提供了一种非易失性计算机可读存储介质,例如包括计算机程序指令的存储器432,上述计算机程序指令可由装置400的处理组件422执行以完成上述方法。
本公开可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本公开的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。
这里参照根据本公开实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本公开的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。