一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于微内核的分时vcpu多核调度方法及系统与流程

2021-11-25 00:06:00 来源:中国专利 TAG:


1.本发明涉及虚拟化技术领域,具体地,涉及一种基于微内核的分时vcpu多核调度方法及系统。


背景技术:

2.伴随嵌入式领域的不断发展,嵌入式系统的应用场合越来越多,面对日益增多的用户需求,只能支持单一应用类型的嵌入式系统已经无法满足要求。为了应对这一多样化的挑战,现有的嵌入式系统往往包含多个子系统,多种子系统满足多种需求,如实时性和非实时性需求,低安全等级和高安全等级需求等。多样化的子系统也增加了嵌入式系统的设计复杂度。在此背景下,嵌入式行业需要新的解决方案以实现多种子系统的资源整合,虚拟化技术在嵌入式系统的应用为此提供了有力的支撑。嵌入式系统的虚拟化技术能够在同一硬件平台上虚拟出多个分区,不同分区均可运行独立的操作系统或应用,这使得实时操作系统和通用操作系统并存,方便了对实时和非实时应用的整合。
3.vcpu即电脑中的虚拟处理器,相对于物理cpu而言,虚拟机内的cpu。
4.公开号为cn112579294a的发明专利,公开了一种虚拟机的多核调度的实现方法及装置,所述方法包括:将一虚拟机的主虚拟机与n

1个影子虚拟机对应配置到n个cpu核上;通过一时间调度表,调度所述主虚拟机和所述影子虚拟机在相同的时间窗口下分别运行于对应的cpu核上;所述时间调度表配置有用于调度主虚拟机和影子虚拟机运行的时间窗口。
5.然而,现有的开源虚拟化技术如基于linux的kvm,大多基于宏内核,这使得分区间、任务间的隔离性和可靠性有所下降;而且这些开源虚拟化技术,大多只具备软实时性能,无法满足强实时应用场景的要求。


技术实现要素:

