CN112433834A - 一种基于Linux系统的调度处理方法及装置 - Google Patents
一种基于Linux系统的调度处理方法及装置 Download PDFInfo
- Publication number
- CN112433834A CN112433834A CN202011318413.6A CN202011318413A CN112433834A CN 112433834 A CN112433834 A CN 112433834A CN 202011318413 A CN202011318413 A CN 202011318413A CN 112433834 A CN112433834 A CN 112433834A
- Authority
- CN
- China
- Prior art keywords
- mvb
- timer
- timeout duration
- preset
- function
- 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.)
- Granted
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
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
本发明公开一种基于Linux系统的调度处理方法及装置,包括:当高精度定时器函数启动时,将标记变量置为启动标识符;判断标记变量是否为所述启动标识符;若为是,则运行高精度定时器函数的回调函数,设置回调函数中的MVB定时器的超时时长为第一超时时长,将状态变量置为MVB时段标识符;判断MVB定时器是否触发;若为是,则将状态变量置为Linux时段标识符,设置回调函数中的MVB定时器的超时时长为第二超时时长;判断MVB定时器是否触发,所述MVB定时器的超时时长为所述第二超时时长;若为是,则返回执行设置回调函数中的MVB定时器的超时时长为第一超时时长的步骤。应用本发明能够保证MVB任务被按时完成。
Description
技术领域
本发明涉及计算机技术领域,具体而言,涉及一种基于Linux系统的调度处理方法及装置。
背景技术
在Linux系统,为了提高任务的执行效率,以及保证CPU资源的利用率,提出了完全公平调度(Completely Fair Schedule,CFS)算法。在CFS算法中,由调度器调度各任务来执行。调度器分为主调度器和周期调度器,周期调度器由预设的基本周期触发。调度器是分配者,真正完成任务的选取和周期性调度的是调度类。调度类具体分为5类,每类调度类的优先级不同,当周期调度器在每个基本周期被触发时,可以选取优先级较高的调度类作为待执行调度类,再由待执行调度类从就绪队列中选取任务来执行。
但是,在基于Linux系统的列车通信网络中,对实时性要求较高的硬件设备发起的MVB任务,必须在每个预设的基本周期内的固定时间完成。比如,多功能车辆总线(Multifunction Vehicle Bus,MVB)板卡发起的数据采集任务,必须在每个预设的基本周期的初始时段完成。这样,MVB任务可能与调度类安排执行的其他任务发生冲突,导致MVB任务无法按时完成,影响系统的正常运行。
在基于Linux系统的列车通信网络中,如何保证这类MVB任务能够按时完成,是尚待解决的问题。
发明内容
本发明提供一种,用以克服现有技术中存在的至少一个技术问题。
根据本发明实施例的第一方面,提供一种基于Linux系统的调度处理方法,包括:在内核启动后,对预设的标记变量MVB_hrtimer_started进行初始化设置;当预设的高精度定时器函数MVB_hrtimer启动时,将所述标记变量MVB_hrtimer_started置为启动标识符;判断所述标记变量MVB_hrtimer_started是否为所述启动标识符;若为是,则运行所述高精度定时器函数MVB_hrtimer的回调函数,设置所述回调函数中的多功能车辆总线MVB定时器的超时时长为第一超时时长,以及将预设的状态变量MVB_status置为MVB时段标识符,其中,所述第一超时时长小于预设的基本周期;判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第一超时时长;若为是,则将所述状态变量MVB_status置为Linux时段标识符,以及设置所述回调函数中的MVB定时器的超时时长为第二超时时长,其中,所述第二超时时长小于所述基本周期,且所述第一超时时长与所述第二超时时长之和等于所述基本周期;判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第二超时时长;若为是,则返回执行所述设置所述回调函数中的多功能车辆总线MVB定时器的超时时长为第一超时时长的步骤。
根据本发明实施例的第二方面,提供一种基于Linux系统的调度处理装置,其特征在于,所述装置包括:第一设置模块、第二设置模块、第一判断模块、第三设置模块、第二判断模块、第四设置模块、第三判断模块和返回模块;所述第一设置模块,用于在内核启动后,对预设的标记变量MVB_hrtimer_started进行初始化设置;所述第二设置模块,用于当预设的高精度定时器函数MVB_hrtimer启动时,将所述标记变量MVB_hrtimer_started置为启动标识符;所述第一判断模块,用于判断所述标记变量MVB_hrtimer_started是否为所述启动标识符;所述第三设置模块,用于若所述标记变量MVB_hrtimer_started为所述启动标识符,则运行所述高精度定时器函数MVB_hrtimer的回调函数,设置所述回调函数中的多功能车辆总线MVB定时器的超时时长为第一超时时长,以及将预设的状态变量MVB_status置为MVB时段标识符,其中,所述第一超时时长小于预设的基本周期;所述第二判断模块,用于判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第一超时时长;所述第四设置模块,用于若所述MVB定时器触发,则将所述状态变量MVB_status置为Linux时段标识符,以及设置所述回调函数中的MVB定时器的超时时长为第二超时时长,其中,所述第二超时时长小于所述基本周期,且所述第一超时时长与所述第二超时时长之和等于所述基本周期;所述第三判断模块,用于判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第二超时时长;所述返回模块,用于若所述MVB定时器触发,则返回执行所述第三设置模块。
本发明实施例的创新点包括:
1、Linux系统的双状态分时处理。本发明将系统的基本周期划分为两个时段,前一MVB时段分配给执行MVB板卡发起的MVB任务,后一Linux时段分配给Linux系统中除MVB任务以外的普通任务;具体的,调度器可以通过查询由预设的状态变量MVB_status来区分当前时段,当预设的状态变量MVB_status为MVB时段标识符时,说明当前为MVB时段,可以执行MVB任务,当预设的状态变量MVB_status为Linux时段标识符时,说明当前为Linux时段,可以执行Linux系统中除MVB任务以外的普通任务;这样可以避免MVB任务,与Linux系统中的其他普通任务发生冲突,保证MVB任务能够被按时完成,是本发明实施例的创新点之一。
2、动态分时调整算法。由于MVB任务的任务量可能会发生变化,导致执行MVB任务所需的MVB时段的时长也会发生变化,因此,本发明可以根据MVB调度类的就绪队列中的任务情况,动态调整系统的基本周期,以及所述基本周期中MVB时段的时长,其中,MVB调度类用于管理MVB任务,保证MVB任务的按时完成,以及提高CPU利用率,是本发明实施例的创新点之一。
3、时钟冗余触发机制。通常情况下,可以通过遍历各CPU的三个时间基准的红黑树,查找超时定时器并触发对应的动作,但是,在特殊情况下,比如有些定时器的超时时长过长,可能导致未能查找到已超时的MVB定时器,也无法触发这些已超时的MVB定时器对应的动作。对此,本发明通过多次遍历各CPU的三个时间基准的红黑树,以及将超时时长过长的定时器取消,来保证MVB定时器被稳定触发,是本发明实施例的创新点之一。
4、累计误差消除算法。由于定时器在运行过程中存在一定延迟,导致MVB定时器存在延迟触发,具体的,会造成每个基本周期中MVB时段会有1~2微秒的延迟误差。为了避免在多个周期后会导致一个周期完全被累计的延迟误差所覆盖,本发明在每个基本周期中,将MVB时段的时长延长预设的误差时长,误差时长包括1微秒,也就是说,在MVB定时器(超时时长为第一超时时长)超时之后,将MVB状态再多保持一个误差时长,等待一个误差时长之后,再将预设的状态变量MVB_status置为Linux时段标识符,是本发明实施例的创新点之一。
5、新增MVB调度类。由于在Linux系统中,调度器是按照调度类的优先级,选择待执行的调度类,因此,在双状态分时的状态下,为了保证MVB任务能够被按时完成,本发明新增了MVB调度类,将MVB任务全部放在MVB调度类的就绪队列中,是本发明实施例的创新点之一。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一个实施例的示意图;
图2a为本发明中的双状态分时示意图;
图2b为本发明中MVB调度类的预设方法的流程示意图;
图3为本发明中添加MVB调度类后的结构示意图;
图4为本发明又一个实施例的示意图;
图5为本发明又一个实施例的示意图;
图6为本发明再一个实施例的示意图;
图7为本发明再一个实施例的示意图;
图8为本发明的基于Linux系统的调度处理装置的结构示意图;
图10为本发明再一个实施例的示意图;
图11为本发明中函数request_mvb_irq处理流程的示意图;
图12为本发明中函数setup_mvb_irq处理流程的示意图;
图13为本发明再一个实施例的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在Linux系统,为了提高任务的执行效率,以及保证CPU资源的利用率,提出了完全公平调度(Completely Fair Schedule,CFS)算法。在CFS算法中,由调度器调度各任务来执行。调度器分为主调度器和周期调度器,周期调度器由预设的基本周期触发。调度器是分配者,真正完成任务的选取和周期性调度的是调度类。调度类具体分为5类,每类调度类的优先级不同,当周期调度器在每个基本周期被触发时,可以选取优先级较高的调度类作为待执行调度类,再由待执行调度类从就绪队列中选取任务来执行。
但是,在基于Linux系统的列车通信网络中,对实时性要求较高的硬件设备发起的MVB任务,必须在每个预设的基本周期内的固定时间执行。比如,多功能车辆总线(Multifunction Vehicle Bus,MVB)板卡发起的数据采集任务,必须在每个预设的基本周期开始的时候执行完成。这样,MVB任务可能与调度类安排执行的其他任务发生冲突,导致MVB任务无法按时完成,影响系统的正常运行。
为了解决上述问题,本发明提出一种基于Linux系统的调度处理方法及装置,能够在基于Linux系统的列车通信网络中,保证MVB任务能够被按时稳定的执行。
下面对本发明提出的一种基于Linux系统的调度处理方法进行详细说明。
参考图1,图1为本发明一个实施例的示意图。如图1所示,基于Linux系统的调度处理方法包括如下处理步骤:
步骤101,在内核启动后,对预设的标记变量MVB_hrtimer_started进行初始化设置。
在步骤中,在内核启动之后,在kernel/sched/core.c文件中,对预设的标记变量MVB_hrtimer_started进行初始化设置,其中,所述标记变量MVB_hrtimer_started的初始值不为启动标识符。
步骤103,当预设的高精度定时器函数MVB_hrtimer启动时,将所述标记变量MVB_hrtimer_started置为启动标识符。
在本步骤中,当Linux系统中预设的高精度定时器函数MVB_hrtimer启动时,可以将预设的标记变量MVB_hrtimer_started置为启动标识符,以便可以根据预设的标记变量MVB_hrtimer_started的值,确定预设的高精度定时器函数MVB_hrtimer是否启动。
其中,hrtimer是高精度时钟技术手段,可以在内核中提供高达纳秒级的精度,以满足对时间有较高要求的应用或者驱动程序。
步骤105,判断所述标记变量MVB_hrtimer_started是否为所述启动标识符;若为是,则执行步骤107,若为否,则执行步骤106。
在本步骤中,主调度器函数通过判断所述标记变量MVB_hrtimer_started是否为所述启动标识符,来确定高精度定时器函数MVB_hrtimer是否启动。
若所述标记变量MVB_hrtimer_started为所述启动标识符,则主调度器函数可以确定高精度定时器函数MVB_hrtimer已经启动,可以执行后续步骤。
步骤106,调用函数hrtimer_init对预设的高精度定时器函数MVB_hrtimer进行初始化设置,执行步骤107。
在本步骤中,若所述标记变量MVB_hrtimer_started不为所述启动标识符,则主调度器函数可以确定高精度定时器函数MVB_hrtimer尚未启动,可以调用函数hrtimer_init对高精度定时器函数MVB_hrtimer进行初始化处理,以启动高精度定时器函数MVB_hrtimer。
步骤107,运行所述高精度定时器函数MVB_hrtimer的回调函数,设置所述回调函数中的MVB定时器的超时时长为第一超时时长,以及将预设的状态变量MVB_status置为MVB时段标识符,执行步骤109。
其中,所述第一超时时长小于预设的基本周期。
在本步骤中,若确定高精度定时器函数MVB_hrtimer已经启动,则可以运行所述高精度定时器函数MVB_hrtimer的回调函数,以及设置所述回调函数中的MVB定时器的超时时长为第一超时时长。
此外,还可以将预设的状态变量MVB_status置为MVB时段标识符。当预设的状态变量MVB_status为MVB时段标识符时,表示当前处于基本周期中划分给MVB任务的MVB时段。调度器在调度任务时,可以根据MVB时段标识符,确定当前处于基本周期中的MVB时段,进而只会对MVB任务进行调度。
其中,MVB时段标识符具体可以由具体的数值表示,比如,MVB时段标识符为1,后文中提到的Linux时段标识符为0。MVB定时器基于高精度定时器函数MVB_hrtimer,精度较高。
需要说明的是,MVB定时器的第一超时时长小于预设的基本周期。可以理解的,第一超时时长就是一个基本周期中MVB时段的长度。
可选的,所述第一超时时长的预设步骤包括:
计算预设的基本周期与预设的第一超时时长占比的第二乘积,其中,所述第一超时时长占比包括0.3;
将所述第二乘积预设为所述第一超时时长。
具体的,首先,将基本周期与预设的第一超时时长占比相乘,将得到的乘积记为第二乘积,然后,将第二乘积预设为第一超时时长。其中,可以根据MVB任务的运行时间在整个基本周期中的比例,设置第一超时时长占比。
比如,MVB任务的运行时间为整个基本周期的30%,基本周期为2毫秒,可以设置第一超时时长占比为0.3;那么,计算第一超时时长占比与基本周期的第二乘积0.3×2=0.6毫秒,也即第一超时时长为0.6毫秒。
步骤109,判断所述MVB定时器是否触发;若为是,执行步骤111。
其中,所述MVB定时器的超时时长为所述第一超时时长。
在本步骤中,当MVB定时器的超时时长为第一超时时长,且MVB定时器超时,可以认为基本周期中的MVB时段结束,在当前基本周期的接下来的时间中,不再允许执行MVB任务。
由于MVB任务均在MVB时段执行,MVB时段内不允许执行Linux系统中除MVB任务以外的其他普通任务,因此,可以避免MVB任务,与Linux系统中的其他普通任务发生冲突,保证MVB任务能够被按时完成。
步骤111,将所述状态变量MVB_status置为Linux时段标识符,以及设置所述回调函数中的MVB定时器的超时时长为第二超时时长。
其中,所述第二超时时长小于所述基本周期,且所述第一超时时长与所述第二超时时长之和等于所述基本周期。
在本步骤中,当MVB定时器的超时时长为第一超时时长,且MVB定时器超时,可以认为基本周期中的MVB时段结束,将所述状态变量MVB_status置为Linux时段标识符。
当状态变量MVB_status为Linux时段标识符时,表示当前处于基本周期中的Linux时段,Linux时段是指基本周期中划分给Linux系统中的除MVB任务以外的普通任务执行的时段。调度器在调度任务时,可以根据Linux时段标识符,确定当前处于基本周期中的Linux时段,进而只会对除MVB任务以外的普通任务进行调度。
Linux系统的双状态分时指的就是上述将基本周期划分为MVB时段和Linux时段,两个时段分别对应两种状态,MVB时段对应MVB状态,由状态变量MVB_status为MVB时段标识符表示,Linux时段对应Linux状态,由状态变量MVB_status为Linux时段标识符表示。在MVB时段,也即MVB状态中,只允许执行MVB任务,同样的,在Linux时段中,也即Linux状态中,只允许执行Linux系统中的其他普通任务。这样,MVB任务和Linux系统中的其他普通任务能够分时段执行,可以避免MVB任务和Linux系统中的其他普通任务发生冲突,保证MVB任务能够按时完成。
可以参考图2a,图2a为本发明中的双状态分时示意图。如图2a所示,在Linux系统的双状态分时状态下,基础周期T均划分为MVB时段和Linux时段,每个基础周期T的MVB时段和Linux时段循环交替。
此外,还可以设置所述回调函数中的MVB定时器的超时时长为第二超时时长。
需要说明的是,MVB定时器的第二超时时长小于预设的基本周期,且第一超时时长和第二超时时长加起来为一个完整的基本周期。可以理解的,第二超时时长就是一个基本周期中Linux时段的长度。
具体实施中,可以从一个基本周期中,减掉已确定的第一超时时长,就可以得到第二超时时长。
比如,MVB任务的运行时间为整个基本周期的30%,可以设置基本周期T中的MVB时段为0.3T,那么,第二超时时长可以为0.7T。
可选的,在步骤111中,在所述将所述状态变量MVB_status置为Linux时段标识符的步骤之前,所述方法还包括:
等待一个预设的误差时长,其中,所述误差时长包括1微秒。
在具体实施中,由于MVB定时器在运行过程中存在一定延迟,导致每个MVB时段存在1~2微秒的延迟,进而导致每个基本周期均有1~2微秒的延迟误差。这样,多个基本周期之后,会有1个基本周期被累计的误差时长完全覆盖,造成任务的执行缺少一个基本周期。
比如,每个基本周期都有2微秒的延迟,经过500个基本周期后,会有1个基本周期被累计的误差时长完全覆盖。
为了解决上述延迟误差的问题,本发明提出了累计误差消除算法。累计误差消除算法是利用拆借的思想,从Linux时段中借出1~2微秒,补充到MVB时段中。这样既可以保证基本周期的长度不变,也能够保证MVB时段的长度不变。
具体的,在MVB定时器的超时时长为第一超时时长且MVB定时器超之后,在所述将所述状态变量MVB_status置为Linux时段标识符的步骤之前,等待1~2微秒,也就是说,在MVB定时器超时(超时时长为第一超时时长)之后,将MVB时段延长1~2微秒,然后再将状态变量MVB_status置为Linux时段标识符。
这样,可以将MVB定时器引起的延迟误差包含在MVB时段中,保证基本周期的时长不变,避免出现在多个基本周期后导致一个基本周期被累计的延迟误差完全覆盖,任务的执行缺少一个基本周期的问题,保证MVB任务能够按时完成。
步骤113,判断所述MVB定时器是否触发;若为是,则返回执行步骤107。
其中,所述MVB定时器的超时时长为所述第二超时时长。
在本步骤中,判断MVB定时器是否超时;若为是,则当MVB定时器的超时时长为第二超时时长,且MVB定时器超时,可以认为基本周期中的Linux时段结束,在当前基本周期的接下来的时间中,不再允许执行Linux系统中除MVB任务以外的普通任务,Linux时段结束也就是当前基本周期结束,接下来,可以返回执行步骤107,设置新一个基本周期的MVB时段;若为否,则继续等待,直到MVB定时器超时。
可见,在本发明提出的一种基于Linux系统的调度处理方法中,将基本周期划分为MVB时段和Linux时段,由于Linux系统中除MVB任务以外的普通任务均在Linux时段执行,Linux时段内不允许执行MVB任务,因此,可以避免Linux系统中的其他普通任务,与MVB任务发生冲突,保证MVB任务能够按时完成。
在系统进行双状态分时后,需要保证在各时段下运行对应的任务。而由于linux系统的调度器在挑选调度任务的时候是按照优先级的顺序,从调度类中选取任务,这样无法保证在MVB状态下,找到MVB任务。
为了解决上述问题,本发明又提出一种基于Linux系统的调度处理方法,可以在内核中为MVB任务添加一个新的调度类,即MVB调度类,将MVB任务放在MVB调度类的就绪队列中,这样,当在MVB状态下需要调用MVB任务,只需要从MVB调度类中选取即可。
可选的,参考图2b,图2b为本发明中MVB调度类的预设方法的流程示意图。如图2b所示,MVB调度类的预设方法,包括如下步骤:
步骤201,构建预设的MVB调度类,以及执行所述MVB调度类的调度操作。
在本步骤中,可以通过新建mvb.c构建预设的MVB调度类,以及执行MVB调度类的相关调度操作,具体的,调度操作包括:选择MVB调度类的就绪队列中的待执行任务,周期性调度方法,以及将任务入队和出队等。
需要说明的是,MVB调度类的就绪队列为红黑树,可以利用红黑树对任务进行排序,将最早的截止期限的任务放在树的左下方,当选取待执行任务的时候,直接取树的左下方的任务即可。
步骤203,函数sched_init_smp通过调用函数init_sched_mvb_class,对所述MVB调度类执行初始化处理。
在本步骤中,对MVB调度类的初始化可以在sched/core.c文件中进行,具体的,由函数sched_init_smp调用init_sched_mvb_class函数实现对MVB调度类的初始化处理。
步骤205,通过函数sched_setscheduler将MVB任务放入所述MVB调度类的就绪队列。
在本步骤中,可以调用函数sched_setscheduler将任务放进MVB调度类的就绪队列中。
添加MVB调度类后的结构可以参考图3,图3为本发明中添加MVB调度类后的结构示意图。由图3可知,Linux调度类有5类,MVB调度类只有一类。
参考图4,图4为本发明又一个实施例的示意图。如图4所示,基于MVB调度类的任务处理流程如下:
步骤401,判断所述状态变量MVB_status为所述MVB时段标识符,还是所述Linux时段标识符;若所述状态变量MVB_status为所述MVB时段标识符,则执行步骤403,若所述状态变量MVB_status为所述Linux时段标识符,则执行步骤407。
在本步骤中,当主调度器需要调度任务时,可以先判断状态变量MVB_status当前为MVB时段标识符还是Linux时段标识符;若为MVB时段标识符,则说明当前处于MVB状态,可以调度MVB任务,若为Linux时段标识符,则说明当前处于Linux状态,可以调度Linux系统中除MVB任务以外的普通任务。
具体的,在主调度器中,函数pick_next_task负责对任务进行挑选。在未进行双状态分时,只需要遍历调度类确定待执行的调度类,然后将挑选任务的工作交给待执行的调度类去做。而在双状态分时之后,函数pick_next_task需要判断当前处于哪个状态,再去选择该状态对应的调度类。
步骤403,选取预设的MVB调度类。
在本步骤中,若所述状态变量MVB_status为所述MVB时段标识符,则说明当前处于MVB状态,可以选取新增的MVB调度类,以便由MVB调度类从自身的就绪队列中,选取MVB任务作为待执行任务,这样可以保证在MVB状态下只选取MVB调度类,保证MVB任务在MVB时段内按时完成。
步骤405,所述MVB调度类采用预设的最早截止时间优先(Earliest DeadlineFirst,EDF)算法,从所述MVB调度类的就绪队列中选取待执行的任务。
在本步骤中,MVB调度类采用EDF算法,从自身的就绪队列中的多个MVB任务中,选取待执行的任务。
可以理解的,MVB任务均放在MVB调度类的就绪队列中,当MVB调度类被选取时,可以从自身的就绪队列中选取MVB任务来执行,保证MVB任务在MVB时段内按时完成。
步骤407,从Linux系统中原有的多个调度类中,根据优先级选取一个待执行的调度类,以及从所述待执行的调度类的就绪队列中选取待执行的任务。
在本步骤中,若所述状态变量MVB_status为所述Linux时段标识符,则说明当前处于Linux状态,那么,可以按照Linux系统中原有的选取规则,根据各调度类的优先级顺序,选取一个调度类为待执行调度类,进而从选取的待执行调度类的就绪队列中选取待执行的任务。
Linux系统中原有的调度类为5类,按照优先级顺序,从高到低排序分别为stop_sched_class、dl_sched_class、rt_sched_class、fair_sched_class和idle_sched_class。
可以理解的,在Linux状态下,只允许上述5类调度类执行任务,不允许MVB调度类执行任务,这样可以保证在只在MVB状态下选取MVB调度类,保证MVB任务在MVB时段内按时完成。
可见,在本发明中,调度器在调度任务时,可以根据状态变量MVB_status标识的当前状态,选取对应的调度类进行任务执行,MVB状态下选取MVB调度类,由MVB调度类执行MVB任务,Linux状态下选取Linux调度类,由Linux调度类执行Linux系统中的普通任务;这样,可以保证在MVB状态下选取MVB调度类,由MVB调度类按时执行MVB任务,保证MVB任务在MVB时段内按时完成。
在具体实施中,当MVB任务较为固定时,可以按照固定比例分时,其中,分时在本发明中指的就是将基本周期划分为MVB时段和Linux时段。但是,在系统运行一段时间后,MVB任务可能会发生变化,比如,添加新的MVB任务,或者替换原有的MVB任务,或者删除某些MVB任务。
具体的,若MVB任务减少,则MVB时段中就会出现较多的空闲时间,导致CPU的利用率降低;若MVB任务增加,则可能造成MVB任务在MVB时段中无法完成,需要进入下一个基本周期的MVB时段才能继续运行,造成采集数据等MVB任务不能在基本周期内的固定时间完成,会给系统带来难以想象的后果。
可以理解的,在MVB任务可能发生变化的场景下,若仍按照固定比例进行分时,则会降低系统的执行效率,以及影响系统的正常运行。
为了解决上述问题,本发明提出了一种动态分时调整算法,能够根据MVB调度类的就绪队列中的任务情况,动态调整系统的基本周期,以及所述基本周期中MVB时段的时长,保证MVB任务的按时完成,以及提高CPU利用率。
参考图5,图5为本发明又一个实施例的示意图。如图5所示,针对图1所示的基于Linux系统的调度处理方法中的基本周期,预设步骤如下:
步骤501,通过遍历所述MVB调度类的就绪队列中的各MVB任务,获取所述各MVB任务的周期参数。
在本步骤中,可以通过遍历所述MVB调度类的就绪队列中的每个任务,获取每个任务的周期period参数。
需要说明的是,MVB任务的运行是具有一定特点的,均是以周期运行,并且各MVB任务的周期都相同或互为倍数。周期period参数就是MVB任务的周期长度,MVB任务每隔一周期执行一次。
步骤503,判断所述各MVB任务的周期参数是否相等或存在倍数关系;若为是,则执行步骤505。
在本步骤中,判断各MVB任务的周期period参数是否相等或存在倍数关系,也就是判断各MVB任务的周期长度是否相等或存在倍数关系,以便根据各MVB任务的周期长度,确定Linux系统的基本周期。
比如,MVB任务A的周期period参数为2毫秒,MVB任务B的周期period参数为4毫秒,MVB任务C的周期period参数为8毫秒;那么,这三个MVB任务的周期period参数存在倍数关系。
步骤505,将所述各MVB任务的周期参数中的最小值,确定为所述基本周期。
在本步骤中,可以将各MVB任务的周期period参数中的最小值,确定为Linux系统的基本周期。
比如,在步骤503的例子上继续说明,MVB任务A、MVB任务B和MVB任务C的周期period参数存在倍数关系,其中,MVB任务A的周期period参数2毫秒为最小值;那么,可以确定Linux系统的基本周期为2毫秒。
这样,可以根据用户需要,设置调整基本周期的频率,进而实现通过动态调整Linux系统的基本周期,使基本周期与各MVB任务的周期长度相匹配,从而减少空闲等待,提高系统运行效率。
参考图6,图6为本发明再一个实施例的示意图。如图6所示,针对图1所示的基于Linux系统的调度处理方法中的第一超长时长,预设步骤如下,其中,第一超时时长即为MVB时段的长度:
步骤601,通过遍历所述MVB调度类的就绪队列中的各MVB任务,获取所述各MVB任务的运行时长。
在本步骤中,可以遍历MVB调度类的就绪队列中的每个MVB任务,以获取各MVB任务的运行时长。
比如,MVB调度类的就绪队列中有3个MVB任务,其中,MVB任务A的运行时长为0.3毫秒,MVB任务B的运行时长为0.2毫秒,MVB任务C的运行时长为0.4毫秒。
步骤603,计算所述各MVB任务的运行时长之和。
在本步骤中,将步骤601获取的各MVB任务的运行时长加起来,得到运行时长之和。
比如,在步骤601的例子基础上进行说明,MVB任务A,MVB任务B和MVB任务C的运行时长之和为0.3+0.2+0.4=0.9毫秒。
步骤605,计算所述运行时长之和,与预设的保护系数的第一乘积;将所述第一乘积预设为所述第一超时时长。
其中,所述保护系数大于1。
在本步骤中,计算MVB调度类的就绪队列中各MVB任务的运行时长之和,与预设的保护系数的乘积,将所述乘积记为第一乘积。
需要说明的是,为了保证各MVB任务能够按时完成,MVB调度类的就绪队列中各MVB任务的运行时长之和,是基础周期中的MVB时段,也即第一超时时长的最小值。
但是,在实际应用中,由于各种原因难免出现延迟,保险起见可以设置一个保护系数,且所述保护系数大于1,将运行时长之和乘以所述保护系数,得到一个稍有余地的MVB时段时长,也即第一超时时长。
比如,在步骤603的基础上继续说明,MVB调度类的就绪队列的所有MVB任务的运行时长之和为0.9毫秒,且预设的保护系数为1.2,那么,第一超时时长为0.9×1.2=1.08毫秒。
可见,本发明可以根据MVB调度类的就绪队列中的任务情况,动态调整系统的基本周期,以及所述基本周期中MVB时段的时长,这样,在MVB任务的任务量可能会发生变化,导致执行MVB任务所需的MVB时段的时长也会发生变化的场景下,基本周期和MVB时段的时长均可以进行适应性调整,保证MVB任务的按时完成,以及提高CPU利用率。
具体实施中,MVB定时器的准确触发是保证MVB任务能够按时完成的前提。通常情况下,可以通过遍历各CPU的三个时间基准的红黑树,查找超时的MVB定时器并触发对应的动作,但是,在特殊情况下,比如有些定时器的超时时长过长,可能导致未能查找到已超时的MVB定时器,也无法触发这些已超时的MVB定时器对应的动作。
为了解决上述问题,本发明提出一种时钟冗余触发机制。参考图7,图7为本发明再一个实施例的示意图。如图7所示,时钟冗余触发机制的流程如下:
步骤701,函数hrtimer_interrupt通过遍历每个CPU对应的三个时间基准的红黑树,查询所述红黑树中是否存在定时器超时;若为否,则执行步骤703,若为是,则执行步骤707。
在本步骤中,函数hrtimer_interrupt可以通过遍历每个CPU对应的三个时间基准的红黑树,查询所述红黑树的最左下方的节点是否存在定时器超时;若为否,则执行步骤703;若为是,则执行步骤707。
步骤703,将预设的延误次数加1;判断所述延误次数是否小于或等于预设的阈值次数;若为是,则执行步骤707,若为否,则执行步骤713。
在本步骤中,若所述红黑树中不存在定时器超时,则将预设的延误次数加1,其中,预设的延误次数的初始值为0,以及判断当前的延误次数是否小于或等于预设的阈值次数,其中,阈值次数包括3。
若所述延误次数小于或等于阈值次数,则返回执行步骤701,再次遍历每个CPU对应的三个时间基准的红黑树,查询所述红黑树中是否存在定时器超时。
若所述延误次数大于阈值次数,则退出函数。
步骤707,函数run_hrtimer根据参数start_pid,判断超时定时器是否为所述高精度定时器函数MVB_hrtimer的所述MVB定时器;若为是,则执行步骤709;若为否,则执行步骤713。
步骤709,判断所述延误次数是否为0;若为否,则执行步骤711。
在本步骤中,判断延误次数是否为0,若延误次数为0,则表示没有其他定时器延误MVB定时器的执行,流程结束;若延误次数不为0,则表示有其他定时器的回调函数特别长,延误MVB定时器的执行。
步骤711,查找延误所述MVB定时器的普通定时器,函数hrtimer_cancel取消所述普通定时器。
需要说明的是,由于系统分时是系统最重要的性质,所以若MVB定时器存在延误,则通过函数hrtimer_cancel取消导致MVB定时器出现延误的普通定时器,以保证MVB定时器的稳定触发。
步骤713,退出函数。
可见,本发明可以通过多次遍历各CPU的三个时间基准的红黑树,以及将超时时长过长的定时器取消,来保证MVB定时器被稳定触发。
本发明还提供一种基于Linux系统的调度处理装置。参考图8,图8为本发明的基于Linux系统的调度处理装置的结构示意图。
如图8所示,所述装置80包括:第一设置模块801、第二设置模块802、第一判断模块803、第三设置模块804、第二判断模块805、第四设置模块806、第三判断模块807和返回模块808;所述第一设置模块801,用于在内核启动后,对预设的标记变量MVB_hrtimer_started进行初始化设置;所述第二设置模块802,用于当预设的高精度定时器函数MVB_hrtimer启动时,将所述标记变量MVB_hrtimer_started置为启动标识符;所述第一判断模块803,用于判断所述标记变量MVB_hrtimer_started是否为所述启动标识符;所述第三设置模块804,用于若所述标记变量MVB_hrtimer_started为所述启动标识符,则运行所述高精度定时器函数MVB_hrtimer的回调函数,设置所述回调函数中的多功能车辆总线MVB定时器的超时时长为第一超时时长,以及将预设的状态变量MVB_status置为MVB时段标识符,其中,所述第一超时时长小于预设的基本周期;所述第二判断模块805,用于判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第一超时时长;所述第四设置模块806,用于若所述MVB定时器触发,则将所述状态变量MVB_status置为Linux时段标识符,以及设置所述回调函数中的MVB定时器的超时时长为第二超时时长,其中,所述第二超时时长小于所述基本周期,且所述第一超时时长与所述第二超时时长之和等于所述基本周期;所述第三判断模块807,用于判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第二超时时长;所述返回模块808,用于若所述MVB定时器触发,则返回执行所述第三设置模块804。
可选的,所述装置还包括:第四判断模块,用于判断所述状态变量MVB_status为所述MVB时段标识符,还是所述Linux时段标识符;第一选取模块,用于若所述状态变量MVB_status为所述MVB时段标识符,则选取预设的MVB调度类;所述MVB调度类采用预设的最早截止时间优先EDF算法,从所述MVB调度类的就绪队列中选取待执行的任务;第二选取模块,若所述状态变量MVB_status为所述Linux时段标识符,则从Linux系统中原有的多个调度类中,根据优先级选取一个待执行的调度类,以及从所述待执行的调度类的就绪队列中选取待执行的任务。
可选的,通过如下模块预设所述MVB调度类:第一执行模块,用于构建预设的MVB调度类,以及执行所述MVB调度类的调度操作;第二执行模块,用于执行函数sched_init_smp通过调用函数init_sched_mvb_class,对所述MVB调度类执行初始化处理;第三执行模块,用于通过函数sched_setscheduler将MVB任务放入所述MVB调度类的就绪队列。
可选的,通过如下模块预设基本周期:第一遍历模块,用于通过遍历所述MVB调度类的就绪队列中的各MVB任务,获取所述各MVB任务的周期参数;第五判断模块,用于判断所述各MVB任务的周期参数是否相等或存在倍数关系;确定模块,用于若所述各MVB任务的周期参数相等或存在倍数关系,则将所述各MVB任务的周期参数中的最小值,确定为所述基本周期。
可选的,通过如下模块预设所述第一超时时长:
第二遍历模块,用于通过遍历所述MVB调度类的就绪队列中的各MVB任务,获取所述各MVB任务的运行时长;第一计算模块,用于计算所述各MVB任务的运行时长之和;第二计算模块,用于计算所述运行时长之和,与预设的保护系数的第一乘积,其中,所述保护系数大于1;第一预设模块,用于将所述第一乘积预设为所述第一超时时长。
可选的,通过如下模块预设第一超时时长:第三计算模块,用于计算预设的基本周期与预设的第一超时时长占比的第二乘积,其中,所述第一超时时长占比包括0.3;第二预设模块,用于将所述第二乘积预设为所述第一超时时长。
可选的,所述装置还包括:等待模块,用于等待一个预设的误差时长,其中,所述误差时长包括1微秒。
可选的,所述第二判断模块805和/或所述第三判断模块807,具体包括:遍历子模块、执行子模块、第一判断子模块、第二判断子模块和取消子模块;所述遍历子模块,用于由函数hrtimer_interrupt通过遍历每个CPU对应的三个时间基准的红黑树,查询所述红黑树中是否存在定时器超时;所述执行子模块,用于若所述红黑树中不存在定时器超时,则将预设的延误次数加1;判断所述延误次数是否小于或等于3,若为是,则返回执行所述函数hrtimer_interrupt通过遍历每个CPU对应的三个时间基准的红黑树的步骤,其中,所述延误次数的初始值为0;所述第一判断子模块,用于若所述红黑树中存在定时器超时,则函数run_hrtimer根据参数start_pid,判断超时定时器是否为所述高精度定时器函数MVB_hrtimer的所述MVB定时器;所述第二判断子模块,用于若超时定时器是所述高精度定时器函数MVB_hrtimer的所述MVB定时器,则判断所述延误次数是否为0;所述取消子模块,用于若所述延误次数不为0,则查找延误所述MVB定时器的普通定时器,函数hrtimer_cancel取消所述普通定时器。
可选的,所述装置还包括:初始化模块,用于若所述标记变量MVB_hrtimer_started不为所述启动标识符,则调用函数hrtimer_init对预设的高精度定时器函数MVB_hrtimer进行初始化设置。
可见,在本发明提出的一种基于Linux系统的调度处理装置中,将基本周期划分为MVB时段和Linux时段,由于Linux系统中除MVB任务以外的普通任务均在Linux时段执行,Linux时段内不允许执行MVB任务,因此,可以避免Linux系统中的其他普通任务,与MVB任务发生冲突,保证MVB任务能够按时完成。
实际应用中,在基于Linux系统的列车通信网络中,针对实时性要求较高的实施硬件设备,包括MVB板卡,所发起的中断处理程序,需要立即被执行。而现有的Linux系统中,所有的中断处理程序在进行线程化处理后,将中断线程与其他任务一起放入实时调度队列按照先入先出的顺序依次执行,也即实时调度类rt_sched_class的就绪队列中,若实时硬件设备发起的中断处理程序加入中断线程,且该中断线程的前面排有其他中断线程或任务,则实时硬件设备发起的中断处理程序需要等待前面的中断线程或任务执行完毕后才能被执行。这样会造成系统延迟,导致数据丢失甚至系统崩溃。
为了使得这类中断处理程序能够被立即执行,保证MVB板卡发出的指令能够被按时和及时执行,维护系统的稳定性。本发明还提出了一种基于Linux系统的中断处理方法,通过并行中断机制,保证实时硬件设备发起的中断处理程序能够被立即执行。
结合基于Linux系统的中断处理方法及装置,本发明能够保证在基于Linux系统的列车通信网络中,MVB板卡发出的指令,包括MVB任务和中断处理程序能够被按时和及时完成,以便维护列车通信网络的稳定性,保证列车通信网络的稳定运行。
下面对本发明提出的一种基于Linux系统的中断处理方法进行说明。
参考图10,图10为本发明再一个实施例的示意图。如图10所示,基于Linux系统的中断处理方法包括如下处理步骤:
步骤1001,函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断是否将所述中断注册申请发送给预设的函数request_mvb_irq;若为是,则执行步骤1003。
在本步骤中,函数request_irq在接收到硬件设备发起的中断注册申请之后,可以根据中断注册申请携带的中断号,判断发起中断注册申请的硬件设备是否为预设的实时硬件设备。
若硬件设备为预设的实时硬件设备,则可以将中断注册申请发送给预设的函数request_mvb_irq,以便通过后续步骤实现非线程化处理。
若硬件设备不为预设的实时硬件设备,则按照Linux系统中现有的针对中断处理程序的处理流程进行处理。
步骤1003,所述函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,执行步骤1005。
其中,所述关键属性包括非线程化属性和非共享属性。
在本步骤中,函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性,具体包括非线程化属性和非共享属性,以便后续步骤根据关键属性对该中断处理程序。
需要说明的是,函数request_mvb_irq是本发明新建的,是申请非线程化中断的实际执行函数。除了设置中断号对应的中断处理程序的关键属性,函数request_mvb_irq还执行如下处理:
1)检查中断号是否是为分配的中断号,若不是,则返回错误值。
具体的,可以检测接收到的中断注册申请携带的中断号是否是预先分配给实时中断设备的,若为是,则继续后续流程,若为否,则处理中断,返回错误值。
2)根据中断注册申请携带的参数构建irqaction结构体。
其中,中断注册申请携带的主要参数包括中断号irq和执行中断处理程序的函数handler。
具体的,可以为中断注册申请创建irqaction结构体,将从中断注册申请中获取的irq和handler等参数,赋值给irqaction结构体中相应的字段。
3)调用函数setup_mvb_irq来设置中断的回调过程。
具体的,当发生指定中断时,将会回调被设置的过程。
4)根据函数setup_mvb_irq的返回结果来判断申请中断是否成功。
函数request_mvb_irq的处理流程可以参考图11,图11为本发明中函数request_mvb_irq处理流程的示意图。
步骤1005,预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,执行步骤1007。
其中,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,所述非共享标识符用于标识取消针对中断描述符数组irq_desc的遍历处理。
在本步骤中,在函数request_mvb_irq设置所述中断号对应的中断处理程序的关键属性之后,预设的函数setup_mvb_irq根据关键属性中的非线程化属性,设置所述中断号对应的非线程化标识符,以及根据关键属性中的非共享属性,设置所述中断号对应的非共享标识符,以便后续步骤中根据上述两个标识符,对该中断号对应的中断处理程序进行非线程化处理。
需要说明的是,函数setup_mvb_irq是本发明新建的。除了设置中断号对应的两个标识符,函数setup_mvb_irq还执行如下处理:
1)irq_desc结构体进行验证,以确定参数正确性。
2)判断irq_desc结构体上是否有irqaction结构体,若有,则返回失败。
具体的,表明所述中断请求线对应的预设的中断描述符数组irq_desc中已经设置了中断处理程序描述符irqaction。
3)设置irq对cpu的亲和性(affinity),以使进程在给定的CPU上尽量长时间地运行而不被迁移到其他处理器。
4)将irqaction结构体放在irq_desc结构体链表最后,以设置所述中断号对应的非线程化标识符。
5)注册相关的proc文件系统节点,以便获取系统内核数据。
函数setup_mvb_irq的处理流程可以参考图12,图12为本发明中函数setup_mvb_irq处理流程的示意图。
步骤1007,内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符,执行步骤1009。
在本步骤中,当硬件设备发起中断处理程序后,内核可以调用函数do_IRQ进行处理,具体的,可以查询所述中断处理程序携带的中断号对应的标识符,以便后续步骤可以根据标识符,判断是否对中断处理程序进行非线程化处理。
步骤1009,判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;若为是,则执行步骤1011。
在本步骤中,函数do_IRQ可以判断查询到的中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符,若为是,则可以确定所述中断处理程序的由实施硬件设备发起的,可以对所述中断处理程序进行非线程化处理。
步骤1011,通过预设的函数handle_mvb_irq_percpu,取消针对所述中断处理程序的线程化处理,以及取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,执行步骤1013。
其中,所述中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应。
在本步骤中,由于所述中断号对应的标识符包括所述非线程化标识符,说明携带该中断号的中断处理程序是实时硬件设备,因此,函数handle_mvb_irq_percpu取消针对所述中断处理程序的线程化处理,以便该中断处理程序能够被立即执行。
由于所述中断号对应的标识符包括所述非共享标识符,因此函数handle_mvb_irq_percpu取消对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理。
需要说明的是,一个中断请求线由一个中断描述符数组irq_desc来表示,中断描述符数组irq_desc中的中断处理程序描述符irqaction用于保存硬件设备的中断执行信息,一个中断处理程序描述符irqaction存储一个硬件设备的中断执行信息。
当一个中断请求线连接多个硬件设备时,该中断请求线对应的中断描述符数组irq_desc中存在多个中断处理程序描述符irqaction,每个中断处理程序描述符irqaction保存有一个硬件设备的中断执行信息。因此,当需要获取其中一个硬件设备的中断执行信息时,需要遍历中断描述符数组irq_desc中的多个中断处理程序描述符irqaction。
当一个中断请求线连接一个硬件设备时,该中断请求线对应的中断描述符数组irq_desc中只存在一个中断处理程序描述符irqaction,这个中断处理程序描述符irqaction保存有中断请求线连接的唯一一个硬件设备的中断执行信息,因此,当需要获取其中一个硬件设备的中断执行信息时,无需遍历中断描述符数组irq_desc中的多个中断处理程序描述符irqaction就能够找到这个硬件设备的中断执行信息。
在本发明中,一根中断请求线连接一个实时硬件设备,那么,该中断请求线对应的中断描述符数组irq_desc中只存在一个中断处理程序描述符irqaction,因此,可以取消对中断描述符数组irq_desc中的中断处理程序描述符irqaction的遍历处理,可以从预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction中,获取中断处理程序的中断执行信息。
步骤1013,在中断上下文中,执行所述中断处理程序。
在本步骤中,非线程化的中断处理程序可以通过调用action->handler,相当于在中断上下文执行中断处理程序,若返回值为IRQ_HANDLED,则表示中断处理程序已经处理结束,直接结束函数。
其中,若返回值为IRQ_NONE,则表示中断处理程序不存在;若返回值为IRQ_HANDLED,则表示中断处理程序已经被正确处理;若返回值为IRQ_WAKE_THREAD,则表示中断处理程序已经被线程化处理,需要唤醒对应的中断线程。
可见,本发明提出的基于Linux系统的中断处理方法中,通过并行中断机制,对实时硬件设备和普通硬件设备发起的中断处理程序,执行不同的处理方式,不再对实时硬件设备发起的中断处理程序进行中断线程化处理,也就是说,实时硬件设备发起的中断处理程序不再进入实时调度队列,避免实时调度队列存在其他中断线程或任务,导致实时硬件设备发起的中断处理程序需要等待前面的中断线程或任务执行完毕后才能被执行,保证实时硬件设备发起的中断处理程序能够被立即执行。
结合基于Linux系统的调度处理方法及装置,能够保证在基于Linux系统的列车通信网络中,MVB板卡发出的指令能够被按时和及时执行,维护列车通信网络的稳定性,保证列车通信网络的稳定运行。
又一种实施例中,本发明又提出的一种基于Linux系统的中断处理方法。参考图13,图13为本发明再一个实施例的示意图。如图13所示,基于Linux系统的中断处理方法包括如下处理步骤:
步骤4001,函数request_irq在接收到硬件设备发起的中断注册申请之后,根据所述中断注册申请携带的中断号,判断所述中断注册申请携带的中断号,是否为预设的非线程化中断号;若为是,则执行步骤4003,若为否,则执行步骤4006。
需要说明的是,可以对实时硬件设备分配预设的非线程化中断号,这样,根据硬件设备发起的中断注册申请所携带的中断号,就能够判断出发起中断注册申请的硬件设备是否为实时硬件设备,进而确定是否需要进行非线程化处理,若要进行非线程化处理,就需要将中断注册申请发送给预设的函数request_mvb_irq来处理。
步骤4003,将所述中断注册申请发送给预设的函数request_mvb_irq,通过所述函数request_mvb_irq,设置所述中断号对应的中断处理程序的关键属性,执行步骤4005。
其中,所述关键属性包括非线程化属性和非共享属性。
步骤4005,预设的函数setup_mvb_irq根据所述非线程化属性,设置所述中断号对应的非线程化标识符,以及根据所述非共享属性,设置所述中断号对应的非共享标识符,执行步骤4007。
其中,所述非线程化标识符用于标识取消针对中断处理程序的强制线程化的处理过程,所述非共享标识符用于标识取消针对中断描述符数组irq_desc的遍历处理。
步骤4006,将所述中断注册申请发送给函数request_threaded_irq,通过所述函数request_threaded_irq,设置所述中断号对应的线程化标识符和共享标识符,执行步骤4007。
在本步骤,若所述中断注册申请携带的中断号不为预设的非线程化中断号,则说明发起中断注册申请的硬件设备为普通设备,不为实时硬件设备,可以对中断处理程序进行现有的线程化处理,并且,通常情况下,多个普通设备共享一条中断请求线。因此,可以将所述中断注册申请发送给函数request_threaded_irq,通过所述函数request_threaded_irq,设置所述中断号对应的线程化标识符和共享标识符,以便后续步骤对中断处理程序进行线程化处理,以及遍历中断描述符数组irq_desc中的多个中断处理程序描述符irqaction。
步骤4007,内核在接收到硬件设备发起的中断处理程序之后,通过调用函数do_IRQ,查询所述中断处理程序携带的中断号对应的标识符,执行步骤4009。
步骤4009,判断查询到的所述中断号对应的标识符是否包括所述非线程化标识符和所述非共享标识符;若为是,则执行步骤4011,若为否,则执行步骤4015。
步骤4011,通过预设的函数handle_mvb_irq_percpu,根据所述中断号对应非线程化标识符,不将所述中断处理程序放入预设的中断线程;以及根据所述中断号对应非共享标识符,从预设的中断描述符数组唯一一个中断处理程序描述符irqaction中,读取所述中断处理程序的中断执行信息,执行步骤4013。
其中,所述预设的中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应。
在本步骤中,若查询到所述中断号对应标识符包括非线程化标识符和非共享标识符,则可以根据标识符,通过预设的函数handle_mvb_irq_percpu,根据所述中断号对应非线程化标识符,不将所述中断处理程序放入预设的中断线程,以便对中断处理程序进行非线程化处理;以及根据所述中断号对应非共享标识符,从预设的中断描述符数组irq_desc唯一一个中断处理程序描述符irqaction中,读取所述中断处理程序的中断执行信息,免去遍历中断描述符数组irq_desc的处理过程。
步骤4013,根据所述中断执行信息,在中断上下文中执行所述中断处理程序。
步骤4015,确定查询到所述中断号对应标识符包括线程化标识符和共享标识符;通过预设的函数handle_irq_event_percpu,对所述中断处理程序进行线程化处理,以及对预设的中断描述符数组irq_desc中的中断处理程序描述符irqaction进行遍历处理,获取待执行的中断处理程序的中断执行信息,执行步骤4017。
其中,所述预设的中断描述符数组irq_desc与所述硬件设备连接的中断请求线对应。
在本步骤中,由于中断处理程序是普通设备发起的,且所述中断号对应标识符包括线程化标识符和共享标识符,可以按照现有的线程化流程对中断处理程序进行处理。
步骤4017,根据所述中断执行信息,在线程上下文中执行所述中断处理程序。
在本步骤中,对于线程化的中断处理程序,可以根据中断执行信息,在线程上下文中执行所述中断处理程序。
需要说明的是,并行中断机制的技术效果如下:
1)保证实时硬件设备发起的中断处理程序的执行属于硬件中断上下文,不被线程化,这样避免设备中断的等待。
2)保证实时硬件设备发起的中断处理程序不会被屏蔽。
3)提供单独的IRQ线给实时硬件设备,不与其它设备驱动程序进行共享。
4)保证实时硬件设备发起的中断处理程序会被立即执行。
并行中断机制本质是为实时硬件设备提供另外一套中断申请和执行程序,保证基于Linux系统的列车通信网络中,实时硬件设备发起的中断处理程序的执行满足入表1所示的条件:
表1
其中,原中断机制是指现有的Linux系统中的中断机制。
在针对实时硬件设备发起的中断处理程序的处理中,使用函数request_mvb_irq来作为新的申请接口,进行非线程化中断的设置与申请。并且内部会调用函数setup_mvb_irq来进行更深层次的设置。在中断处理过程中,并行中断机制采用handle_mvb_event_percpu函数来处理实时硬件设备发起的中断处理程序。
需要说明的是,本发明实施例及附图中的术语“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。
本领域普通技术人员可以理解:附图只是一个实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。本领域普通技术人员可以理解:实施例中的装置中的模块可以按照实施例描述分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围。
Claims (10)
1.一种基于Linux系统的调度处理方法,其特征在于,包括:
在内核启动后,对预设的标记变量MVB_hrtimer_started进行初始化设置;
当预设的高精度定时器函数MVB_hrtimer启动时,将所述标记变量MVB_hrtimer_started置为启动标识符;
判断所述标记变量MVB_hrtimer_started是否为所述启动标识符;
若为是,则运行所述高精度定时器函数MVB_hrtimer的回调函数,设置所述回调函数中的多功能车辆总线MVB定时器的超时时长为第一超时时长,以及将预设的状态变量MVB_status置为MVB时段标识符,其中,所述第一超时时长小于预设的基本周期;
判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第一超时时长;
若为是,则将所述状态变量MVB_status置为Linux时段标识符,以及设置所述回调函数中的MVB定时器的超时时长为第二超时时长,其中,所述第二超时时长小于所述基本周期,且所述第一超时时长与所述第二超时时长之和等于所述基本周期;
判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第二超时时长;
若为是,则返回执行所述设置所述回调函数中的多功能车辆总线MVB定时器的超时时长为第一超时时长的步骤。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
判断所述状态变量MVB_status为所述MVB时段标识符,还是所述Linux时段标识符;
若所述状态变量MVB_status为所述MVB时段标识符,则选取预设的MVB调度类;所述MVB调度类采用预设的最早截止时间优先EDF算法,从所述MVB调度类的就绪队列中选取待执行的任务;
若所述状态变量MVB_status为所述Linux时段标识符,则从Linux系统中原有的多个调度类中,根据优先级选取一个待执行的调度类,以及从所述待执行的调度类的就绪队列中选取待执行的任务。
3.根据权利要求2所述的方法,其特征在于,所述MVB调度类的预设方法,包括如下步骤:
构建预设的MVB调度类,以及执行所述MVB调度类的调度操作;
函数sched_init_smp通过调用函数init_sched_mvb_class,对所述MVB调度类执行初始化处理;
通过函数sched_setscheduler将MVB任务放入所述MVB调度类的就绪队列。
4.根据权利要求2所述的方法,其特征在于,所述基本周期的预设步骤包括:
通过遍历所述MVB调度类的就绪队列中的各MVB任务,获取所述各MVB任务的周期参数;
判断所述各MVB任务的周期参数是否相等或存在倍数关系;
若为是,则将所述各MVB任务的周期参数中的最小值,确定为所述基本周期。
5.根据权利要求2所述的方法,其特征在于,所述第一超时时长的预设步骤包括:
通过遍历所述MVB调度类的就绪队列中的各MVB任务,获取所述各MVB任务的运行时长;
计算所述各MVB任务的运行时长之和;
计算所述运行时长之和,与预设的保护系数的第一乘积,其中,所述保护系数大于1;
将所述第一乘积预设为所述第一超时时长。
6.根据权利要求1所述的方法,其特征在于,所述第一超时时长的预设步骤包括:
计算预设的基本周期与预设的第一超时时长占比的第二乘积,其中,所述第一超时时长占比包括0.3;
将所述第二乘积预设为所述第一超时时长。
7.根据权利要求1至6任一所述的方法,其特征在于,在所述将所述状态变量MVB_status置为Linux时段标识符的步骤之前,所述方法还包括:
等待一个预设的误差时长,其中,所述误差时长包括1微秒。
8.根据权利要求1所述的方法,其特征在于,所述判断所述MVB定时器是否触发的步骤,包括:
函数hrtimer_interrupt通过遍历每个CPU对应的三个时间基准的红黑树,查询所述红黑树中是否存在定时器超时;
若所述红黑树中不存在定时器超时,则将预设的延误次数加1;判断所述延误次数是否小于或等于3,若为是,则返回执行所述函数hrtimer_interrupt通过遍历每个CPU对应的三个时间基准的红黑树的步骤,其中,所述延误次数的初始值为0;
若所述红黑树中存在定时器超时,则函数run_hrtimer根据参数start_pid,判断超时定时器是否为所述高精度定时器函数MVB_hrtimer的所述MVB定时器;
若为是,则判断所述延误次数是否为0;
若为否,则查找延误所述MVB定时器的普通定时器,函数hrtimer_cancel取消所述普通定时器。
9.根据权利要求1所述的方法,其特征在于,在所述判断所述标记变量MVB_hrtimer_started是否为所述启动标识符的步骤之后,所述方法还包括:
若为否,则调用函数hrtimer_init对预设的高精度定时器函数MVB_hrtimer进行初始化设置。
10.一种基于Linux系统的调度处理装置,其特征在于,所述装置包括:第一设置模块、第二设置模块、第一判断模块、第三设置模块、第二判断模块、第四设置模块、第三判断模块和返回模块;
所述第一设置模块,用于在内核启动后,对预设的标记变量MVB_hrtimer_started进行初始化设置;
所述第二设置模块,用于当预设的高精度定时器函数MVB_hrtimer启动时,将所述标记变量MVB_hrtimer_started置为启动标识符;
所述第一判断模块,用于判断所述标记变量MVB_hrtimer_started是否为所述启动标识符;
所述第三设置模块,用于若所述标记变量MVB_hrtimer_started为所述启动标识符,则运行所述高精度定时器函数MVB_hrtimer的回调函数,设置所述回调函数中的多功能车辆总线MVB定时器的超时时长为第一超时时长,以及将预设的状态变量MVB_status置为MVB时段标识符,其中,所述第一超时时长小于预设的基本周期;
所述第二判断模块,用于判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第一超时时长;
所述第四设置模块,用于若所述MVB定时器触发,则将所述状态变量MVB_status置为Linux时段标识符,以及设置所述回调函数中的MVB定时器的超时时长为第二超时时长,其中,所述第二超时时长小于所述基本周期,且所述第一超时时长与所述第二超时时长之和等于所述基本周期;
所述第三判断模块,用于判断所述MVB定时器是否触发,所述MVB定时器的超时时长为所述第二超时时长;
所述返回模块,用于若所述MVB定时器触发,则返回执行所述第三设置模块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011318413.6A CN112433834B (zh) | 2020-11-23 | 2020-11-23 | 一种基于Linux系统的调度处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011318413.6A CN112433834B (zh) | 2020-11-23 | 2020-11-23 | 一种基于Linux系统的调度处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112433834A true CN112433834A (zh) | 2021-03-02 |
CN112433834B CN112433834B (zh) | 2023-01-13 |
Family
ID=74693514
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011318413.6A Active CN112433834B (zh) | 2020-11-23 | 2020-11-23 | 一种基于Linux系统的调度处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112433834B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102043667A (zh) * | 2010-11-25 | 2011-05-04 | 深圳市科陆电子科技股份有限公司 | 一种嵌入式操作系统的任务调度方法 |
CN107203428A (zh) * | 2017-05-25 | 2017-09-26 | 电子科技大学 | 一种基于Xen的VCPU多核实时调度算法 |
CN109445939A (zh) * | 2018-10-19 | 2019-03-08 | 积成电子股份有限公司 | 一种基于主动出让机制的软实时调度内核的调度方法 |
-
2020
- 2020-11-23 CN CN202011318413.6A patent/CN112433834B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102043667A (zh) * | 2010-11-25 | 2011-05-04 | 深圳市科陆电子科技股份有限公司 | 一种嵌入式操作系统的任务调度方法 |
CN107203428A (zh) * | 2017-05-25 | 2017-09-26 | 电子科技大学 | 一种基于Xen的VCPU多核实时调度算法 |
CN109445939A (zh) * | 2018-10-19 | 2019-03-08 | 积成电子股份有限公司 | 一种基于主动出让机制的软实时调度内核的调度方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112433834B (zh) | 2023-01-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5790851A (en) | Method of sequencing lock call requests to an O/S to avoid spinlock contention within a multi-processor environment | |
EP1538497B1 (en) | Distributed real time operating system | |
US5452452A (en) | System having integrated dispatcher for self scheduling processors to execute multiple types of processes | |
US6633942B1 (en) | Distributed real-time operating system providing integrated interrupt management | |
US9733981B2 (en) | System and method for conditional task switching during ordering scope transitions | |
US8522250B2 (en) | Managing access to a shared resource in a data processing system | |
CN111897637B (zh) | 作业调度方法、装置、主机及存储介质 | |
KR20130091368A (ko) | 커널 수행 순서 스케줄링 방법 및 장치 | |
CN111597044A (zh) | 任务调度方法、装置、存储介质及电子设备 | |
CN112433834B (zh) | 一种基于Linux系统的调度处理方法及装置 | |
Horowitz | A run-time execution model for referential integrity maintenance | |
EP2840513B1 (en) | Dynamic task prioritization for in-memory databases | |
EP3399412A1 (en) | Method and apparatus for scheduling tasks to a cyclic schedule | |
CN111158875B (zh) | 基于多模块的多任务处理方法、装置及系统 | |
CN112433835B (zh) | 一种基于Linux系统的中断处理方法及装置 | |
CN114548389A (zh) | 异构计算中计算单元的管理方法及相应处理器 | |
CN114661415A (zh) | 调度方法及计算机系统 | |
EP1088269A2 (en) | Object-oriented system having anonymous scheduler design pattern | |
CN108845870B (zh) | 一种基于pWCET整形的概率性实时任务调度方法 | |
WO1992003794A1 (en) | Dual level scheduling of processes | |
Ramasubramanian et al. | Studies on Performance Aspect of Scheduling Algorithms on Multicore Platform | |
CN110968418A (zh) | 基于信号-槽的大规模有约束并发任务的调度方法与装置 | |
US20060048150A1 (en) | Task management methods and related devices | |
CN111324432B (zh) | 处理器调度方法、装置、服务器及存储介质 | |
CN114185666A (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 |