CN115408117A - 协程运行方法、装置、计算机设备和存储介质 - Google Patents
协程运行方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN115408117A CN115408117A CN202110593076.XA CN202110593076A CN115408117A CN 115408117 A CN115408117 A CN 115408117A CN 202110593076 A CN202110593076 A CN 202110593076A CN 115408117 A CN115408117 A CN 115408117A
- Authority
- CN
- China
- Prior art keywords
- coroutine
- thread
- target thread
- target
- running
- 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.)
- Pending
Links
Images
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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/481—Exception handling
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/484—Precedence
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5018—Thread allocation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5021—Priority
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本申请涉及一种协程运行方法、装置、计算机设备和存储介质。所述方法包括:当目标线程中运行的第一协程因占用所述目标线程绑定的资源而引起向第二协程切换产生异常时,将所述目标线程和所述第一协程置为停止状态;创建新线程,并将所述目标线程的执行锁分配给所述新线程;基于已分配所述执行锁的所述新线程运行所述第二协程;当所述第二协程运行结束、且所述目标线程由所述停止状态进入等待状态时,终止所述新线程,并将所述新线程的所述执行锁释放给所述目标线程;通过所述目标线程继续运行所述第一协程。采用本方法能够提高协程的运行效率。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种协程运行方法、装置、计算机设备和存储介质。
背景技术
随着计算机技术的发展,为了保证内存可见性,计算机设备通过单线程的协程调度器调度协程,使调度的协程在同一个操作系统线程上运行。协程调度器对运行在操作系统线程上的协程进行切换,使多个协程在同一个操作系统线程上并发的运行,以充分利用硬件设备的计算资源。但是,当协程使用了线程绑定的资源时,则无法将在该线程上运行的协程切换出去,导致同一个调度器内的其它协程不能被调度运行,从而降低了协程的运行效率。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提高运行效率的协程运行方法、装置、计算机设备和存储介质。
一种协程运行方法,所述方法包括:
当目标线程中运行的第一协程因占用所述目标线程绑定的资源而引起向第二协程切换产生异常时,将所述目标线程和所述第一协程置为停止状态;
创建新线程,并将所述目标线程的执行锁分配给所述新线程;
基于已分配所述执行锁的所述新线程运行所述第二协程;
当所述第二协程运行结束、且所述目标线程由所述停止状态进入等待状态时,终止所述新线程,并将所述新线程的所述执行锁释放给所述目标线程;
通过所述目标线程继续运行所述第一协程。
一种协程运行装置,所述装置包括:
设置模块,用于当目标线程中运行的第一协程因占用所述目标线程绑定的资源而引起向第二协程切换产生异常时,将所述目标线程和所述第一协程置为停止状态;
创建模块,用于创建新线程,并将所述目标线程的执行锁分配给所述新线程;
运行模块,用于基于已分配所述执行锁的所述新线程运行所述第二协程;
终止模块,当所述第二协程运行结束、且所述目标线程由所述停止状态进入等待状态时,用于终止所述新线程,并将所述新线程的所述执行锁释放给所述目标线程;
所述运行模块,还用于通过所述目标线程继续运行所述第一协程。
在一个实施例中,所述装置还包括:
插入模块,用于在所述目标线程中插入内存屏障指令,以使所述第一协程在运行时所形成的缓存数据更新到主内存;
释放模块,用于释放所述目标线程的执行锁;
所述创建模块,还用于将所述目标线程释放的执行锁分配给所述新线程。
在一个实施例中,所述装置还包括:
检测模块,用于检测待分配所述执行锁的其它线程;
所述运行模块,若检测到待分配所述执行锁的其它线程,则还用于将所述执行锁分配给所述其它线程,并基于已分配所述执行锁的所述其它线程运行所述第二协程;
所述创建模块,若未检测到待分配所述执行锁的其它线程,则还用于执行所述创建新线程的步骤。
在一个实施例中,终止模块,还用于:
当所述第二协程运行结束时,检测所述目标线程的状态变化,得到检测结果;
若基于所述检测结果确定所述目标线程从所述停止状态进入所述等待状态,则执行所述终止所述新线程的步骤;
所述装置还包括:
所述运行模块,若基于所述检测结果确定所述目标线程未从所述停止状态进入所述等待状态,则还用于基于已分配所述执行锁的所述新线程运行其它协程。
在一个实施例中,终止模块,还用于:
当检测到所述目标线程进入了用于等待所述执行锁的等待队列时,确定所述目标线程的状态发生变化,得到表示发生状态变化的检测结果;
当未检测到所述目标线程进入用于等待所述执行锁的等待队列时,确定所述目标线程的状态未发生变化,得到表示状态未发生变化的检测结果。
在一个实施例中,所述装置还包括:
所述插入模块,还用于在所述新线程中插入内存屏障指令,以使所述第二协程在运行时所形成的缓存数据更新到中央处理器对应的本地缓存;
所述终止模块,还用于释放所述新线程的执行锁,并将释放的所述执行锁分配给所述目标线程。
在一个实施例中,所述装置还包括:
创建模块,还用于创建所述目标线程;
调度模块,用于通过协程调度器调度所述第一协程,并在所述目标线程中运行所述第一协程,以通过运行的所述第一协程执行任务队列中的待执行任务;
切换模块,当所述待执行任务执行中止时,用于将所述第一协程向所述第二协程进行切换。
在一个实施例中,所述切换模块,还用于:
通过所述协程调度器从协程集合中调度所述第二协程;
对所述第一协程进行协程切换操作,以切换至所述第二协程。
在一个实施例中,所述装置还包括:
选取模块,用于从协程资源池中,选取访问相同资源、且具有内存可见性要求的协程组成所述协程集合;
其中,所述第一协程和所述第二协程均属于所述协程集合。
在一个实施例中,所述运行模块,还用于:
获取所述第一协程停止运行时保存的运行数据;
在所述目标线程中基于所述运行数据继续运行所述第一协程。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
当目标线程中运行的第一协程因占用所述目标线程绑定的资源而引起向第二协程切换产生异常时,将所述目标线程和所述第一协程置为停止状态;
创建新线程,并将所述目标线程的执行锁分配给所述新线程;
基于已分配所述执行锁的所述新线程运行所述第二协程;
当所述第二协程运行结束、且所述目标线程由所述停止状态进入等待状态时,终止所述新线程,并将所述新线程的所述执行锁释放给所述目标线程;
通过所述目标线程继续运行所述第一协程。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
当目标线程中运行的第一协程因占用所述目标线程绑定的资源而引起向第二协程切换产生异常时,将所述目标线程和所述第一协程置为停止状态;
创建新线程,并将所述目标线程的执行锁分配给所述新线程;
基于已分配所述执行锁的所述新线程运行所述第二协程;
当所述第二协程运行结束、且所述目标线程由所述停止状态进入等待状态时,终止所述新线程,并将所述新线程的所述执行锁释放给所述目标线程;
通过所述目标线程继续运行所述第一协程。
上述实施例中,在将目标线程中运行的第一协程切换为第二协程时,如果产生切换异常,则将目标线程和第一协程置为停止状态;然后计算机设备创建新线程并将目标线程的执行锁分配给新线程,并基于已分配执行锁的新线程运行第二协程,在目标线程因切换异常而进入停止状态时,创建新线程去运行第二协程,从而使第二协程不会因目标线程产生切换异常而无法被调度运行,充分利用了中央处理器的计算资源,提高了协程的运行效率。此外,当第二协程运行结束,且目标线程已经结束了停止状态并进入了等待状态,则计算机设备终止新线程,并将新线程持有的执行锁释放给目标线程,此时目标线程继续运行第一协程。由于新线程和目标线程均是在持有执行锁后才能运行协程,从而可以保证在同一时刻只有一个协程在运行,也即保证协程被单并发的调度运行,避免了由于多协程同时运行而产生的资源竞争以及为保证内存可见性而产生的额外开销和编程复杂度。
附图说明
图1为一个实施例中协程运行方法的应用环境图;
图2为一个实施例中协程运行方法的流程示意图;
图3为一个实施例中协程运行方法的示意图;
图4为另一个实施例中协程运行方法的示意图;
图5为一个实施例中协程调度器调度协程的示意图;
图6为一个实施例中线程运行状态的示意图;
图7为一个实施例中协程调度器的调度方法示意图;
图8为一个实施例中服务器处理待执行任务的示意图;
图9为一个实施例中客户端和服务器交互的时序图;
图10为一个实施例中协程运行装置的结构框图;
图11为另一个实施例中协程运行装置的结构框图;
图12为一个实施例中计算机设备的内部结构图;
图13为另一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请提供的协程运行方法,可以应用于如图1所示的应用环境中。在该应用环境中,包括计算机设备102。计算机设备102的中央处理器中运行了目标线程,当目标线程中运行的第一协程因占用目标线程绑定的资源而引起向第二协程切换产生异常时,将目标线程和第一协程置为停止状态,并创建新线程。计算机设备102将目标线程的执行锁分配给新线程,并基于已分配执行锁的新线程运行第二协程。当第二协程运行结束、且目标线程由停止状态进入等待状态时,计算机设备102终止新线程,并将新线程的执行锁释放给目标线程,通过目标线程继续运行第一协程。
其中,计算机设备102可以是终端,也可以是服务器。当计算机设备102为终端时,该终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。
当计算机设备102为服务器时,该服务器可以是独立的物理服务器,也可以是区块链系统中的多个服务节点所组成的服务器集群,各服务节点之间形成组成点对点(P2P,Peer To Peer)网络,P2P协议是一个运行在传输控制协议(TCP,Transmission ControlProtocol)协议之上的应用层协议。
此外,服务器也可以是多个物理服务器构成的服务器集群,可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器。
在一个实施例中,如图2所示,提供了一种协程运行方法,以该方法应用于图1中的计算机设备为例进行说明,包括以下步骤:
S202,当目标线程中运行的第一协程因占用目标线程绑定的资源而引起向第二协程切换产生异常时,将目标线程和第一协程置为停止状态。
其中,线程是操作系统内核调度的最小单位,用于执行所绑定的任务。线程具有初始状态(Init)、运行就绪状态(Runnable)和运行状态(Running)。线程被创建后处于初始状态,然后进入运行就绪状态,处于运行就绪状态的各线程之间竞争中央处理器的计算资源。当处于运行就绪状态的某个线程(假设为线程a)竞争到中央处理器计算资源时,该线程a进入运行状态,处于运行状态的线程a可以利用中央处理器的时间片(timeslice)运行协程。
中央处理器可以使用分时调度模式或抢占式调度模式在多个线程间进行高速切换,以提高计算资源的利用率。例如,计算机设备将任务队列中待执行任务绑定在线程上,并对线程进行切换,以调度线程在不同的中央处理器上执行。线程切换时,需要进入操作系统内核态,并需要切换线程对应的寄存器和操作系统内部数据,然后进行线程切换。
其中,协程是在操作系统用户态调度运行的程序组件。协程在运行过程中执行程序代码,该程序代码包括业务代码和中断程序,其中,该中断程序用于控制协程切换。当协程发生切换(如从协程1向协程2切换)时,该协程1将让出线程,进而让出所使用的CPU,进入挂起(parked)状态,并在被唤醒后再回到中断点继续执行。
一个线程可以对应一个或多个协程,多个占用相同资源(即线程所绑定的资源)的协程组成协程集合。其中,协程集合的呈现方式可以是协程队列或协程数组。在同一时刻,一个线程上只能运行一个协程,计算机设备可以通过协程调度器从协程集合调度协程,以将当前在线程上运行的协程切换至调度的协程,从而该调度的协程在线程上运行。
在一个实施例中,当目标线程中的第一协程运行到切换(yield)函数时,计算机设备将该第一协程从运行状态转为挂起状态,直到目标线程向第一协程发送数据,第一协程才会基于接收的数据继续运行。例如,目标线程调用send方法向第一协程发送数据,第一协程在接收到数据后,基于接收的数据继续运行。
在第一协程处于挂起状态时,目标线程可以将第一协程切换出去,使第一协程让出占用的目标线程,然后通过协程调度器调度第二协程运行,从而可以提高目标线程的吞吐量以及中央处理器计算资源的利用率。
在一个实施例中,当收到服务请求时,计算机设备在目标线程中创建并运行第一协程,若第一协程执行异步请求事件,则第一协程向目标服务器发送异步请求以获取相应的请求数据,并且在等待接收目标服务器返回该相应的请求数据的过程中,可以对第一协程进行切换,以在目标线程上运行第二协程,此时第一协程处于挂起状态,而第二协程处于运行状态。当接收目标服务器返回该相应的请求数据时,第一协程将从挂起状态切换到运行状态,从而继续运行。
在一个实施例中,当目标线程由运行第一协程切换为运行第二协程时,如果第一协程占用了目标线程绑定的资源(如第一协程占用了线程锁住的锁、线程间共享的数据、硬件资源或操作系统状态等),则第一协程不能让出目标线程以供其它协程使用,此时目标线程从第一协程向第二协程切换产生异常。当确定协程切换异常时,计算机设备将目标线程和第一协程均置为停止状态,此时的第一协程将继续独占目标线程,而其它协程不能被切换到目标线程上运行。其中,该停止状态即为pin状态。
例如,当目标线程中运行的第一协程因申请重入锁(ReentrantLock)失败时被挂起(parked),由于第一协程此时持有目标线程的同步锁,所以目标线程无法将第一协程切换为第二协程,目标线程和第一协程均将处于停止状态。
S204,创建新线程,并将目标线程的执行锁分配给新线程。
其中,执行锁(Execution Lock)用于锁定线程,以避免其它线程和被锁定的线程同时运行相同的程序代码块,也即避免同一协程在同一时刻被多个线程调度运行。例如,当持有执行锁的目标线程运行第一协程时,其它线程必须等待该目标线程运行结束并释放执行锁后,才能通过竞争执行锁的方式取得协程的运行权。
执行锁的主要操作包括:加锁、释放锁和检查是否有其它线程在等待锁。其中,加锁的操作是对线程添加执行锁,以使持有执行锁的线程可以取得协程的独占运行权。释放锁的操作是使线程释放当前所持有的执行锁,以使其它线程可以调取该线程中运行的协程并运行。检查是否有其它线程在等待锁的操作,是指持有执行锁的线程检查是否有其它线程进入了等待分配执行锁的队列,也即检查是否有处于停止状态的线程进入了等待获取执行锁的等待状态(Waiting)。
执行锁属于Java对象,而Java对象是类的实例,有状态和行为。Java对象包含了分别与加锁的操作、释放锁的操作和检查是否有其它线程在等待锁的操作对应的方法,具体为:加锁方法(Lock)、释放锁方法(Unlock)、检查是否有其它线程在等待锁方法(HasQueuedThread)。其中,该加锁方法可用于给目标线程添加执行锁;该释放锁方法可用于释放目标线程所持有的执行锁;检查是否有其它线程在等待锁方法,用于检查是否有其它线程从停止状态转换为等待执行锁的等待状态。
在一个实施例中,计算机设备可以通过继承线程类的方式、实现运行接口(Runnable接口)的方式、实现回调接口(Callable)的方式或使用线程池的方式创建新线程。
在一个实施例中,上述将目标线程的执行锁分配给新线程的步骤,具体可以包括:计算机设备释放目标线程的执行锁,并对新线程添加该释放的执行锁。例如,计算机设备通过执行锁的Unlock方法使目标线程释放执行锁,并通过执行锁的Lock方法对新线程添加执行锁。
S206,基于已分配执行锁的新线程运行第二协程。
新线程在分配到执行锁后,享有对第二协程的独占运行权,其它线程无权限调取该第二协程运行,从而不会有其它线程与新线程竞争共享变量和全局变量等资源,保证了内存可见性,也即在其它线程中观察到的内存中数据的读写顺序和新线程对内存中数据的读写顺序一致。
在一个实施例中,S206之后可以包括:新线程释放执行锁,其它线程竞争执行锁,当其中一个线程竞争到执行锁时,通过协程调度器调度协程集合中的协程并运行。
S208,当第二协程运行结束、且目标线程由停止状态进入等待状态时,终止新线程,并将新线程的执行锁释放给目标线程。
目标线程由停止状态进入等待状态是指目标线程被唤醒(unpark),并且进入了等待分配执行锁的队列,在分配到执行锁后即可开始运行第一协程。例如,若第一协程执行异步请求事件,则第一协程向目标服务器发送异步请求以获取相应的请求数据,并且在等待接收目标服务器返回该相应的请求数据的过程中,可以对第一协程进行切换,如果切换过程中产生切换异常,则计算机设备将目标线程和第一协程置为停止状态,并创建新线程。在通过新线程运行第二协程的过程中,如果第一协程收到了请求数据,则第一协程在收到请求数据时由停止状态进入等待状态。当第二协程运行结束,如果目标线程已经由停止状态进入等待状态,则计算机设备终止新线程,并将新线程的执行锁释放给目标线程。
在一个实施例中,计算机设备可以通过设置终止标志位的方法终止新线程,终止标志位可以是布尔型(boolean)的标志,如False标志,因此通过设置False标志可以终止新线程。
在另一个实施例中,计算机设备可以先使用中断函数(如inturrupt()函数)中断新线程,然后再终止被中断的新线程。
在另一个实施例中,计算机设备可以通过停止函数(如stop()函数)终止新线程。
在一个实施例中,在新线程终止之前,计算机设备通过执行锁的Unlock方法释放新线程所持有的执行锁,并通过执行锁的Lock方法将新线程释放的执行锁分配给目标线程。
例如,在ReentrantLock被释放后,第一协程可以申请获取到ReentrantLock,所以计算机设备调用唤醒函数唤醒第一协程,目标线程也由停止状态进入等待状态。当第二协程运行结束时,若目标线程进入了等待状态,则计算机设备终止新线程,并将新线程的执行锁释放给目标线程,执行S210。
S210,通过目标线程继续运行第一协程。
目标线程重新分配到执行锁后,继续运行第一协程。例如,第一协程在发送了异步请求后进入停止状态,当收到请求应答时,由停止状态进入等待状态。在目标线程接收到与异步请求对应的请求数据、且重新分配到执行锁后,根据收到的请求数据继续运行第一协程。
为了更加清楚且直观地理解本申请的协程运行方法,结合图3进行阐述:如图3所示,计算机设备的中央处理器中创建并运行了目标线程,目标线程上运行了第一协程,当第一协程被挂起并通过协程调度器向第二协程切换时,如果由于第一协程占用了目标线程绑定的资源而引起向第二协程切换产生异常,则协程调度器创建新线程,并在目标线程中插入内存屏障指令,然后将目标线程的执行锁分配给新线程。计算机设备基于已分配执行锁的新线程运行第二协程。当第二协程运行结束、且目标线程由停止状态进入等待状态时,计算机设备终止新线程,并将新线程的执行锁释放给目标线程,在新线程中插入内存屏障指令。计算机设备通过取得执行锁的目标线程继续运行第一协程。
上述实施例中,在将目标线程中运行的第一协程切换为第二协程时,如果产生切换异常,则将目标线程和第一协程置为停止状态;然后计算机设备创建新线程并将目标线程的执行锁分配给新线程,并基于已分配执行锁的新线程运行第二协程,在目标线程因切换异常而进入停止状态时,创建新线程去运行第二协程,从而使第二协程不会因目标线程产生切换异常而无法被调度运行,充分利用了中央处理器的计算资源,提高了协程的运行效率。此外,当第二协程运行结束,且目标线程已经结束了停止状态并进入了等待状态,则计算机设备终止新线程,并将新线程持有的执行锁释放给目标线程,此时目标线程继续运行第一协程。由于新线程和目标线程均是在持有执行锁后才能运行协程,从而可以保证在同一时刻只有一个协程在运行,也即保证协程被单并发的调度运行,避免了由于多协程同时运行而产生的资源竞争以及为保证内存可见性而产生的额外开销和编程复杂度。
在一个实施例中,S204之前还包括:在目标线程中插入内存屏障指令,以使第一协程对应的缓冲区内缓存的运行数据更新到中央处理器对应的内存区;释放目标线程的执行锁;S204可以包括:将目标线程释放的执行锁分配给新线程。
其中,内存屏障指令是一种中央处理器指令,用于确保中央处理器不会对插入内存屏障指令前后的指令执行顺序进行重排,并且保证内存可见性。在目标线程中插入内存屏障指令,可以使Java编译器确保插入内存屏障指令之前的内存访问操作在插入内存屏障指令之后的内存访问操作之前完成,并且保证目标线程运行中所访问的内存在新线程上与在目标线程上可见顺序一致。内存屏障指令包括写内存屏障指令(Store MemoryBarrier)、读内存屏障指令(Load Memory Barrier)和读内存写屏障指令(Full MemoryBarrier)。
在一个实施例中,计算机设备通过smp_wmb()函数执行写内存屏障指令,还可以通过smp_rmb()函数执行读内存屏障指令,以及通过smp_mb()函数执行读写内存屏障指令。
其中,第一协程在运行时所形成的运行数据将会写入到第一协程对应的缓冲区(Store Buffer),并在目标线程插入内存屏障指令之后,计算机设备扫描该缓冲区,并将该缓冲区内存储的所有运行数据更新到中央处理器对应的内存区。中央处理器对应的内存区,也即中央处理器的本地缓存(Local Cache)为位于中央处理器和主存储器(DynamicRandom Access Memory,DRAM)间的高速缓冲存储器。
计算机设备释放目标线程的执行锁,用于使目标线程上的协程可以被调度到其它线程运行。计算机设备在释放目标线程的执行锁后,将目标线程释放的执行锁分配给新线程,对新线程进行加锁处理,使新线程取得独占的运行权,避免由于其它线程和新线程同时运行而破坏协程的单并发调度机制。
在一个实施例中,计算机设备通过执行锁的Unlock方法释放目标线程的执行锁,通过执行锁的Lock方法将目标线程释放的执行锁分配给新线程。
上述实施例中,计算机设备在目标线程中添加内存屏障指令,可以保证中央处理器不会对插入内存屏障指令前后的指令执行顺序进行重排,并且保证第一协程所访问的内存在新线程上与在目标线程上可见顺序一致。此外,计算机设备释放目标线程的执行锁并将目标线程释放的执行锁分配给新线程以对新线程进行加锁处理,可以保证新线程中的协程被单并发的调度运行,避免了由于多协程同时运行而产生的资源竞争以及为保证内存可见性而产生的额外开销和编程复杂度。
在一个实施例中,S204之前还包括:检测待分配执行锁的其它线程;若检测到待分配执行锁的其它线程,则将执行锁分配给其它线程,并基于已分配执行锁的其它线程运行第二协程;若未检测到待分配执行锁的其它线程,则执行创建新线程的步骤。
计算机设备在创建新线程之前,检测是否存在待分配执行锁的其它线程,如果存在待分配执行锁的其它线程,则计算机设备可以不创建新线程,将执行锁分配给该其它线程,并通过该其它线程去运行第二协程。
在一个实施例中,如果其它线程处于等待分配执行锁的状态,则该其它线程会进入等待分配执行锁的等待队列。计算机设备检测该等待队列是否为空,若该等待队列为空,则计算机设备未检测到待分配执行锁的其它线程;若等待队列不为空,则计算机设备检测到待分配执行锁的其它线程。
上述实施例中,计算机设备在创建新线程之前,如果检测到待分配执行锁的其它线程,则可以通过其它线程运行第二协程,而不必创建新线程去运行第二协程,降低了程序的复杂度,并且减少了创建新线程所带来的开销。
在一个实施例中,S208具体包括:当第二协程运行结束时,检测目标线程的状态变化,得到检测结果;若基于检测结果确定目标线程从停止状态进入等待状态,则终止新线程;该方法还包括:若基于检测结果确定目标线程未从停止状态进入等待状态,则基于已分配执行锁的新线程运行其它协程。
其中,目标线程的状态包括运行状态、停止状态和等待状态。运行状态是目标线程运行协程调度器所调度的协程的状态。当目标线程处于运行状态时,可以对运行的协程进行切换。例如,如图4所示,目标线程先执行协程0,然后切换为运行协程1,目标线程对协程0进行切换的时机由协程0的执行代码确定。当目标线程对协程进行切换产生异常时,当前运行的协程不能让出目标线程以供其它协程使用,目标线程进入停止状态。
在目标线程处于停止状态时,计算机设备创建新线程并将执行锁分配给新线程,若目标线程被唤醒,在继续运行之前,需等待新线程释放执行锁,并取得新线程所释放的执行锁。目标线程在被唤醒后等待分配执行锁的状态为等待状态。
其中,其它协程是第一协程和第二协程之外的、协程调度器可以调度运行的协程。若在第二协程运行结束时,目标线程未从停止状态进入等待状态,则目标线程尚不能恢复运行。计算机设备基于已分配执行锁的新线程运行其它协程。
在一个实施例中,当检测到目标线程进入了用于等待执行锁的等待队列时,确定目标线程的状态发生变化,得到表示发生状态变化的检测结果;当未检测到目标线程进入用于等待执行锁的等待队列时,确定目标线程的状态未发生变化,得到表示状态未发生变化的检测结果。
其中,等待队列是先入先出的线性表,在队尾进行插入操作,在队头进行删除操作,用于存储等待获取执行锁的等待状态线程,包括顺序队列和循环队列。顺序队列是队列的顺序存储结构,用向量空间存储当前队列中的元素。顺序队列分别设置front指针和rear指针指示队头元素和队尾元素在向量空间中的位置。循环队列是存储在循环向量中的队列。当目标线程由停止状态被唤醒时,计算机设备将目标线程插入等待队列的队尾。
在一个实施例中,计算机设备检测等待队列,得到等待队列是否为空队列的检测结果,若等待队列为空队列,说明当前没有处于等待状态的线程,目标线程尚未被唤醒,此时计算机设备确定目标线程的状态未发生变化,得到表示目标线程状态未发生变化的检测结果;若等待队列不为空队列,说明目标线程已经被唤醒并被插入等待队列,计算机设备确定目标线程的状态发生变化,得到表示目标线程发生状态变化的检测结果。
在一个实施例中,计算机设备通过状态标志位表示目标线程的状态。例如,当状态标志位为0时,表示目标线程处于运行状态,当状态标志位为1时,表示目标线程处于停止状态,当状态标志位为2时,表示目标线程处于等待状态。计算机设备对状态标志位进行检测,若检测到状态标志位由1变为2,则计算机设备确定目标线程从停止状态进入等待状态。
上述实施例中,计算机设备在调度其它协程运行之前,检测目标线程的状态变化。若目标线程处于等待状态,则说明目标线程已经被唤醒,计算机设备终止新线程并回到目标线程;若目标线程依然处于停止状态,则计算机设备通过新线程运行其它协程。计算机设备每次取其它协程运行之前对目标线程的状态进行检测,可以在目标线程被唤醒时,及时回到目标线程。有效避免了目标线程在被唤醒后长时间处于等待状态而无法运行,提高了目标线程的运行效率。
在一个实施例中,S208之前还包括,在新线程中插入内存屏障指令,以使第二协程对应的缓冲区内缓存的运行数据更新到中央处理器对应的缓存区;释放新线程的执行锁,并将释放的执行锁分配给目标线程。
其中,计算机设备在新线程中插入内存屏障指令,用于确保中央处理器不会对插入内存屏障指令前后的指令执行顺序进行重排,并且使Java编译器确保插入内存屏障指令之前的内存访问操作先于插入内存屏障指令之后的内存访问操作完成,保证新线程运行中所访问的内存在其它线程上与在新线程上可见顺序一致。
其中,第二协程在运行时所形成的运行数据将会写入到第二协程对应的缓冲区,并在新线程插入内存屏障指令之后,计算机设备扫描该缓冲区,并将该缓冲区内存储的所有运行数据更新到中央处理器对应的内存区。
计算机设备释放新线程的执行锁,使目标线程可以取得执行锁,并在加锁后运行。计算机设备在释放新线程的执行锁后,将新线程释放的执行锁分配给目标线程,使目标线程取得独占的运行权,避免由于其它线程和目标线程同时运行而破坏协程的单并发调度机制。
在一个实施例中,计算机设备通过执行锁的Unlock方法释放新线程的执行锁,通过执行锁的Lock方法将新线程释放的执行锁分配给目标线程。
上述实施例中,计算机设备在新线程中添加内存屏障指令,可以保证中央处理器不会对插入内存屏障指令前后的指令执行顺序进行重排,并且保证第二协程所访问的内存在新线程上与在新线程之后运行的线程上可见顺序一致。此外,计算机设备释放新线程的执行锁并将新线程释放的执行锁分配给目标线程以对目标线程进行加锁处理,可以保证目标线程中的协程被单并发的调度运行,避免了由于多协程同时运行而产生的资源竞争以及为保证内存可见性而产生的额外开销和编程复杂度。
在一个实施例中,S202之前包括:创建目标线程;通过协程调度器调度第一协程,并在目标线程中运行第一协程,以通过运行的第一协程执行任务队列中的待执行任务;当待执行任务执行中止时,将第一协程向第二协程进行切换。
其中,协程调度器是用于对协程集合中协程进行调度的程序模块。协程调度器可以将协程限制在一个特定的线程(如目标线程)中执行,或将协程分派到一个线程池,由线程池中的线程执行。
在一个实施例中,计算机设备通过协程构建器(例如,launch或者async)接收一个可选的协程上下文参数(CoroutineContext)参数,该协程上下文参数可以被用来为一个协程指定协程调度器。
任务队列是先入先出的线性表,在队尾进行插入操作,在队头进行删除操作,用于存储待执行任务,包括顺序队列和循环队列。
其中,计算机设备可以通过继承线程类的方式、实现运行接口(Runnable接口)的方式、实现回调接口(Callable)、使用线程池的方式创建目标线程。
例如,如图5所示,计算机设备将用户提交的任务0、任务1和任务2存储在任务队列(Task Queue)。协程调度器将任务队列中待执行任务分别分配给协程0至协程3去执行,并调度协程0至协程3在目标线程上运行。其中,目标线程运行在中央处理中。当协程0所执行的待执行任务执行中止时,协程0被挂起(Parked),计算机设备将协程0切换为协程1。当协程1所执行的待执行任务执行中止时,协程1被挂起(Parked),计算机设备将协程1切换为协程2,依次类推,直到所有的待执行任务均被执行完成。
上述实施例中,计算机设备通过协程调度器将待执行任务绑定在协程上运行,并在待执行任务执行中止时,通过协程调度器对协程进行切换,充分利用了中央处理器的计算资源。并且,由于协程的切换是在操作系统用户态完成的,不需要进入操作系统内核态,没有系统调用开销。并且相比于进程间的切换,协程间切换时需要保存的数据较少,切换的效率较高。
在一个实施例中,将第一协程向第二协程进行切换包括:通过协程调度器从协程集合中调度第二协程;对第一协程进行协程切换操作,以切换至第二协程。
其中,协程集合是由多个占用相同资源(即线程所绑定的资源)的协程组成的集合。
计算机设备通过协程调度器从协程集合中调度第二协程,以将第一协程切换为第二协程。协程调度器可以根据协程集合中协程的优先级调度第二协程,例如,协程调度器可以根据协程集合中协程使用计算资源的优先级调度第二协程。例如,协程调度器也可以根据各个协程处理的待执行任务的优先级调度第二协程。例如,协程调度器可以根据各个协程处理的待执行任务对处理时间的要求调度第二协程。
在一个实施例中,当待执行任务执行中止时,计算机设备生成切换指令,响应于切换指令,协程调度器根据协程集合中协程的优先级调度第二协程,并对第一协程进行协程切换操作,以切换至第二协程。
在一个实施例中,计算机设备从协程资源池中,选取访问相同资源、且具有内存可见性要求的协程组成协程集合;其中,第一协程和第二协程均属于协程集合。
其中,协程资源池是由各种协程所组成的资源池,该协程资源池中的协程可以占用相同或不同的资源。协程资源池中的协程在运行时存在资源竞争,也即多个协程可能会读写相同的共享数据和全局变量。并且还存在内存可见性要求,也即要求在线程B中观察到的内存写入顺序和线程A中写入内存的顺序一致。
计算机设备从协程资源池中,选取访问相同资源、且具有内存可见性要求的协程组成协程集合,在处于运行状态时,同一协程集合中的协程在同一线程上运行。
上述实施例中,计算机设备从协程资源池中,选取访问相同资源、且具有内存可见性要求的协程组成协程集合,并使协程集合中的协程在同一线程上调度运行。从而,同一协程集合中的协程将共享数据和全局变量,并具有内存可见性要求,而不同协程集合中的协程将不会共享数据和全局变量,也没有内存可见性要求。由于,线程在同一时刻只能运行一个协程,并不会同时运行多个协程,所以,计算机设备在将协程分成多个协程集合分别在不同的线程上运行时,不需要引入原子读写、锁来解决资源竞争问题,也不需要引入内存屏障来保障内存可见性,降低了性能开销和编程复杂度。
在一个实施例中,S210具体包括:计算机设备获取第一协程停止运行时保存的运行数据;在目标线程中基于运行数据继续运行第一协程。
其中,运行数据是第一协程在运行过程中所产生的数据,并且在第一协程停止运行时,保存在第一协程的缓冲区中。
上述实施例中,计算机设备在第一协程继续运行时,获取停止运行时保存的运行数据,从而可以从第一协程停止运行时的位置继续运行第一协程。
具体地,计算机设备可以根据在第一协程停止运行时保存的运行数据,确定第一协程的停止位置,然后在该停止位置继续运行第一协程。例如,根据运行数据确定停止运行时的代码位置,然后在该代码位置处运行第一协程。
在一个实施例中,如图6所示,计算机设备创建目标线程,目标线程被创建后处于初始状态,然后进入运行就绪状态,处于运行就绪状态的目标线程与其它处于运行就绪状态的线程之间竞争中央处理器的计算资源。当目标线程竞争到中央处理器计算资源时,进入运行状态(Running),运行状态的目标线程可以利用中央处理器的时间片(timeslice)运行协程。
在目标线程运行时,协程调度器将任务队列中的待执行任务分别绑定在协程上,通过在目标线程运行所调度的协程执行对应的待执行任务。协程调度器对运行在目标线程上的协程进行切换,例如,当协程0停止运行被挂起时,协程调度器将目标线程上运行的协程0切换为协程1,当协程1运行结束时,若协程0被唤醒,协程调度器可以切换为协程0并继续运行。
协程调度器在对协程0进行切换时,如果协程0占用了目标线程绑定的资源,则协程调度器对协程0的切换产生异常,协程0和目标线程均进入停止状态,进入停止状态的协程0会继续占用目标线程。计算机设备在协程调度器中加入第一接口调用(Before Pin)和第二接口调用(After Pin)。Before Pin和After Pin均为钩子函数(Hook函数),BeforePin用于创建新线程并将目标线程持有的执行锁释放给新线程。After Pin用于将新线程持有的执行锁释放给目标线程。在目标线程进入Pin状态时,计算机设备调用Before Pin,通过调用Before Pin在目标线程中插入内存屏障指令,创建新线程,并将目标线程释放的执行锁分配给新线程。
新线程在运行时持有执行锁,通过协程调度器循环调度运行协程集合中的协程,每次调度运行下一个协程前,计算机设备检查目标线程是否已经由Pin状态进入等待状态,即目标线程是否已经进入等待获取执行锁的等待队列,例如通过执行锁的HasQueuedThread方法检查目标线程是否已经由Pin状态进入等待状态。若目标线程已经进入等待获取执行锁的等待队列,则计算机设备在新线程中插入内存屏障指令并调用AfterPin,通过调用After Pin将新线程的执行锁释放给目标线程,并结束新线程。
上述实施例中,计算机设备在目标线程因切换异常而进入停止状态时,创建新线程去运行协程,充分利用了硬件设备的计算资源,提高了协程的运行效率。并且,计算机设备创建了执行锁,通过执行锁保证新线程和目标线程不能同时运行,从而保证了同一时刻只有一个协程在运行,也即保证了协程被单并发的调度运行,避免了由于多协程同时运行而产生的资源竞争以及为保证内存可见性而产生的额外开销和编程复杂度。
为了更加清楚了解上述协程运行方法,这里结合图7进行描述,如图7所示,协程调度器可以执行第一接口调用方法(Before Pin)和第二接口调用方法(After Pin)。第一接口调用方法用于创建新线程,在创建新线程后在目标线程中插入内存屏障指令并将目标线程的执行锁释放给新线程。第二接口调用用于将新线程的执行锁释放给目标线程。
当目标线程中运行的第一协程因占用目标线程绑定的资源而引起向第二协程切换产生异常时,目标线程和第一协程进入Pin状态,计算机设备通过协程调度器执行第一接口调用方法,以创建新线程,在目标线程中插入内存屏障指令,将目标线程的执行锁分配给新线程,使新线程获取执行锁。协程调度器从协程集合中调度第二协程并基于已分配执行锁的新线程运行第二协程。第二协程运行结束,在协程调度器再次从协程集合中调度协程之前,通过HasQueuedThread方法检测等待队列,如果等待队列为空,说明当前没有等待状态的线程,也即目标线程仍然处于Pin状态,协程调度器从协程集合中调度协程并在新线程上运行。在所调度的协程运行结束,协程调度器再次从协程集合中调度协程之前,再次通过HasQueuedThread方法检测等待队列,如此循环,直到协程集合中的协程全部执行完。
如果协程调度器从协程集合中调度协程之前,通过HasQueuedThread方法检测到目标线程已经退出Pin状态,则计算机设备通过协程调度器执行第二接口调用方法,以退出新线程,在新线程中插入内存屏障,释放新线程的执行锁并回到目标线程,通过目标线程继续运行第一协程。
本申请提供一种订单任务处理的应用场景,如图8所示,待执行任务是订单处理任务,当用户通过安装在终端上的客户端购买商品时,客户端向服务器提交购买请求,服务器在收到购买请求时,建立订单处理任务并创建目标线程,通过目标线程上运行的各个协程分别执行对应的订单处理任务。目标线程上的第一协程通过执行订单处理任务对购买请求0进行处理。第一协程根据购买请求0对应的购买数量在数据库中查询是否有足够的库存。在等待数据库反馈查询结果时,订单处理任务执行中止,为提高中央处理器的利用率,协程调度器将第一协程向第二协程进行切换。此时,若第一协程占用了目标线程绑定的资源,则会产生切换异常,目标线程和第一协程进入Pin状态。服务器创建新线程,在目标线程中插入内存屏障指令,并将目标线程的执行锁分配给新线程,并基于已分配执行锁的新线程运行所述第二协程。新线程通过运行的第二协程执行下一个订单处理任务,以对购买请求1进行处理。
在第二协程运行过程中,如果第一协程获取了数据库反馈的查询结果,则第一协程由Pin状态进入等待状态,在获取到执行锁后即可开始运行。
当第二协程运行结束时,服务器检查目标线程是否进入了等待状态,若目标线程已经进入了等待状态,则服务器终止新线程,并将新线程的执行锁释放给目标线程,以通过目标线程继续运行第一协程。
本申请还提供一种视频播放应用场景,该视频播放应用场景应用上述的协程运行方法,如图9所示,具体步骤如下所述:
S902,客户端将视频播放请求发送至服务器。
S904,在接收到视频播放请求时,服务器创建目标线程,并对目标线程分配执行锁。
其中,目标线程在获取执行锁后,进入运行状态,并且在目标线程上运行第一协程。
S906,目标线程上的第一协程根据视频播放请求从硬盘中检索目标视频。
S908,在等待硬盘的检索结果时,协程调度器将目标线程上运行的第一协程向第二协程切换,若第一协程因占用目标线程绑定的资源而引起向第二协程切换产生异常,则执行S910。
S910,服务器创建新线程,在目标线程上插入内存屏障指令,将目标线程持有的执行锁释放给新线程,并基于已分配执行锁的新线程运行第二协程。
其中,服务器通过运行第二协程,可以对其它客户端的视频播放请求进行处理。在第二协程运行结束时,如果服务器已经获取硬盘中的目标视频,即目标线程已经由停止状态进入等待状态,则执行S912。
S912,服务器终止新线程,在新线程中插入内存屏障指令,将新线程的执行锁分配给目标线程,通过目标线程继续运行第一协程。
S914,服务器通过运行的第一协程将目标视频发送至客户端。
S916,客户端播放目标视频。
应该理解的是,虽然图2、9的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2、9中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图10所示,提供了一种协程运行装置,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:设置模块1002、创建模块1004、运行模块1006和终止模块1008,其中:
设置模块1002,用于当目标线程中运行的第一协程因占用目标线程绑定的资源而引起向第二协程切换产生异常时,将目标线程和第一协程置为停止状态;
创建模块1004,用于创建新线程,并将目标线程的执行锁分配给新线程;
运行模块1006,用于基于已分配执行锁的新线程运行第二协程;
终止模块1008,当第二协程运行结束、且目标线程由停止状态进入等待状态时,用于终止新线程,并将新线程的执行锁释放给目标线程;
运行模块1006,还用于通过目标线程继续运行第一协程。
上述实施例中,在将目标线程中运行的第一协程切换为第二协程时,如果产生切换异常,则将目标线程和第一协程置为停止状态;然后计算机设备创建新线程并将目标线程的执行锁分配给新线程,并基于已分配执行锁的新线程运行第二协程,在目标线程因切换异常而进入停止状态时,创建新线程去运行第二协程,从而使第二协程不会因目标线程产生切换异常而无法被调度运行,充分利用了中央处理器的计算资源,提高了协程的运行效率。此外,当第二协程运行结束,且目标线程已经结束了停止状态并进入了等待状态,则计算机设备终止新线程,并将新线程持有的执行锁释放给目标线程,此时目标线程继续运行第一协程。由于新线程和目标线程均是在持有执行锁后才能运行协程,从而可以保证在同一时刻只有一个协程在运行,也即保证协程被单并发的调度运行,避免了由于多协程同时运行而产生的资源竞争以及为保证内存可见性而产生的额外开销和编程复杂度。
在一个实施例中,如图11所示,装置还包括:
插入模块1010,用于在目标线程中插入内存屏障指令,以使第一协程对应的缓冲区内缓存的运行数据更新到中央处理器对应的内存区;
释放模块1012,用于释放目标线程的执行锁;
创建模块1004,还用于将目标线程释放的执行锁分配给新线程。
在一个实施例中,装置还包括:
检测模块1014,用于检测待分配执行锁的其它线程;
运行模块1006,还用于若检测到待分配执行锁的其它线程,则将执行锁分配给其它线程,并基于已分配执行锁的其它线程运行第二协程;
创建模块1004,还用于若未检测到待分配执行锁的其它线程,则执行创建新线程的步骤。
在一个实施例中,终止模块1008,还用于:
当第二协程运行结束时,检测目标线程的状态变化,得到检测结果;
若基于检测结果确定目标线程从停止状态进入等待状态,则执行终止新线程的步骤;
装置还包括:
运行模块1006,若基于检测结果确定目标线程未从停止状态进入等待状态,则还用于基于已分配执行锁的新线程运行其它协程。
在一个实施例中,终止模块1008,还用于:
当检测到目标线程进入了用于等待执行锁的等待队列时,确定目标线程的状态发生变化,得到表示发生状态变化的检测结果;
当未检测到目标线程进入用于等待执行锁的等待队列时,确定目标线程的状态未发生变化,得到表示状态未发生变化的检测结果。
在一个实施例中,装置还包括:
插入模块1010,还用于在新线程中插入内存屏障指令,以使第二协程对应的缓冲区内缓存的运行数据更新到中央处理器对应的内存区;
终止模块1008,还用于将释放的执行锁分配给目标线程。
在一个实施例中,装置还包括:
创建模块1004,还用于创建目标线程;
调度模块1016,用于通过协程调度器调度第一协程,并在目标线程中运行第一协程,以通过运行的第一协程执行任务队列中的待执行任务;
切换模块1018,用于当待执行任务执行中止时,将第一协程向第二协程进行切换。
在一个实施例中,切换模块1018,还用于:
通过协程调度器从协程集合中调度第二协程;
对第一协程进行协程切换操作,以切换至第二协程。
在一个实施例中,装置还包括:
选取模块1020,用于从协程资源池中,选取访问相同资源、且具有内存可见性要求的协程组成协程集合;
其中,第一协程和第二协程均属于协程集合。
在一个实施例中,运行模块1006,还用于:
获取第一协程停止运行时保存的运行数据;
在目标线程中基于运行数据继续运行第一协程。
关于协程运行装置的具体限定可以参见上文中对于协程运行方法的限定,在此不再赘述。上述协程运行装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图12所示。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储协程运行数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种协程运行方法。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图13所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、运营商网络、NFC(近场通信)或其它技术实现。该计算机程序被处理器执行时以实现一种协程运行方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图12、13中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:当目标线程中运行的第一协程因占用目标线程绑定的资源而引起向第二协程切换产生异常时,将目标线程和第一协程置为停止状态;创建新线程,并将目标线程的执行锁分配给新线程;基于已分配执行锁的新线程运行第二协程;当第二协程运行结束、且目标线程由停止状态进入等待状态时,终止新线程,并将新线程的执行锁释放给目标线程;通过目标线程继续运行第一协程。
在一个实施例中,所述处理器执行所述计算机程序时还实现以下步骤:在所述目标线程中插入内存屏障指令,以使所述第一协程在运行时所形成的缓存数据更新到中央处理器对应的本地缓存;释放所述目标线程的执行锁;所述将所述目标线程的执行锁分配给所述新线程包括:将所述目标线程释放的执行锁分配给所述新线程。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:检测待分配执行锁的其它线程;若检测到待分配执行锁的其它线程,则将执行锁分配给其它线程,并基于已分配执行锁的其它线程运行第二协程;若未检测到待分配执行锁的其它线程,则执行创建新线程的步骤。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:当第二协程运行结束时,检测目标线程的状态变化,得到检测结果;若基于检测结果确定目标线程从停止状态进入等待状态,则执行终止新线程的步骤;若基于检测结果确定目标线程未从停止状态进入等待状态,则基于已分配执行锁的新线程运行其它协程。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:当检测到目标线程进入了用于等待执行锁的等待队列时,确定目标线程的状态发生变化,得到表示发生状态变化的检测结果;当未检测到目标线程进入用于等待执行锁的等待队列时,确定目标线程的状态未发生变化,得到表示状态未发生变化的检测结果。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:在新线程中插入内存屏障指令,以使第二协程在运行时所形成的缓存数据更新到中央处理器对应的本地缓存;释放新线程的执行锁,并将释放的执行锁分配给目标线程。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:创建目标线程;通过协程调度器调度第一协程,并在目标线程中运行第一协程,以通过运行的第一协程执行任务队列中的待执行任务;当待执行任务执行中止时,将第一协程向第二协程进行切换。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:通过协程调度器从协程集合中调度第二协程;对第一协程进行协程切换操作,以切换至第二协程。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:从协程资源池中,选取访问相同资源、且具有内存可见性要求的协程组成协程集合;其中,第一协程和第二协程均属于协程集合。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:获取第一协程停止运行时保存的运行数据;在目标线程中基于运行数据继续运行第一协程。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:当目标线程中运行的第一协程因占用目标线程绑定的资源而引起向第二协程切换产生异常时,将目标线程和第一协程置为停止状态;创建新线程,并将目标线程的执行锁分配给新线程;基于已分配执行锁的新线程运行第二协程;当第二协程运行结束、且目标线程由停止状态进入等待状态时,终止新线程,并将新线程的执行锁释放给目标线程;通过目标线程继续运行第一协程。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:在目标线程中插入内存屏障指令,以使第一协程在运行时所形成的缓存数据更新到中央处理器对应的本地缓存;释放目标线程的执行锁;将目标线程的执行锁分配给新线程包括:将目标线程释放的执行锁分配给新线程。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:检测待分配执行锁的其它线程;若检测到待分配执行锁的其它线程,则将执行锁分配给其它线程,并基于已分配执行锁的其它线程运行第二协程;若未检测到待分配执行锁的其它线程,则执行创建新线程的步骤。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当第二协程运行结束时,检测目标线程的状态变化,得到检测结果;若基于检测结果确定目标线程从停止状态进入等待状态,则执行终止新线程的步骤;若基于检测结果确定目标线程未从停止状态进入等待状态,则基于已分配执行锁的新线程运行其它协程。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当检测到目标线程进入了用于等待执行锁的等待队列时,确定目标线程的状态发生变化,得到表示发生状态变化的检测结果;当未检测到目标线程进入用于等待执行锁的等待队列时,确定目标线程的状态未发生变化,得到表示状态未发生变化的检测结果。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:在新线程中插入内存屏障指令,以使第二协程在运行时所形成的缓存数据更新到中央处理器对应的本地缓存;释放新线程的执行锁,并将释放的执行锁分配给目标线程。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:创建目标线程;通过协程调度器调度第一协程,并在目标线程中运行第一协程,以通过运行的第一协程执行任务队列中的待执行任务;当待执行任务执行中止时,将第一协程向第二协程进行切换。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:通过协程调度器从协程集合中调度第二协程;对第一协程进行协程切换操作,以切换至第二协程。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:从协程资源池中,选取访问相同资源、且具有内存可见性要求的协程组成协程集合;其中,第一协程和第二协程均属于协程集合。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取第一协程停止运行时保存的运行数据;在目标线程中基于运行数据继续运行第一协程。
在一个实施例中,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-Only Memory,ROM)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic Random Access Memory,DRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (15)
1.一种协程运行方法,其特征在于,所述方法包括:
当目标线程中运行的第一协程因占用所述目标线程绑定的资源而引起向第二协程切换产生异常时,将所述目标线程和所述第一协程置为停止状态;
创建新线程,并将所述目标线程的执行锁分配给所述新线程;
基于已分配所述执行锁的所述新线程运行所述第二协程;
当所述第二协程运行结束、且所述目标线程由所述停止状态进入等待状态时,终止所述新线程,并将所述新线程的所述执行锁释放给所述目标线程;
通过所述目标线程继续运行所述第一协程。
2.根据权利要求1所述的方法,其特征在于,所述创建新线程之前,所述方法还包括:
在所述目标线程中插入内存屏障指令,以使所述第一协程对应的缓冲区内缓存的运行数据更新到中央处理器对应的内存区;
释放所述目标线程的执行锁;
所述将所述目标线程的执行锁分配给所述新线程包括:
将所述目标线程释放的执行锁分配给所述新线程。
3.根据权利要求1所述的方法,其特征在于,所述创建新线程之前,所述方法还包括:
检测待分配所述执行锁的其它线程;
若检测到待分配所述执行锁的其它线程,则将所述执行锁分配给所述其它线程,并基于已分配所述执行锁的所述其它线程运行所述第二协程;
若未检测到待分配所述执行锁的其它线程,则执行所述创建新线程的步骤。
4.根据权利要求1所述的方法,其特征在于,所述当所述第二协程运行结束、且所述目标线程由所述停止状态进入等待状态时,终止所述新线程包括:
当所述第二协程运行结束时,检测所述目标线程的状态变化,得到检测结果;
若基于所述检测结果确定所述目标线程从所述停止状态进入所述等待状态,则执行所述终止所述新线程的步骤;
所述方法还包括:
若基于所述检测结果确定所述目标线程未从所述停止状态进入所述等待状态,则基于已分配所述执行锁的所述新线程运行其它协程。
5.根据权利要求4所述的方法,其特征在于,所述检测所述目标线程的状态变化,得到检测结果包括:
当检测到所述目标线程进入了用于等待所述执行锁的等待队列时,确定所述目标线程的状态发生变化,得到表示发生状态变化的检测结果;
当未检测到所述目标线程进入用于等待所述执行锁的等待队列时,确定所述目标线程的状态未发生变化,得到表示状态未发生变化的检测结果。
6.根据权利要求1所述的方法,其特征在于,所述终止所述新线程之前,所述方法还包括:
在所述新线程中插入内存屏障指令,以使所述第二协程对应的缓冲区内缓存的运行数据更新到中央处理器对应的内存区;
所述将所述新线程的所述执行锁释放给所述目标线程包括:
释放所述新线程的执行锁,并将释放的所述执行锁分配给所述目标线程。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
创建所述目标线程;
通过协程调度器调度所述第一协程,并在所述目标线程中运行所述第一协程,以通过运行的所述第一协程执行任务队列中的待执行任务;
当所述待执行任务执行中止时,将所述第一协程向所述第二协程进行切换。
8.根据权利要求7所述的方法,其特征在于,所述将所述第一协程向所述第二协程进行切换包括:
通过所述协程调度器从协程集合中调度所述第二协程;
对所述第一协程进行协程切换操作,以切换至所述第二协程。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
从协程资源池中,选取访问相同资源、且具有内存可见性要求的协程组成所述协程集合;
其中,所述第一协程和所述第二协程均属于所述协程集合。
10.根据权利要求1所述的方法,其特征在于,所述通过所述目标线程继续运行所述第一协程包括:
获取所述第一协程停止运行时保存的运行数据;
在所述目标线程中基于所述运行数据继续运行所述第一协程。
11.一种协程运行装置,其特征在于,所述装置包括:
设置模块,用于当目标线程中运行的第一协程因占用所述目标线程绑定的资源而引起向第二协程切换产生异常时,将所述目标线程和所述第一协程置为停止状态;
创建模块,用于创建新线程,并将所述目标线程的执行锁分配给所述新线程;
运行模块,用于基于已分配所述执行锁的所述新线程运行所述第二协程;
终止模块,当所述第二协程运行结束、且所述目标线程由所述停止状态进入等待状态时,用于终止所述新线程,并将所述新线程的所述执行锁释放给所述目标线程;
所述运行模块,还用于通过所述目标线程继续运行所述第一协程。
12.根据权利要求11所述的装置,其特征在于,所述装置还包括:
插入模块,用于在所述目标线程中插入内存屏障指令,以使所述第一协程在运行时所形成的缓存数据更新到主内存;
释放模块,用于释放所述目标线程的执行锁;
所述创建模块,还用于将所述目标线程释放的执行锁分配给所述新线程。
13.根据权利要求11所述的装置,其特征在于,所述装置还包括:
检测模块,用于检测待分配所述执行锁的其它线程;
所述运行模块,若检测到待分配所述执行锁的其它线程,则还用于将所述执行锁分配给所述其它线程,并基于已分配所述执行锁的所述其它线程运行所述第二协程;
所述创建模块,若未检测到待分配所述执行锁的其它线程,则还用于执行所述创建新线程的步骤。
14.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至12中任一项所述的方法的步骤。
15.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至12中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110593076.XA CN115408117A (zh) | 2021-05-28 | 2021-05-28 | 协程运行方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110593076.XA CN115408117A (zh) | 2021-05-28 | 2021-05-28 | 协程运行方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115408117A true CN115408117A (zh) | 2022-11-29 |
Family
ID=84155013
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110593076.XA Pending CN115408117A (zh) | 2021-05-28 | 2021-05-28 | 协程运行方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115408117A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820786A (zh) * | 2023-08-31 | 2023-09-29 | 本原数据(北京)信息技术有限公司 | 数据库的数据访问方法和装置、电子设备、存储介质 |
CN116959289A (zh) * | 2023-09-21 | 2023-10-27 | 山东通维信息工程有限公司 | 一种基于车路协同技术的智慧停车系统及方法 |
-
2021
- 2021-05-28 CN CN202110593076.XA patent/CN115408117A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820786A (zh) * | 2023-08-31 | 2023-09-29 | 本原数据(北京)信息技术有限公司 | 数据库的数据访问方法和装置、电子设备、存储介质 |
CN116820786B (zh) * | 2023-08-31 | 2023-12-19 | 本原数据(北京)信息技术有限公司 | 数据库的数据访问方法和装置、电子设备、存储介质 |
CN116959289A (zh) * | 2023-09-21 | 2023-10-27 | 山东通维信息工程有限公司 | 一种基于车路协同技术的智慧停车系统及方法 |
CN116959289B (zh) * | 2023-09-21 | 2024-03-22 | 山东通维信息工程有限公司 | 一种基于车路协同技术的智慧停车系统及方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10241831B2 (en) | Dynamic co-scheduling of hardware contexts for parallel runtime systems on shared machines | |
US6622155B1 (en) | Distributed monitor concurrency control | |
US7650602B2 (en) | Parallel processing computer | |
US8392925B2 (en) | Synchronization mechanisms based on counters | |
US9436510B2 (en) | System and method for managing the interleaved execution of threads | |
JP2866241B2 (ja) | コンピュータシステムおよびスケジューリング方法 | |
US9201689B2 (en) | Software emulation of massive hardware threading for tolerating remote memory references | |
CN108694199A (zh) | 数据同步装置、方法、存储介质及电子设备 | |
JPH1055284A (ja) | スレッドをスケジュールする方法及びそのシステム | |
TWI460659B (zh) | 用於降低競爭之鎖定窗 | |
US20110154346A1 (en) | Task scheduler for cooperative tasks and threads for multiprocessors and multicore systems | |
US20150254113A1 (en) | Lock Spin Wait Operation for Multi-Threaded Applications in a Multi-Core Computing Environment | |
CN115408117A (zh) | 协程运行方法、装置、计算机设备和存储介质 | |
US9047121B2 (en) | System and method for scheduling jobs in a multi-core processor | |
CN111459622B (zh) | 调度虚拟cpu的方法、装置、计算机设备和存储介质 | |
US7765548B2 (en) | System, method and medium for using and/or providing operating system information to acquire a hybrid user/operating system lock | |
CN115562838A (zh) | 资源调度方法、装置、计算机设备及存储介质 | |
Al-Bayati et al. | Partitioning and selection of data consistency mechanisms for multicore real-time systems | |
US20150212859A1 (en) | Graphics processing unit controller, host system, and methods | |
US20040039884A1 (en) | System and method for managing the memory in a computer system | |
JP7346649B2 (ja) | 同期制御システムおよび同期制御方法 | |
US11645124B2 (en) | Program execution control method and vehicle control device | |
US9367326B2 (en) | Multiprocessor system and task allocation method | |
CN112749020A (zh) | 一种物联网操作系统的微内核优化方法 | |
CN113760524A (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 |