CN116266143A - 协程管理方法、装置、设备及介质 - Google Patents
协程管理方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN116266143A CN116266143A CN202111551898.8A CN202111551898A CN116266143A CN 116266143 A CN116266143 A CN 116266143A CN 202111551898 A CN202111551898 A CN 202111551898A CN 116266143 A CN116266143 A CN 116266143A
- Authority
- CN
- China
- Prior art keywords
- thread
- lock
- coroutine
- holder
- cooperative
- 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
- 238000007726 management method Methods 0.000 title claims abstract description 41
- 238000000034 method Methods 0.000 claims abstract description 39
- 238000004590 computer program Methods 0.000 claims description 9
- 230000000903 blocking effect Effects 0.000 description 14
- 238000012545 processing Methods 0.000 description 9
- 238000010586 diagram Methods 0.000 description 8
- 230000004048 modification Effects 0.000 description 6
- 238000012986 modification Methods 0.000 description 6
- 230000008569 process Effects 0.000 description 6
- 230000006978 adaptation Effects 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 230000001360 synchronised effect Effects 0.000 description 3
- 230000009471 action Effects 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000007717 exclusion Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
-
- 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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种协程管理方法、装置、设备及介质,涉及操作系统领域。所述方法包括:接收第一协程的线程锁申请,线程锁申请用于请求获取第一线程的线程锁,第一线程是运行第一协程的线程;获取第一线程的线程锁的持有者,线程锁的持有者的标记单位是协程;根据第一线程的线程锁的持有者,将第一线程的线程锁授予第一协程;其中,第一线程的线程锁用于锁定第一协程所使用的资源。
Description
技术领域
本申请涉及操作系统领域,特别涉及一种协程管理方法、装置、设备及介质。
背景技术
在操作系统中,线程是进程的一个实体,进程是资源拥有的基本单位。线程是中央处理器(Central Processing Unit,CPU)调度和分派的基本单位。一个线程上可以运行多个协程,协程是一种用户态的轻量级线程,协程的调度由用户控制。其中,在同一时刻下,一个线程上仅运行一个协程。
为避免出现资源抢占,引入锁机制,不同的资源对应有不同的锁。操作系统中通常使用线程锁,线程锁是以线程为单位进行标记的锁。第一协程在第一线程上运行时,第一协程可以申请获取第一线程的线程锁,以锁定该线程锁对应的资源。
相关技术中规定,在以线程为单位标记不同的锁的情况下,第一协程无法实现协程切换操作,此时的第一协程将独占第一线程,从而使得第一线程处于阻塞状态。
发明内容
本申请实施例提供了一种协程管理方法、装置、设备及介质,将线程锁的标记单位修改为协程,使得持有第一线程的线程锁的第一协程能够实现协程切换操作,以避免第一协程独占第一线程的问题。所述技术方案如下:
根据本申请的一个方面,提供了一种协程管理方法,该方法包括:
接收第一协程的线程锁申请,线程锁申请用于请求获取第一线程的线程锁,第一线程是运行第一协程的线程;
获取第一线程的线程锁的持有者,线程锁的持有者的标记单位是协程;
根据第一线程的线程锁的持有者,将第一线程的线程锁授予第一协程;
其中,第一线程的线程锁用于锁定第一协程所使用的资源。
可选的,根据线程锁的持有者,将第一线程的线程锁授予第一协程,包括如下步骤中的至少一个:在第一线程的线程锁没有持有者的情况下,将第一协程标记为线程锁的持有者,将第一线程的线程锁授予第一协程;或,在第一线程的线程锁的持有者是第一协程的情况下,将第一线程的线程锁授予第一协程。
可选的,该方法还包括:在第一线程的线程锁的持有者是第一协程的情况下,从第一协程切换到第二协程。
可选的,该方法还包括:在第一线程的线程锁的持有者不是第一协程的情况下,拒绝将第一线程的线程锁授予第一协程。
可选的,该方法还包括:在拒绝将第一线程的线程锁授予第一协程的情况下,将第三协程从第一线程切换至第二线程运行,第三协程是第一线程上除第一协程之外的协程。
可选的,该方法还包括:在拒绝将第一线程的线程锁授予第一协程的情况下,将第一线程从可用状态切换为阻塞状态。
可选的,该方法还包括:在处于可用状态的线程符合预设条件的情况下,创建第三线程。
可选的,在处于可用状态的线程符合预设条件的情况下,创建第三线程,包括:获取处于可用状态的线程的数量;在处于可用状态的线程的数量符合预设条件的情况下,创建第三线程。
可选的,预设条件包括:处于可用状态的线程的数量小于目标线程的个数的一半。
可选的,该方法还包括:将第一线程的线程锁的持有者的标记单位修改为协程。
根据本申请的一个方面,提供了一种协程管理装置,该装置包括:
接收模块,用于接收第一协程的线程锁申请,线程锁申请用于请求获取第一线程的线程锁,第一线程是运行第一协程的线程;
获取模块,用于获取第一线程的线程锁的持有者,线程锁的持有者的标记单位是协程;
授予模块,用于根据第一线程的线程锁的持有者,将第一线程的线程锁授予第一协程;
其中,第一线程的线程锁用于锁定第一协程所使用的资源。
可选的,授予模块,用于在第一线程的线程锁没有持有者的情况下,将第一协程标记为线程锁的持有者,将第一线程的线程锁授予第一协程;或,在第一线程的线程锁的持有者是第一协程的情况下,将第一线程的线程锁授予第一协程。
可选的,该装置还包括切换模块,用于在第一线程的线程锁的持有者是第一协程的情况下,从第一协程切换到第二协程。
可选的,授予模块,还用于在第一线程的线程锁的持有者不是第一协程的情况下,拒绝将第一线程的线程锁授予第一协程。
可选的,切换模块,还用于在拒绝将第一线程的线程锁授予第一协程的情况下,将第一协程从第一线程切换至第二线程运行。
可选的,切换模块,还用于在拒绝将第一线程的线程锁授予第一协程的情况下,将第一线程从可用状态切换为阻塞状态。
可选的,该装置还包括创建模块,用于在处于可用状态的线程符合预设条件的情况下,创建第三线程。
可选的,创建模块,用于获取处于可用状态的线程的数量;在处于可用状态的线程的数量符合预设条件的情况下,创建第三线程。
可选的,预设条件包括:处于可用状态的线程的数量小于目标线程的个数的一半。
可选的,该装置还包括修改模块,用于将第一线程的线程锁的持有者的标记单位修改为协程。
根据本申请的一个方面,提供了一种计算机设备,该计算机设备包括处理器;
处理器,用于接收第一协程的线程锁申请,线程锁申请用于请求获取第一线程的线程锁,第一线程是运行第一协程的线程;
获取第一线程的线程锁的持有者,线程锁的持有者的标记单位是协程;
根据第一线程的线程锁的持有者,将第一线程的线程锁授予第一协程;
其中,第一线程的线程锁用于锁定第一协程所使用的资源。
根据本申请的一个方面,提供了一种计算机可读存储介质,存储介质中存储有计算机程序,所述计算机程序用于被处理器执行,以实现如上所述的协程管理方法。
根据本申请的一个方面,提供了一种计算机程序产品或计算机程序,计算机程序产品或计算机程序包括计算机指令,计算机指令存储在计算机可读存储介质中,处理器从计算机可读存储介质读取并执行计算机指令,以实现如上所述的协程管理方法。
本申请实施例提供的技术方案带来的有益效果至少包括:
在第一线程的线程锁的持有者的标记单位是协程的前提下,根据线程锁的持有者,将第一线程的线程锁授予第一协程,以使得持有该线程锁的第一协程能够实现协程切换操作,从而避免第一协程独占第一线程,减少第一协程的适配工作。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请一个示例性实施例提供的协程管理方法的流程图;
图2是本申请一个示例性实施例提供的协程管理方法的流程图;
图3是本申请一个示例性实施例提供的协程切换的示意图;
图4是本申请一个示例性实施例提供的协程管理方法的流程图;
图5是本申请一个示例性实施例提供的协程管理方法的流程图;
图6是本申请一个示例性实施例提供的调度器的示意图;
图7是本申请一个示例性实施例提供的协程管理装置的示意图;
图8是本申请一个示例性实施例提供的服务器的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
首先,对本申请实施例中涉及的名词进行简单介绍:
线程:线程是进程的一个实体,进程是资源拥有的基本单位,线程是中央处理器(Central Processing Unit,CPU)调度和分派的基本单位。
协程:是一种用户态的轻量级线程,协程的调度由用户控制。多个协程可以运行在同一个线程上;在同一时刻下,一个线程上仅运行一个协程。
线程锁:为避免出现资源抢占,引入锁机制,不同的资源对应有不同的锁。相关技术中的操作系统中通常使用线程锁,此处的线程锁通常是以线程为单位进行标记的锁。
应当理解的是,本申请涉及的线程锁与相关技术中的线程锁的持有者的标记单位不同,本申请所有实施例中涉及的线程锁的持有者的标记单位均是协程,以下实施例均以线程锁的持有者的标记单位是协程为前提,不再赘述。
处于可用状态的线程:又可称之为可用线程,是指能够运行协程的线程。相应的,处于不可用状态的线程是指不能够运行协程的线程,又可称之为处于阻塞状态的线程,或者可称之为不可用线程。
类似死锁状态:由于调度器中没有处于可用状态的线程,导致业务系统没有可用的CPU资源,从而使得系统卡住的状态。
在操作系统中,存在线程切换和协程切换。
在发生输入输出、资源竞争导致的线程阻塞后,操作系统需要执行线程切换操作,此时存在额外的开销。示意性的,线程切换时间大约在1-10us的数量级,线程切换需要进入内核态完成,通过上下文切换(context switch)实现寄存器的值的保存和恢复,随后返回到用户态执行新的线程。
示意性的,线程切换包括如下步骤:
步骤一,切换进入内核态;
步骤二,保存寄存器的值;
步骤三,恢复目标线程的寄存器的值;
步骤四,返回用户态以执行新的线程。
其中,上下文切换包括步骤二和步骤三,用于实现寄存器的指的保存和恢复。
相较于线程切换,协程切换不需要进入内核态,也不需要在切换结束后返回到用户态,其切换操作均在用户态完成。
在协程切换的上下文切换过程中,仅需保存少量寄存器的值,比如,保存栈寄存器的值和协程相关的其他信息。基于此,协程切换相较于线程切换能够减少额外的开销。
以线程锁的持有者的标记单位是线程为例。
根据相关技术规定,在协程持有线程的线程锁时若发生协程切换,协程无法实现协程切换操作,从而独占线程,导致线程处于阻塞状态。
其中,协程切换操作,是指协程从运行状态切换出去以使得该协程不占用线程的动作,协程切换操作可使用yield表示;协程无法实现协程切换而导致协程独占所使用的线程的动作,可用pin表示。
基于此,本申请实施例提供了一种协程管理方法,以使得持有线程锁的协程能够实现协程切换,避免出现线程阻塞的情况出现。
示意性的,线程锁的持有者的标记单位是协程,图1示出了本申请一个示例性实施例提供的协程管理方法的流程图,可由CPU执行,该方法包括如下步骤:
步骤101:接收第一协程的线程锁申请。
示意性的,线程锁申请用于请求获取第一线程的线程锁,第一线程是运行第一协程的线程,第一线程的线程锁用于锁定第一协程所使用的资源。
其中,一个线程上可运行多个协程,同一时刻下,一个线程上仅可运行一个协程,不能同时在一个线程上运行多个协程;一个协程可在不同的线程上运行,同一时刻下,一个协程只能在一个线程上运行,不能同时在多个不同的线程上运行。
比如,线程0上可运行协程1和协程2,在同一时刻下,线程0上仅可运行协程1或协程2;除此之外,协程1还可以在线程1上运行,在同一时刻下,协程1仅能在线程0或线程1上运行。
为避免出现资源抢占,引入锁机制,不同的资源对应有不同的锁。示意性的,第一线程的线程锁用于锁定第一协程所使用的资源。其中,线程锁的数量受资源数量的影响,不受线程数量的影响。可选的,一个资源对应有一个线程锁,一个线程可以对应有多个线程锁。
第一协程在第一线程上运行时,可以申请第一线程的线程锁,也可以不申请第一线程的线程锁。相当于,第一协程在第一线程上的运行不受线程锁的限制,第一协程可以在持有线程锁的情况下运行,也可以在不持有线程锁的情况下运行。可选的,在第一协程需要执行同步互斥的代码时,向CPU发送线程锁申请以请求获取第一线程的线程锁;在获取到第一线程的线程锁后,第一协程锁定对应的资源。
步骤102:获取第一线程的线程锁的持有者。
示意性的,线程锁的持有者的标记单位是协程。
相关技术中,线程锁的持有者的标记单位是线程,在持有线程锁的协程从运行状态中进行切换时,协程将无法实现协程切换操作,从而导致该协程所在的线程处于阻塞状态。
而本申请实施例中,将线程锁的持有者的标记单位修改为协程,使得持有线程锁的第一协程成为一个类似于线程的存在,第一协程与其他协程之间的关系可类比不同线程之间的关系,此时的第一协程能够实现协程切换操作,从而避免第一协程无法实现协程切换操作而导致第一线程阻塞。
可选的,本申请实施例提供的协程管理方法,还包括如下:
将第一线程的线程锁的持有者的标记单位修改为协程。
根据前述内容,相关技术中的线程锁的持有者的标记单位是线程,基于此,本申请实施例可对线程锁的标记单位进行修改,以使得持有线程锁的协程能够实现协程切换操作。
可选的,标记单位的修改在步骤102之前执行。
由于不同的线程锁对应的是不同的资源,在对标记单位进行修改时,可对所有线程锁的持有者的标记单位同时进行修改,也可对第一协程申请的线程锁的持有者的标记单位进行修改。
可选的,步骤将第一线程的线程锁的持有者的标记单位修改为协程可实现为如下:
将第一线程对应的至少两个线程锁的持有者的标记单位修改为协程;
或者,在第一协程申请第一线程的第一线程锁的情况下,将第一线程锁的持有者的标记单位修改为协程。
其中,第一线程锁是第一线程对应的至少两个线程锁中的一个。
可选的,至少两个线程锁包括第一线程对应的所有线程锁。
以第一线程有线程锁1、线程锁2和线程锁3,第一协程申请获取线程锁1为例。此时,标记单位的修改可以实现为如下两种方式中的一种:
实现方式一:同时将线程锁1、线程锁2和线程锁3的持有者的标记单位修改为协程;
实现方式二:在第一协程申请获取线程锁1的情况下,将线程锁1的持有者的标记单位修改为协程。
示意性的,管理人员对底层代码进行修改,以使得线程锁的持有者的标记单位从线程修改为协程。对底层代码的修改,能够以较小的工作量实现线程锁的持有者的标记单位的切换;在业务代码的执行过程中,将以线程锁的持有者的标记单位是协程为前提,从而无需对业务代码进行同步修改,即可使得持有线程锁的协程实现协程切换,且不会阻塞所在的线程。
应当理解的是,在本申请实施例中,线程锁的持有者的标记单位是协程。
步骤103:根据第一线程的线程锁的持有者,将第一线程的线程锁授予第一协程。
其中,第一线程的线程锁的持有者的标记单位是协程,关于线程锁的持有者的标记单位的描述可参考前述内容,不再赘述。
在将第一线程的线程锁授予第一协程后,第一协程能够锁定该线程锁对应的资源,第一协程能够使用该资源,且其他协程将不再能够使用该资源,直至第一协程将该资源释放。在第一协程将该资源释放后,第一协程将不再持有对应的线程锁,该线程锁可根据其他协程的线程锁申请重新被授予给其他协程,以使得其他协程能够锁定对应的资源。
在线程锁的持有者的标记单位是协程这一前提下,第一线程的线程锁的持有者包括如下几种可选的情况:
第一线程的线程锁没有持有者;
第一线程的线程锁的持有者是第一线程;
第一线程的线程锁的持有者是除第一线程之外的其他线程。
其中,还可以将第三种情况认定为第一线程的线程锁的持有者不是第一线程的情况。
根据第一线程的线程锁的持有者的不同情况,可将第一线程的线程锁授予第一协程。比如,在第一线程的线程锁没有持有者的情况下,将第一线程的线程锁授予第一协程;又如,在第一线程的线程锁的持有者是第一线程的情况下,将第一项的线程锁授予第一协程。
综上所述,本申请实施例提供的协程管理方法,在第一线程的线程锁的持有者的标记单位是协程的前提下,根据第一线程的线程锁的持有者,将该线程锁授予第一协程,以使得持有该线程锁的第一协程能够实现协程切换操作,从而避免第一协程独占第一线程,减少第一协程的适配工作。
图2示出了本申请一个示例性实施例提供的协程管理方法的流程图,可由CPU执行,该方法包括如下步骤:
步骤201:接收第一协程的线程锁申请。
示意性的,线程锁申请用于请求获取第一线程的线程锁,第一线程是运行第一协程的线程,第一线程的线程锁用于锁定第一协程所使用的资源。
其中,第一协程在第一线程上运行时,可以申请第一线程的线程锁,也可以不申请第一线程的线程锁。可选的,在第一协程需要执行同步互斥的代码时,向CPU发送线程锁申请以请求获取第一线程的线程锁;在获取到第一线程的线程锁后,第一协程锁定对应的资源。
示意性的,步骤201与步骤101相同,可作参考,不再赘述。
步骤202:获取第一线程的线程锁的持有者。
示意性的,线程锁的持有者的标记单位是协程,关于线程锁的持有者的标记单位的描述可参考前述内容,不再赘述。
可选的,在步骤202之前,还可以执行如下步骤:将第一线程的线程锁的持有者的标记单位修改为协程。
根据前述内容,相关技术中的线程锁的持有者的标记单位是线程,基于此,本申请实施例可对线程锁的标记单位进行修改,以使得持有线程锁的协程能够实现协程切换操作。
由于不同的线程锁对应的是不同的资源,在对标记单位进行修改时,可对所有线程锁的持有者的标记单位同时进行修改,也可对第一协程申请的线程锁的持有者的标记单位进行修改。
可选的,管理人员可对底层代码进行修改,以使得线程锁的持有者的标记单位从线程修改为协程。
应当理解的是,在本申请实施例中,线程锁的持有者的标记单位是协程。
示意性的,步骤202与步骤102相同,可作参考,不再赘述。
步骤203:判断第一线程的线程锁是否有持有者。
其中,第一线程的线程锁的持有者的标记单位是协程。
在第一线程的线程锁没有持有者的情况下,执行步骤204;在第一线程的线程锁有持有者的情况下,执行步骤205。步骤204和步骤205择一执行,不可同时执行。
步骤204:在第一线程的线程锁没有持有者的情况下,将第一协程标记为线程锁的持有者。
其中,第一线程的线程锁的持有者的标记单位是协程。
在第一线程的线程锁没有持有者的情况下,该线程锁对应的资源没有被任一协程锁定,则该资源处于可以使用的状态。基于此,在接收到第一协程的线程锁申请后,可将第一协程标记为第一线程的线程锁的持有者,以使得第一协程能够锁定该线程锁对应的资源。
步骤205:在第一线程的线程锁有持有者的情况下,判断第一线程的线程锁的持有者是否为第一协程。
在第一线程的线程锁的持有者是第一协程的情况下,执行步骤206;在第一线程的线程锁的持有者不是第一协程的情况下,执行步骤207。步骤206和步骤207择一执行,不可同时执行。其中,步骤204之后也可执行步骤206。
步骤206:将第一线程的线程锁授予第一协程。
示意性的,步骤206可基于两个可选的前提来执行,两个可选的前提包括:第一线程的线程锁没有持有者的情况下,将第一协程标记为线程锁的持有者;或者,第一线程的线程锁的持有者是第一协程的情况下。其中,在第一线程的线程锁的持有者是第一协程的情况下,第一协程获取第一线程的线程锁的过程又可称之为锁重入。
基于此,将第一线程的线程锁授予第一协程,以使得第一协程能够锁定对应的资源。随后,第一协程能够使用该资源,且其他协程将不再能够使用该资源,直至第一协程将该资源释放。
在第一协程将该资源释放后,第一协程将不再持有对应的线程锁,该线程锁可根据其他协程的线程锁申请重新被授予给其他协程,以使得其他协程能够锁定对应的资源。
步骤207:在第一线程的线程锁的持有者不是第一协程的情况下,拒绝将第一线程的线程锁授予第一协程。
在第一线程的线程锁的持有者不是第一协程的情况下,线程锁对应的资源被其他协程锁定,此时若将第一线程的线程锁授予第一协程,则将导致一个资源在同一时刻被两个不同的协程使用的问题。基于此,在第一线程的线程锁的持有者不是第一协程的情况下,拒绝将第一线程的线程锁授予第一协程。
此时,第一线程进入等待状态,直至线程锁对应的资源被释放后,该线程锁不在被其他协程所持有时,第一线程能够获取到该线程锁,从而锁定该线程锁对应的资源。
可选的,在拒绝将第一线程的线程锁授予第一协程的情况下,本申请实施例提供的协程管理方法还包括如下步骤中的至少一个:
将第三协程从第一线程切换至第二线程运行,所述第三协程是所述第一线程上除所述第一协程之外的协程;
和/或,将第一线程从可用状态切换为阻塞状态。
根据前述内容,第一协程未获取到第一线程的线程锁时,第一协程进入等待状态,此时第一协程将独占第一线程,导致第一线程处于阻塞状态。
在第一线程处于阻塞状态的情况下,CPU可执行线程切换操作,从第三线程切换到第二线程。可选的,在执行线程切换操作后,可将第三协程切换到第二线程上运行,以使得第三协程完成代码的执行,第三协程是第一线程上除第一协程之外的协程。
以第一线程是线程0,第一协程是协程1为例,线程0上可运行协程1、协程2和协程3。在拒绝将线程0的线程锁授予协程1的情况下,将协程2和协程3切换到线程1上运行,线程1是与线程0不同的线程,以保证协程2和协程3的运行不受影响。
根据本申请实施例提供的协程管理方法,在第一线程的线程锁的持有者的标记单位是协程的前提下,持有线程锁的协程能够实现协程切换操作,且不导致第一线程的阻塞。基于此,本申请实施例提供的协程管理方法,还可选的包括如下步骤:
在第一线程的线程锁的持有者是第一协程的情况下,从第一协程切换到第二协程。
根据前述内容,线程锁的持有者的标记单位是协程,则在第一协程持有第一线程的线程锁的情况下,第一协程能够实现协程切换操作,比如,从第一协程切换到第二协程。
图3示出了本申请一个示例性实施例提供的协程切换的示意图,根据本申请实施例提供的协程管理方法,能够使得第一协程实现协程切换操作,从运行状态切换出去(yield),从而避免第一协程独占第一线程(Pin)而导致的线程阻塞。
其中,线程0和线程1是不同的线程,协程0、协程1和协程2是不同的协程。示意性的,协程0、协程1和协程2可以在线程0上运行,或者在线程1上运行。
以线程0是第一线程,协程0是第一协程为例,协程0持有线程0的线程锁,图3中给出了两种协程0的切换情形:
1、在线程锁的持有者的标记单位为线程的情况下。
由于协程0持有线程0的线程锁,协程0无法实现协程切换操作,从而导致协程0Pin住线程0。此时,操作系统需要执行线程切换,通过上下文切换,将第一线程从线程0切换到线程1,此时的第一协程也将从协程0切换到协程1。
该种切换情形下,协程Pin住线程,此时的协程退化为线程,协程不再具有协程的优势,将使得协程切换改变为线程切换,线程切换增加了切换开销;同时也使得处于可用状态的线程的数量减少,最终导致系统的吞吐量下降。
2、线程锁的持有者的标记单位为线程的情况下。
协程0持有线程0的线程锁,协程0可以实现yield操作,避免了协程0Pin住线程0。
以第二协程是协程1为例,在该种切换场景下,可以从协程0切换到协程1。该种切换情形下,同一线程中的不同协程可实现互相切换,从而减少了协程的适配工作,不需要增加额外的切换开销。
示意性的,上述实施例可组合实现,在此不再赘述。
综上所述,本申请实施例提供的协程管理方法,在第一线程的线程锁的持有者的标记单位是协程的前提下,根据第一线程的线程锁的持有者的不同,可将线程锁授予第一协程,或者拒绝将线程锁授予第一协程。
可选的,在第一线程的线程锁的持有者是第一协程的情况下,可从第一协程切换到第二协程;在拒绝将第一线程的线程锁授予第一协程的情况下,可将第一协程从第一线程切换至第二线程运行,和/或,将第一线程从可用状态切换为阻塞状态。
在操作系统中,由于线程存在阻塞的可能性,将导致处于可用状态的线程的数量可能会降为0个。此时,由于调度器中没有处于可用状态的线程,将导致业务系统没有可用的CPU资源,从而使得系统卡住的状态,这一状态可称之为类似死锁状态。
本申请实施例提供的协程管理方法,通过创建第三线程,能够避免类似死锁状态的出现。
基于图1,图4示出了本申请一个示例性实施例提供的协程管理方法的流程图,可由CPU执行,该方法还包括如下步骤:
步骤104:在处于可用状态的线程符合预设条件的情况下,创建第三线程。
其中,处于可用状态的线程,又可称之为可用线程,是指能够运行协程的线程。相应的,处于不可用状态的线程是指不能够运行协程的线程,又可称之为处于阻塞状态的线程,或者可称之为不可用线程。
示意性的,预设条件可根据处于可用状态的线程的相关信息确定。比如,根据处于可用状态的线程的数量确定预设条件。
根据前述内容,在操作系统中存在线程阻塞的可能。当某一线程处于阻塞状态时,或者,当某一线程从阻塞状态变为可用状态时,将导致处于可用状态的线程的数量变化。
可选的,步骤104可实现为如下:
获取处于可用状态的线程的数量;
在处于可用状态的线程的数量符合预设条件的情况下,创建第三线程。
其中,处于可用状态的线程的数量,又可称之为可用线程个数,是指能够运行协程的线程的个数。
在本申请实施例提供的协程管理方法中,在拒绝将第一线程的线程锁授予第一协程的情况下,第一协程将阻塞第一线程,从而导致处于可用状态的线程的数量发生变化。
为避免处于可用状态的线程的数量减少至0,在第一协程阻塞第一线程之前,可执行步骤104,以使得操作系统中至少存在一个处于可用状态的线程,避免进入类似死锁状态。
可选的,预设条件包括:处于可用状态的线程的数量小于目标线程的个数的一半。
其中,目标线程的个数可根据CPU确定,或者,目标线程的个数根据实际需要进行调整。
可选的,在目标线程的个数根据CPU确定的情况下,目标线程的个数可根据CPU的个数确定。比如,目标线程的个数是CPU的个数的两倍。
根据前述内容,在拒绝将第一线程的线程锁授予第一协程后,第一协程进入等待状态,第一线程被阻塞;随后,在第一协程能够获取到线程锁的情况下,第一线程可恢复为可用状态。此时,处于可用状态的线程的数量将增加。
以采用调度器进行任务分配为例,当某一线程的等待使用的时长超过预设值的情况下,调度器可自行回收该线程;或者,当处于可用状态的线程的数量超过预设值的情况下,调度器可自行回收多余的线程。
基于图2,图5示出了本申请一个示例性实施例提供的协程管理方法的流程图,可由CPU执行,该方法还包括如下步骤:
步骤208:在拒绝将第一线程的线程锁授予第一协程的情况下,判断处于可用状态的线程的数量是否小于目标线程的个数的一半。
其中,第一线程的线程锁的持有者的标记单位是协程。
在处于可用状态的线程的数量小于目标线程的个数的一半的情况下,执行步骤209;在处于可用状态的线程的数量不小于目标线程的个数的一半的情况下,执行步骤210。其中,步骤209之后也可执行步骤210。
步骤209:创建第三线程。
其中,第三线程是不同于第一线程的线程,又可称之为新的线程,第三线程的创建过程可参考前述内容,不再赘述。
图6示出了本申请一个示例性实施例提供的调度器的示意图。其中,业务1、业务2和业务3分别将任务1、任务2和任务3提交到调度器的任务队列中,调度器从任务队列中选取一个协程,并将该协程放到处于可用状态的某一线程上执行。
以任务队列包括协程1、协程2、协程3和协程4,线程1和线程2是原有线程,线程3为创建的第三线程为例。
假设调度器从协程1、协程2、协程3和协程4中选取协程1在线程1上执行任务1,选取协程2在线程2上执行任务2。根据前述内容,线程1和线程2存在被阻塞的可能性。
在线程1和线程2被阻塞之前,可创建线程3,以使得操作系统中始终存在至少一个处于可用状态的线程,能够使得处于可用状态的线程保持在一定数量之上,避免陷入类似死锁状态的问题。
在一种可选的实施场景下,参考图3,若协程2申请的线程锁被协程0持有,则协程2处于等待状态。此时,由于协程2未获取到线程锁,则导致线程0处于阻塞状态。以创建第三线程(即图6中示出的线程3)为例,可将协程0从线程0切换至第三线程上运行,在协程0运行结束后,协程0释放锁定的资源,线程锁不再协程0持有。随后,协程2可获取到该线程锁,线程0从阻塞状态恢复为可用状态。
步骤210:阻塞第一线程。
其中,阻塞第一线程的执行是基于如下两个可选的前提中的一个进行的:
处于可用状态的线程的数量不小于目标线程的个数的一半;
或者,创建第三线程之后。
示意性的,第一线程的阻塞可参考前述内容,不再赘述。
结合图2和图5,本申请实施例提供的协程管理方法,可实现为如下:
1、接收第一协程的线程锁申请。
2、在接收到第一协程的线程锁申请后,判断线程锁是否有持有者。
3、根据线程锁的持有情况,有如下三种可选的执行步骤:
可选步骤一:在第一线程的线程锁没有持有者的情况下,将第一协程标记为线程锁的持有者,第一协程可成功获取线程锁;
可选步骤二:在持有者是第一协程的情况下,第一协程可成功获取线程锁,实现锁重入;
可选步骤三:在持有者不是第一协程的情况下,第一协程获取线程锁失败。
4、在第一协程获取线程锁失败的情况下,根据处于可用状态的线程的数量和目标线程的个数的数量关系,确定是否需要创建新的工作线程,具体如下:
在可用线程个数小于目标线程的个数的一半的情况下,创建第三线程,随后阻塞第一线程;
在可用线程个数不小于目标线程的个数的一半的情况下,阻塞第一线程。
示意性的,上述实施例可组合实现,在此不再赘述。
综上所述,本申请实施例提供的协程管理方法,在处于可用状态的线程符合预设条件的情况下,在阻塞第一线程之前创建第三线程,使得操作系统中至少存在一个处于可用状态的线程,避免类似死锁状态的出现。
可选的,可在处于可用状态的线程的数量小于目标线程的个数的一半的情况下,创建第三线程。
以下为本申请的装置实施例,对于装置实施例中未详细描述的细节,可以结合参考上述方法实施例中相应的记载,本文不再赘述。
图7示出了本申请一个示例性实施例提供的协程管理装置的示意图,该装置包括:
接收模块720,用于接收第一协程的线程锁申请,线程锁申请用于请求获取第一线程的线程锁,第一线程是运行第一协程的线程;
获取模块730,用于获取第一线程的线程锁的持有者,线程锁的持有者的标记单位是协程;
授予模块740,用于根据第一线程的线程锁的持有者,将第一线程的线程锁授予第一协程;
其中,第一线程的线程锁用于锁定第一协程所使用的资源。
可选的,授予模块740,用于在第一线程的线程锁没有持有者的情况下,将第一协程标记为线程锁的持有者,将第一线程的线程锁授予第一协程;或,在第一线程的线程锁的持有者是第一协程的情况下,将第一线程的线程锁授予第一协程。
可选的,该装置还包括切换模块750,用于在第一线程的线程锁的持有者是第一协程的情况下,从第一协程切换到第二协程。
可选的,授予模块740,还用于在第一线程的线程锁的持有者不是第一协程的情况下,拒绝将第一线程的线程锁授予第一协程。
可选的,切换模块750,还用于在拒绝将第一线程的线程锁授予第一协程的情况下,将第一协程从第一线程切换至第二线程运行。
可选的,切换模块750,还用于在拒绝将第一线程的线程锁授予第一协程的情况下,将第一线程从可用状态切换为阻塞状态。
可选的,该装置还包括创建模块760,用于在处于可用状态的线程符合预设条件的情况下,创建第三线程。
可选的,创建模块760,用于获取处于可用状态的线程的数量;在处于可用状态的线程的数量符合预设条件的情况下,创建第三线程。
可选的,预设条件包括:处于可用状态的线程的数量小于目标线程的个数的一半。
可选的,该装置还包括修改模块770,用于将第一线程的线程锁的持有者的标记单位修改为协程。
图8是本申请一个实施例提供的服务器的结构示意图。具体来讲:服务器800包括中央处理单元801、包括随机存取存储器(Random Access Memory,RAM)802和只读存储器(Read-Only Memory,ROM)803的系统存储器804,以及连接系统存储器804和中央处理单元801的系统总线805。计算机设备800还包括帮助计算机内的各个器件之间传输信息的基本输入/输出系统(I/O系统,Input/Output系统)806,和用于存储操作系统813、应用程序814和其他程序模块815的大容量存储设备807。
基本输入/输出系统806包括有用于显示信息的显示器808和用于用户输入信息的诸如鼠标、键盘之类的输入设备809。其中显示器808和输入设备809都通过连接到系统总线805的输入/输出控制器810连接到中央处理单元801。基本输入/输出系统806还可以包括输入/输出控制器810以用于接收和处理来自键盘、鼠标、或电子触控笔等多个其他设备的输入。类似地,输入/输出控制器810还提供输出到显示屏、打印机或其他类型的输出设备。
大容量存储设备807通过连接到系统总线805的大容量存储控制器(未示出)连接到中央处理单元801。大容量存储设备807及其相关联的计算机可读介质为服务器800提供非易失性存储。也就是说,大容量存储设备807可以包括诸如硬盘或者只读光盘(CompactDisc Read-Only Memory,CD-ROM)驱动器之类的计算机可读介质(未示出)。
不失一般性,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括RAM、ROM、可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM)、电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EPROM)、闪存或其他固态存储其技术,CD-ROM、数字通用光盘(Digital Versatile Disc,DVD)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知计算机存储介质不局限于上述几种。上述的系统存储器804和大容量存储设备807可以统称为存储器。
根据本申请的各种实施例,服务器800还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即服务器800可以通过连接在系统总线805上的网络接口单元811连接到网络812,或者说,也可以使用网络接口单元811来连接到其他类型的网络或远程计算机系统(未示出)。
本申请还提供了一种计算机可读存储介质,存储介质中存储有计算机程序,所述计算机程序用于被处理器执行,以实现如上所述的协程管理方法。
本申请还提供了一种芯片,芯片包括可编程逻辑电路和/或程序指令,当芯片运行时,用于实现如上所述的协程管理方法。
本申请还提供了一种计算机程序产品或计算机程序,计算机程序产品或计算机程序包括计算机指令,计算机指令存储在计算机可读存储介质中,处理器从计算机可读存储介质读取并执行计算机指令,以实现如上所述的协程管理方法。
应当理解的是,在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (14)
1.一种协程管理方法,其特征在于,所述方法包括:
接收第一协程的线程锁申请,所述线程锁申请用于请求获取第一线程的线程锁,所述第一线程是运行所述第一协程的线程;
获取所述第一线程的线程锁的持有者,所述线程锁的持有者的标记单位是协程;
根据所述第一线程的线程锁的持有者,将所述第一线程的线程锁授予所述第一协程;
其中,所述第一线程的线程锁用于锁定所述第一协程所使用的资源。
2.根据权利要求1所述的方法,其特征在于,所述根据所述线程锁的持有者,将所述第一线程的线程锁授予所述第一协程,包括如下步骤中的至少一个:
在所述第一线程的线程锁没有持有者的情况下,将所述第一协程标记为所述线程锁的持有者,将所述第一线程的线程锁授予所述第一协程;
或,
在所述第一线程的线程锁的持有者是所述第一协程的情况下,将所述第一线程的线程锁授予所述第一协程。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
在所述第一线程的线程锁的持有者是所述第一协程的情况下,从所述第一协程切换到第二协程。
4.根据权利要求2所述的方法,其特征在于,所述方法还包括:
在所述第一线程的线程锁的持有者不是所述第一协程的情况下,拒绝将所述第一线程的线程锁授予所述第一协程。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
在拒绝将所述第一线程的线程锁授予所述第一协程的情况下,将第三协程从所述第一线程切换至第二线程运行,所述第三协程是所述第一线程上除所述第一协程之外的协程。
6.根据权利要求4所述的方法,其特征在于,所述方法还包括:
在拒绝将所述第一线程的线程锁授予所述第一协程的情况下,将所述第一线程从可用状态切换为阻塞状态。
7.根据权利要求1至6任一所述的方法,其特征在于,所述方法还包括:
在处于可用状态的线程符合预设条件的情况下,创建第三线程。
8.根据权利要求7所述的方法,其特征在于,所述在处于可用状态的线程符合预设条件的情况下,创建第三线程,包括:
获取处于可用状态的线程的数量;
在所述处于可用状态的线程的数量符合所述预设条件的情况下,创建所述第三线程。
9.根据权利要求8所述的方法,其特征在于,所述预设条件包括:
所述处于可用状态的线程的数量小于目标线程的个数的一半。
10.根据权利要求1至6任一所述的方法,其特征在于,所述方法还包括:
将所述第一线程的线程锁的持有者的标记单位修改为协程。
11.一种协程管理装置,其特征在于,所述装置包括:
接收模块,用于接收第一协程的线程锁申请,所述线程锁申请用于请求获取第一线程的线程锁,所述第一线程是运行所述第一协程的线程;
获取模块,用于获取所述第一线程的线程锁的持有者,所述线程锁的持有者的标记单位是协程;
授予模块,用于根据所述第一线程的线程锁的持有者,将所述第一线程的线程锁授予所述第一协程;
其中,所述第一线程的线程锁用于锁定所述第一协程所使用的资源。
12.一种计算机设备,其特征在于,所述计算机设备包括处理器;
所述处理器,用于接收第一协程的线程锁申请,所述线程锁申请用于请求获取第一线程的线程锁,所述第一线程是运行所述第一协程的线程;
获取所述第一线程的线程锁的持有者,所述线程锁的持有者的标记单位是协程;
根据所述第一线程的线程锁的持有者,将所述第一线程的线程锁授予所述第一协程;
其中,所述第一线程的线程锁用于锁定所述第一协程所使用的资源。
13.一种计算机可读存储介质,其特征在于,所述存储介质中存储有计算机程序,所述计算机程序用于被处理器执行,以实现如权利要求1至10中任一项所述的协程管理方法。
14.一种计算机程序产品或计算机程序,其特征在于,所述计算机程序产品或计算机程序包括计算机指令,所述计算机指令存储在计算机可读存储介质中,处理器从所述计算机可读存储介质读取并执行所述计算机指令,以实现如权利要求1至10中任一项所述的协程管理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111551898.8A CN116266143A (zh) | 2021-12-17 | 2021-12-17 | 协程管理方法、装置、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111551898.8A CN116266143A (zh) | 2021-12-17 | 2021-12-17 | 协程管理方法、装置、设备及介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116266143A true CN116266143A (zh) | 2023-06-20 |
Family
ID=86743685
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111551898.8A Pending CN116266143A (zh) | 2021-12-17 | 2021-12-17 | 协程管理方法、装置、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116266143A (zh) |
-
2021
- 2021-12-17 CN CN202111551898.8A patent/CN116266143A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8429657B2 (en) | Global avoidance of hang states via priority inheritance in multi-node computing system | |
CN108572876B (zh) | 一种读写锁的实现方法及装置 | |
JPH04308961A (ja) | 占有されたプロセスの同期ロックの状態を通知するための手段及び装置 | |
WO2016145904A1 (zh) | 一种资源管理方法、装置和系统 | |
JPH10283243A (ja) | データベース管理システム | |
CN112148480A (zh) | 基于多线程的任务处理方法、装置、设备及存储介质 | |
CN105579963B (zh) | 任务处理装置、电子设备及方法 | |
CN111897666A (zh) | 用于多进程之间通信的方法、设备及系统 | |
CN114168302A (zh) | 任务调度方法、装置、设备及存储介质 | |
CN112540829A (zh) | 容器组驱逐方法、装置、节点设备及存储介质 | |
CN112286688A (zh) | 一种内存管理和使用方法、装置、设备和介质 | |
CN116185623A (zh) | 任务分配方法、装置、电子设备及存储介质 | |
CN111163140A (zh) | 资源获取和分配的方法、装置和计算机可读存储介质 | |
CN111831408A (zh) | 异步任务处理方法、装置、电子设备及介质 | |
CN110430258B (zh) | 一种分布式锁管理方法和装置 | |
CN112527449A (zh) | 一种集群节点标签创建方法、系统及电子设备和存储介质 | |
CN116266143A (zh) | 协程管理方法、装置、设备及介质 | |
CN108073460B (zh) | 分布式系统中的全局锁抢占方法、装置及计算设备 | |
US10528397B2 (en) | Method, device, and non-transitory computer readable storage medium for creating virtual machine | |
US20060230246A1 (en) | Memory allocation technique using memory resource groups | |
CN115878333A (zh) | 进程组间的一致性判断方法、装置及设备 | |
US11972293B2 (en) | Data structure, memory means and device | |
US9015717B2 (en) | Method for processing tasks in parallel and selecting a network for communication | |
CN113961364A (zh) | 一种大规模锁系统实现方法、装置、存储介质和服务器 | |
EP3783484B1 (en) | Data processing method and computer device |
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 | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40088284 Country of ref document: HK |