6.针对现有技术中的缺陷,本发明提供一种基于微内核的分时vcpu多核调度方法及系统。
7.根据本发明提供的一种基于微内核的分时vcpu多核调度方法及系统,所述方案如下:
8.第一方面,提供了一种基于微内核的分时vcpu多核调度方法,所述方法包括:
9.调度初始化步骤:将物理处理器核心pcpu进行分组;每个pcpu申请内存空间创建各自的就绪队列、等待队列,并为每个pcpu创建各自的空闲idle线程;
10.分区多核调度步骤:在vcpu线程调度时,判断当前vcpu线程或普通任务线程的时间片是否耗尽,若未耗尽时间片则不能打断;
11.若耗尽时间片,则选取当前pcpu的就绪队列中首个就绪线程,即vcpu线程或普通任务线程,进行切换,若当前pcpu的就绪队列为空则直接运行空闲idle线程;
12.就绪线程选择步骤:在分区多核调度步骤中,选择就绪线程,即vcpu线程或普通任务线程时,通过当前时间与截止时间的对比判断分区处于新周期还是旧周期,并判断是否
启动了虚拟机,根据判断结果选择相应的就绪线程进行切换。
13.优选的,所述调度初始化步骤包括:
14.步骤s1.1:初始化开始;
15.步骤s1.2:将物理处理器核心pcpu进行分组,一组注册为实时调度策略作为实时分区;另一组注册为非实时调度策略作为普通分区;
16.步骤s1.3:为每个pcpu申请内存空间创建各自的就绪队列和等待队列,并将就绪队列和等待队列地址记录在全局数组cpu_rq[]与cpu_wq[]中;
[0017]
步骤s1.4:为每个pcpu创建各自的空闲idle线程,并将该idle线程标识记录在全局数组cpu_it[]中;
[0018]
步骤s1.5:pcpu开始运行各自的空闲idle线程;
[0019]
步骤s1.6:进行首次调度,当就绪队列不空时,pcpu切换到就绪队列中首个就绪线程运行,即vcpu线程或普通任务线程,否则仍然运行空闲idle线程;
[0020]
步骤s1.7:结束并返回。
[0021]
优选的,所述分区多核调度步骤具体包括:
[0022]
步骤s2.1:非首次调度开始,若此时pcpu上正在运行空闲idle线程则切换回空闲idle线程后跳转步骤s2.9结束并返回idle线程,若此时正在运行vcpu线程或普通任务线程则跳转步骤s2.2;
[0023]
步骤s2.2:判断当前运行的线程的状态,thread_state是否为正在运行ts_running,若为ts_running则跳转步骤s2.3,若不为ts_running则跳转步骤s2.4;
[0024]
步骤s2.3:判断当前运行的线程的时间片是否耗尽,若耗尽则跳转步骤s2.4,若未耗尽则无需调度直接跳转步骤s2.9结束并返回;
[0025]
步骤s2.4:设置当前线程状态thread_state为ts_inter,设置当前线程时间片current_minor_frame为0,依据当前线程与物理处理器核pcpu的亲和性affinity加入相应的pcpu的就绪队列中;
[0026]
步骤s2.5:判断当前pcpu的就绪队列是否为空,若为空则当前pcpu切换到到空闲idle线程的上下文运行后,跳转步骤s2.9结束并返回,不为空则跳转步骤s2.6;
[0027]
步骤s2.6:在当前pcpu的就绪队列中选取就绪线程,即vcpu线程或普通任务线程,并将其出队;
[0028]
步骤s2.7:设置ks_locked标志位锁住就绪线程的栈kernel_stack,依据该线程信息设置该线程的时间片current_minor_frame;
[0029]
步骤s2.8:解锁线程的kernel_stack,切换到该线程的上下文运行;
[0030]
步骤s2.9:结束调度并返回。
[0031]
优选的,所述就绪线程选择步骤中,选择就绪线程时,即vcpu线程或普通任务线程,首先通过当前时间与截止时间的对比判断分区处于新周期还是旧周期;
[0032]
若处于旧周期且启动了虚拟机,即就绪线程为vcpu线程而非普通任务线程,则直接选择当前pcup就绪队列中首个就绪的vcpu线程进行切换;
[0033]
若处于新周期且启动了虚拟机,即就绪线程为vcpu线程而非普通任务线程,则计算当前新周期的截止时间并切换至当前pcpu就绪队列中的首个就绪的vcpu线程;
[0034]
若处于新周期但没有启动虚拟机,即就绪线程为普通任务线程而非vcpu线程,则
需要重新选择本分区内有效的pcpu并切换至该pcpu的就绪队列中首个就绪的普通任务线程,当切换就绪线程而就绪队列为空时则切换至当前pcpu的空闲idle线程。
[0035]
优选的,所述就绪线程选择步骤具体包括:
[0036]
步骤s3.1:开始;
[0037]
步骤s3.2:比较当前时间与当前pcpu运行线程,即vcpu线程或普通任务线程的截止时间,判断当前线程是否处于新周期中,若是则跳转步骤s3.3,若否则跳转步骤s3.11;
[0038]
步骤s3.3:判断当前是否运行了虚拟机,若运行了虚拟机则当前运行的线程为vcpu线程跳转步骤s3.4,若未运行虚拟机则当前运行线程为普通任务线程跳转步骤s3.5;
[0039]
步骤s3.4:在多个物理处理器核pcpu中寻找有效的pcpu并记录其索引;
[0040]
步骤s3.5:记录此次切换的当前时间作为next_switch_time,和新周期的截止时间作为next_major_frame;
[0041]
步骤s3.6:判断当前pcpu的就绪队列,即vcpu线程或普通任务线程是否为空,不为空则跳转步骤s3.7,空则跳转步骤s3.14;
[0042]
步骤s3.7:判断当前pcpu的就绪队列中首个就绪线程的栈kernel_stack的状态是否为空闲ks_free,空闲则跳转步骤s3.8,非空闲则跳转步骤s3.14;
[0043]
步骤s3.8:将当前pcpu就绪队列中首个就绪线程出队;
[0044]
步骤s3.9:判断出队的就绪线程状态是否为结束退出te_exiting,是则跳转步骤s3.7,否则跳转步骤s3.10;
[0045]
步骤s3.10:切换到该就绪线程的上下文运行,跳转步骤s3.15结束并返回该线程号;
[0046]
步骤s3.11:比较当前时间与当前pcpu运行线程的截止时间,判断当前线程是否处于旧周期中,若是则跳转步骤s3.12,若否则跳转步骤s3.14;
[0047]
步骤s3.12:判断当前是否运行了虚拟机,若运行了虚拟机则当前运行的线程为vcpu线程跳转步骤s3.6,若未运行虚拟机则当前运行线程为普通任务线程跳转步骤s3.14;
[0048]
步骤s3.13:记录此次切换的当前时间作为next_switch_time,跳转步骤s3.7;
[0049]
步骤s3.14:切换到空闲idle线程;
[0050]
步骤s3.15:结束并返回该线程号。
[0051]
第二方面,提供了一种基于微内核的分时vcpu多核调度系统,所述系统包括:
[0052]
调度初始化模块:将物理处理器核心pcpu进行分组;每个pcpu申请内存空间创建各自的就绪队列、等待队列,并为每个pcpu创建各自的空闲idle线程;
[0053]
分区多核调度模块:在线程调度时,判断当前线程,即vcpu线程或普通任务线程,的时间片是否耗尽,若未耗尽时间片则不能打断;
[0054]
若耗尽时间片,则选取当前pcpu的就绪队列中首个就绪线程,即vcpu线程或普通任务线程进行切换,若当前pcpu的就绪队列为空则直接运行空闲idle线程;
[0055]
就绪线程选择模块:在分区多核调度模块中,选择就绪线程,即vcpu线程或普通任务线程时,通过当前时间与截止时间的对比判断分区处于新周期还是旧周期,根据判断结果选择就绪线程进行切换。
[0056]
优选的,所述调度初始化模块包括:
[0057]
模块m1.1:初始化开始;
[0058]
模块m1.2:将物理处理器核心pcpu进行分组,一组注册为实时调度策略作为实时分区;另一组注册为非实时调度策略作为普通分区;
[0059]
模块m1.3:为每个pcpu申请内存空间创建各自的就绪队列和等待队列,并将就绪队列和等待队列地址记录在全局数组cpu_rq[]与cpu_wq[]中;
[0060]
模块m1.4:为每个pcpu创建各自的空闲idle线程,并将该idle线程标识记录在全局数组cpu_it[]中;
[0061]
模块m1.5:pcpu开始运行各自的空闲idle线程;
[0062]
模块m1.6:进行首次调度,当就绪队列不空时,pcpu切换到就绪队列中首个就绪线程,即vcpu线程或普通任务线程运行,否则仍然运行空闲idle线程;
[0063]
步骤m1.7:结束并返回。
[0064]
优选的,所述分区多核调度模块具体包括:
[0065]
模块m2.1:非首次调度开始,若此时pcpu上正在运行空闲idle线程则切换回空闲idle线程后跳转模块m2.9结束并返回idle线程,若此时正在运行vcpu线程或普通任务线程则跳转模块m2.2;
[0066]
模块m2.2:判断当前运行的线程的状态,thread_state是否为正在运行ts_running,若为ts_running则跳转模块m2.3,若不为ts_running则跳转模块m2.4;
[0067]
模块m2.3:判断当前运行的线程的时间片是否耗尽,若耗尽则跳转模块m2.4,若未耗尽则无需调度直接跳转模块m2.9结束并返回;
[0068]
模块m2.4:设置当前线程状态thread_state为ts_inter,设置当前线程时间片current_minor_frame为0,依据当前线程与物理处理器核pcpu的亲和性affinity加入相应的pcpu的就绪队列中;
[0069]
模块m2.5:判断当前pcpu的就绪队列是否为空,若为空则当前pcpu切换到到空闲idle线程的上下文运行后,跳转模块m2.9结束并返回,不为空则跳转模块m2.6;
[0070]
模块m2.6:在当前pcpu的就绪队列中选取就绪线程,即vcpu线程或普通任务线程,并将其出队;
[0071]
模块m2.7:设置ks_locked标志位锁住就绪线程的栈kernel_stack,依据该线程信息设置该线程的时间片current_minor_frame;
[0072]
模块m2.8:解锁线程的kernel_stack,切换到该线程的上下文运行;
[0073]
模块m2.9:结束调度并返回。
[0074]
优选的,所述就绪线程选择模块中,选择就绪线程,即vcpu线程或普通任务线程时,首先通过当前时间与截止时间的对比判断分区处于新周期还是旧周期;
[0075]
若处于旧周期且启动了虚拟机,即就绪线程为vcpu线程而非普通任务线程,则直接选择当前pcup就绪队列中首个就绪的vcpu线程进行切换;
[0076]
若处于新周期且启动了虚拟机,即就绪线程为vcpu线程而非普通任务线程,则计算当前新周期的截止时间并切换至当前pcpu就绪队列中的首个就绪的vcpu线程;
[0077]
若处于新周期但没有启动虚拟机,即就绪线程为普通任务线程而非vcpu线程,则需要重新选择本分区内有效的pcpu并切换至该pcpu的就绪队列中首个就绪的普通任务线程,当切换就绪线程而就绪队列为空时则切换至当前pcpu的空闲idle线程。
[0078]
优选的,所述就绪线程选择模块具体包括:
[0079]
模块m3.1:开始;
[0080]
模块m3.2:比较当前时间与当前pcpu运行线程的截止时间,即vcpu线程或普通任务线程,判断当前线程是否处于新周期中,若是则跳转模块m3.3,若否则跳转模块m3.11;
[0081]
模块m3.3:判断当前是否运行了虚拟机,若运行了虚拟机则当前运行的线程为vcpu线程跳转模块m3.4,若未运行虚拟机则当前运行线程为普通任务线程跳转模块m3.5;
[0082]
模块m3.4:在多个物理处理器核pcpu中寻找有效的pcpu并记录其索引;
[0083]
模块m3.5:记录此次切换的当前时间作为next_switch_time,和新周期的截止时间作为next_major_frame;
[0084]
模块m3.6:判断当前pcpu的就绪队列,即vcpu线程或普通任务线程是否为空,不为空则跳转模块m3.7,空则跳转模块m3.14;
[0085]
模块m3.7:判断当前pcpu的就绪队列中首个就绪线程的栈kernel_stack的状态是否为空闲ks_free,空闲则跳转模块m3.8,非空闲则跳转模块m3.14;
[0086]
模块m3.8:将当前pcpu就绪队列中首个就绪线程出队;
[0087]
模块m3.9:判断出队的就绪线程状态是否为结束退出te_exiting,是则跳转模块m3.7,否则跳转模块m3.10;
[0088]
模块m3.10:切换到该就绪线程的上下文运行,跳转模块m3.15结束并返回该线程号;
[0089]
模块m3.11:比较当前时间与当前pcpu运行线程的截止时间,判断当前线程是否处于旧周期中,若是则跳转模块m3.12,若否则跳转模块m3.14;
[0090]
模块m3.12:判断当前是否运行了虚拟机,若运行了虚拟机则当前运行的线程为vcpu线程跳转模块m3.6,若未运行虚拟机则当前运行线程为普通任务线程跳转模块m3.14;
[0091]
模块m3.13:记录此次切换的当前时间作为next_switch_time,跳转模块m3.7;
[0092]
模块m3.14:切换到空闲idle线程;
[0093]
模块m3.15:结束并返回该线程号。
[0094]
与现有技术相比,本发明具有如下的有益效果:
[0095]
1、本发明基于微内核实现,具有更高的灵活性和可靠性;
[0096]
2、本发明的分时调度算法,有效整合了实时和非实时任务所需的资源;
[0097]
3、本发明中实时分区调度算法提高了该分区任务调度的实时性。
附图说明
[0098]
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
[0099]
图1为本实施例的实时分区vcpu多核调度算法全流程图;
[0100]
图2为本实施例的就绪线程选择算法流程图。
具体实施方式
[0101]
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明
的保护范围。
[0102]
本发明实施例基于灵活的微内核系统架构,在保证安全性、可靠性的前提下,为整合实时与非实时分区的资源,提供了一种基于微内核的分时vcpu多核调度方法,参照图1和图2所示,为运行于微内核之上的虚拟处理器线程分配不同的物理处理器核组,不同物理处理器核分组具有实时性不同的调度策略,即一组为一个分区,不同分区各行其是互不干扰;该分时vcpu多核调度方法具体包括:
[0103]
调度初始化步骤:将物理处理器核心physical cpu(pcpu)进行分组,一组注册为实时调度策略作为实时分区,另一组注册为非实时调度策略(如时间片轮转调度方法或优先级抢占调度方法)作为普通分区。依据用户需求可进行多个分组,每组为一个分区共享同种调度策略,分区间互不干扰,具体地:
[0104]
步骤s1.1:初始化开始;
[0105]
步骤s1.2:将物理处理器核心pcpu进行分组(即分区),一组注册为实时调度策略作为实时分区,并具有本区独有的周期时间片长度,周期内可运行多个线程,但多个线程的时间片长度之和必须小于等于周期长度;另一组注册为非实时调度策略(如时间片轮转调度方法或优先级抢占调度方法)作为普通分区;
[0106]
步骤s1.3:为每个pcpu申请内存空间创建各自的就绪队列和等待队列,并将就绪队列和等待队列地址记录在全局数组cpu_rq[]与cpu_wq[]中;
[0107]
步骤s1.4:为每个pcpu创建各自的空闲idle线程,并将该idle线程标识记录在全局数组cpu_it[]中;
[0108]
步骤s1.5:pcpu开始运行各自的空闲idle线程;
[0109]
步骤s1.6:进行首次调度,当就绪队列不空时,pcpu切换到就绪队列中首个就绪线程(vcpu线程或普通任务线程)运行,否则仍然运行空闲idle线程;
[0110]
步骤s1.7:结束并返回。
[0111]
分区多核调度步骤:在vcpu线程调度时,首先判断当前线程的时间片是否耗尽,未耗尽则不能打断,耗尽时间片时则选取当前pcpu的就绪队列中首个就绪线程进行切换,若当前pcpu的就绪队列为空则直接运行空闲idle线程;具体步骤如下:
[0112]
步骤s2.1:非首次调度开始,若此时pcpu上正在运行空闲idle线程则切换回空闲idle线程后跳转步骤s2.9结束并返回idle线程,若此时正在运行vcpu线程或普通任务线程则跳转步骤s2.2;
[0113]
步骤s2.2:判断当前运行的线程的状态,thread_state是否为正在运行ts_running,若为ts_running则跳转步骤s2.3,若不为ts_running则跳转步骤s2.4;
[0114]
步骤s2.3:判断当前运行的线程的时间片是否耗尽,若耗尽则跳转步骤s2.4,若未耗尽则无需调度直接跳转步骤s2.9结束并返回;
[0115]
步骤s2.4:设置当前线程状态thread_state为ts_inter,设置当前线程时间片current_minor_frame为0,依据当前线程与物理处理器核pcpu的亲和性affinity加入相应的pcpu的就绪队列中;
[0116]
步骤s2.5:判断当前pcpu的就绪队列是否为空,若为空则当前pcpu切换到到空闲idle线程的上下文运行后,跳转步骤s2.9结束并返回,不为空则跳转步骤s2.6;
[0117]
步骤s2.6:在当前pcpu的就绪队列中选取就绪线程(vcpu线程或普通任务线程)并
将其出队;
[0118]
步骤s2.7:设置ks_locked标志位锁住就绪线程的栈kernel_stack,依据该线程信息设置该线程的时间片current_minor_frame;
[0119]
步骤s2.8:解锁线程的kernel_stack,切换到该线程的上下文运行;
[0120]
步骤s2.9:结束调度并返回。
[0121]
就绪线程选择步骤:在分区多核调度步骤中,首先通过当前时间与截止时间的对比判断分区处于新周期还是旧周期,若处于旧周期且启动了虚拟机则直接选择当前pcup就绪队列中首个就绪线程进行切换,若处于新周期且启动了虚拟机则计算当前新周期的截止时间并切换至当前pcpu就绪队列中的首个就绪线程,若处于新周期但没有启动虚拟机则需要重新选择本分区内有效的pcpu并切换至该pcpu的就绪队列中首个就绪线程,当切换就绪线程而就绪队列为空时则切换至当前pcpu的空闲线程;具体步骤如下:
[0122]
步骤s3.1:开始;
[0123]
步骤s3.2:比较当前时间与当前pcpu运行线程(vcpu线程或普通任务线程)的截止时间,判断当前线程是否处于新周期中,若是则跳转步骤s3.3,若否则跳转步骤s3.11;
[0124]
步骤s3.3:判断当前是否运行了虚拟机,若运行了虚拟机则当前运行的线程为vcpu线程跳转步骤s3.4,若未运行虚拟机则当前运行线程为普通任务线程跳转步骤s3.5;
[0125]
步骤s3.4:在多个物理处理器核pcpu中寻找有效的pcpu并记录其索引;
[0126]
步骤s3.5:记录此次切换的当前时间作为next_switch_time,和新周期的截止时间作为next_major_frame;
[0127]
步骤s3.6:判断当前pcpu的就绪队列(vcpu线程或普通任务线程)是否为空,不为空则跳转步骤s3.7,空则跳转步骤s3.14;
[0128]
步骤s3.7:判断当前pcpu的就绪队列中首个就绪线程的栈kernel_stack的状态是否为空闲ks_free,空闲则跳转步骤s3.8,非空闲则跳转步骤s3.14;
[0129]
步骤s3.8:将当前pcpu就绪队列中首个就绪线程出队;
[0130]
步骤s3.9:判断出队的就绪线程状态是否为结束退出te_exiting,是则跳转步骤s3.7,否则跳转步骤s3.10;
[0131]
步骤s3.10:切换到该就绪线程的上下文运行,跳转步骤s3.15结束并返回该线程号;
[0132]
步骤s3.11:比较当前时间与当前pcpu运行线程的截止时间,判断当前线程是否处于旧周期中,若是则跳转步骤s3.12,若否则跳转步骤s3.14;
[0133]
步骤s3.12:判断当前是否运行了虚拟机,若运行了虚拟机则当前运行的线程为vcpu线程跳转步骤s3.6,若未运行虚拟机则当前运行线程为普通任务线程跳转步骤s3.14;
[0134]
步骤s3.13:记录此次切换的当前时间作为next_switch_time,跳转步骤s3.7;
[0135]
步骤s3.14:切换到空闲idle线程;
[0136]
步骤s3.15:结束并返回该线程号。
[0137]
本发明实施例提供了一种基于微内核的分时vcpu多核调度方法,基于微内核实现,具有更高的灵活性和可靠性;分时调度算法,有效整合了实时和非实时任务所需的资源;实时分区调度算法提高了该分区任务调度的实时性。
[0138]
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统
及其各个装置、模块、单元以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统及其各个装置、模块、单元以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同功能。所以,本发明提供的系统及其各项装置、模块、单元可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置、模块、单元也可以视为硬件部件内的结构;也可以将用于实现各种功能的装置、模块、单元视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
[0139]
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本技术的实施例和实施例中的特征可以任意相互组合。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献