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

一种分时系统下周期性调度线程的调度管理方法与流程

2022-03-16 12:19:12 来源:中国专利 TAG:

1.本发明涉及软件周期性线程调度控制领域,特别涉及一种分时系统下周期性调度线程的调度管理方法。


背景技术:

2.随着软件开发工作的深入,软件系统因业务需求的累计,导致软件体积的不断扩大,软件的模块化需要及多线程的高并发控制需求越来越迫切。软件系统中的多线程任务根据线程的生存周期和调度方式可分类为:
3.1、临时线程:动态创建用于处理及时性运算任务或短暂的并发事务,此类线程在运行完毕便消亡了。例如:消息机制中对于及时消息的处理、大数据的拆分并发处理以提高数据运算速度等。
4.2、全局线程:软件系统生存周期从开始便存在直到结束消亡的线程,主要用于统筹全局规划系统各模块之间调度,如线程池。
5.3、周期性调度线程:这类线程特点是及时创建,但与临时线程不同并不随任务的结束而消亡,而是根据系统时钟,以用户定义的时钟周期进行间断性调度,最直观的此类线程为操作系统下的定时器api。
6.实时操作系统是保证一定时间限制内完成特定功能的操作系统。要求是在固定时钟周期内完成既定的任务后,执行中断以检查是否存在新的输入以响应决定后续处理。如果既定周期内不能完成任务则直接报错,此类操作系统往往表现出高精度计时准确性。
7.分时操作系统将系统的处理时间划分为极小时间间隔,将整个系统的进程任务以轮换执行的方式调度到cpu中进行执行,同等硬件并发能力情况下较之实时系统具有更多任务的并发能力。由于其高速的任务切换,各任务如同在同一系统下并发执行一般,效增加资源的使用率。
8.对于周期性调度线程在分时系统中,因为其碎片化的cpu处理周期以及操作系统的线程调度逻辑、与系统代码块的时分复用与空分复用原则,导致代码段被调度到cpu后若其代码段被反复命中,使代码段无法从cpu中换出而抱死cpu资源的现象,诱发了其他线程代码段无法被cpu调度替换或替换不及时的情况,最终展现为软件对于实时数据或用户输入响应的延时效果。实时系统中往往为这些周期性调度线程分配了更大的处理时间以及cpu中断后必须检查响应新的输入因此并不存在此类问题。
9.传统方式下对于周期性调度线程采用基于操作系统的定时器api策略,由操作系统提供通过调用底层接口创建定时器对象,为该对象设置调度时钟周期与分配任务后由操作系统进行调度控制,往往因分时操作系统的原因导致定时器调度时间不准确问题。以windows操作系统为例,虽然api基于操作系统时钟通过信号量触发,且其时钟周期精度为纳秒级(由操作系统定义),但此时间间隔总是被定义为距离上次调用完成后经历多长时间后再次调度的方式,存在两个问题:1、如果分配给定时器的任务,在某一时刻执行失败那么该任务仍将等待规定时间后才能调度,引发数据缺帧丢帧的情况无法满足用户对于高时效
性数据的需要。2、由分时操作系统导致,由于任务执行被cpu碎片化调度使规定时间内无法完成指定的任务,引发数据挤压滞后等异常情况。对于高精度高时效性数据需求的软件系统在解决该类问题时,均只能考虑通过指定线程优先级的方式来调试,增建了软件调试工作量与多线程调度管理的难度。其次对于定时器的调度往往需要频繁检查信号量是否触发,引发cpu高占用的资源浪费等问题。
10.基于上述问题,本技术为了保障软件系统下多线程并发的周期性线程的及时性同时降低这类多线程并发的管理难度,设计基于模块控制的高并发定时器模块结合管理策略以解决此类问题。


技术实现要素:

11.本发明的目的在于克服现有技术的不足,提供一种分时系统下周期性调度线程的调度管理方法,采用调度管理和定时器的设置来实现周期性调度线程的执行管理和控制。
12.为了实现上述目的,本发明采用的技术方案为:一种分时系统下周期性调度线程的调度管理方法,在进行周期性调度线程调度时,创建一个定时器对象组用于存储管理定时器对象,该定时器对象组用于在时间到达组内最早运行时间后,取出时间对应任务内容分配新线程执行对应任务;所有定时器对象由该对象组统一管理,所述定时器用于记录该任务的周期性调度时间间隔及分配给该对象的任务。
13.采用分配异步线程的方式对最早运行时间对应的定时器对象的任务进行执行。
14.在从定时器对象组中获取最早时间对应的最早运行对象时,在定时器对象插入过程中根据其最早调度时间进行排序;对于刚创建的定时器以定时器创建当前时间为其最早运行时间,从而为定时器运行提供时钟周期参照标准:当定期器开始工作时,以该时钟作为起点开始保持时间间隔的调度运行。
15.采用时间作为参考的信号量触发机制对定时器对象组内的各对象进行查看管理:
16.进入等待获取get_one时,先获取组内最早运行时间时刻;
17.1)如果对象组中不存在对象则将该线程挂起进入死等状态,由定时器插入操作或者对象组消亡操作进行异步唤醒;
18.2)判定最早时间是否已经到达,若没到达则将条件等待的等待时间修改为该时刻后同样挂起本线程,直到时间到达后唤醒;
19.3)最早执行时间到达,从等待对象组中正式获取该时间对应的对象,并执行当前定时器对象所分配的任务。
20.当已获取当前最早执行的定时器对象并为其任务分配了异步执行的线程资源进行执行,在定时器对象执行既定的任务时,当任务正确执行则根据先前最早执行时间与设定的时间间隔推算新的最早执行时间;若任务执行失败则不对最早执行时间进行更新,并在本轮执行完成后重新将对象插入定时器对象组中调度管理以实现周期性触发效果。
21.在定时器对象任务执行后,对当前最早执行时间与当前系统时间进行对比,如果超出当前系统时间则直接继续执行,否则加入对象组中进行管理调度。
22.本发明的优点在于:实现了单线程模块利用系统时钟完成对于多个周期性调度线程的分配管理,同等任务数量情况下可以有效降低cpu的使用率,同等任务数量情况下可使得cpu使用率降低300%。采用自定义线程调度策略,使周期性调度模块在分时操作系统环
境中仍然具有实时操作系统下高精度的时钟周期调度特性。
具体实施方式
23.下面对通过对最优实施例的描述,对本发明的具体实施方式作进一步详细的说明。
24.本发明为了保障软件系统下多线程并发的周期性线程的及时性同时降低这类多线程并发的管理难度,设计基于模块控制的高并发定时器模块以解决此类问题。以下对周期性调度线程的方式以定时器操作做简要说明。
25.本技术主要解决如下问题:
26.1、在分时系统下依旧保持与实时系统周期性调用线程的时钟精度
27.2、降低周期性调度线程多线程并发管理难度
28.3、降低cpu资源占用情况。
29.传统意义上理解定时器api,创建多个定期器对象分配同等数量的线程,cpu调度调度对应线程时检查当前定时器对象信号量,如果信号量触发则执行任务否则转而执行其他线程。
30.为了解决上述问题,本技术以将其分为多个小问题并基于各个问题给出对应的方案,各问题均为本技术采用定时器对象组进行调度处理后带来的问题及其解决方案,具体介绍如下:
31.问题1:如何处理周期性调度线程需要分配对应数量线程资源问题
32.换一种思路:在概念上周期性调度线程实际上是根据时间来唤醒定时器信号量后进行调度的,而时间作为顺序递增累加的结果不存在穿插、切片划分的情况。那么创建一个定时器对象组用于存储管理定时器对象,该对象组的职责是在时间到达组内最早运行时间后,取出时间对应任务内容分配新线程执行对应任务。此方式主要用于解决传统定时器新建对象需要分配对应数量线程资源的问题,此时所有定时器对象由该对象组统一管理外,定时器仅需记录该任务的周期性调度时间间隔及分配给该对象的任务即可。
33.对于最早执行时间定时器对象任务的执行采用分配异步线程的方式,因为每次只能从对象组中取出一个对象进行执行,如果采用同步的方式等待该定时任务执行完后再取新任务执行,若在同步执行过程中存在新的定时器达到运行时间,则会滞后这个新对象的调度时间。对于为何此处可以分配异步任务交由系统控制其有效性将在之后给出解释。
34.问题1.1如何实现获取对象组内快速获取最早运行对象
35.在定时器对象插入过程中根据其最早调度时间进行排序。对于刚创建的定时器以定时器创建当前时间为其最早运行时间,此做法主要为定时器运行提供时钟周期参照标准:当定期器开始工作时,以该时钟作为起点开始保持时间间隔的调度运行,无论任务执行超前或滞后都依赖此时钟周期与时刻对于任务调度频率进行动态调整。
36.定时器对象插入规则:根据定时器对象最早执行时间确认对象组内顺序,当然如果该定时器对象已经存在与组内则本次插入操作为异常。attach为对象组插入对象操作的对外接口。
37.问题1.2关键性问题:定时器组内虽然按照最早执行时间排序了,各对象间最早运行时间间隔差距必定存在不一致问题,若采用轮询的方式查看必然导致对cpu资源占比需
求的提高
38.与操作系统相同依旧采用时间作为参考的信号量触发机制,但不再采取轮询的方式进行遍历。
39.1)进入等待获取get_one时(get_one函数执行功能为从等待对象组中获取首个元素),先获取组内最早运行时间时刻。
40.1.1)如果对象组中不存在对象则将该线程挂起进入死等状态,由定时器插入操作或者对象组消亡操作进行异步唤醒。
41.2)判定最早时间是否已经到达,若没到达则将条件等待的等待时间修改为该时刻后同样挂起本线程,直到时间到达后唤醒。在等待组执行插入与消亡操作时仍然可以对该挂起操作进行唤醒,原因是如果除对象组外存在新的定时器任务需要立刻响应或等待组消亡,该线程依旧可以保障响应的及时性。
42.3)最早执行时间到达,从等待对象组中正式获取该时间对应对象,并执行当前定时器对象所分配的任务。与一般流程不同,为了同时响应等待组外插入与消亡操作必须增加二次判断以防等待组数据无效的情况。等待对象组为高并发下,所有周期性调度任务的缓存队列,按照时间进行排序。
43.问题2:已获取当前最早执行对象并为其任务分配了异步执行的线程资源,如何合理规划任务的执行
44.前面的方案只解决了基于系统时间对序列化的定时器对象组进行线程任务资源的统一化管理、分配、执行的策略定义。对于定时器对象单独调度执行仍存在以下问题:
45.问题2.1单个定时器对象任务执行方式
46.定时器对象执行既定的任务,当任务正确执行则根据先前最早执行时间与时间间隔推算新的最早执行时间;若任务执行失败则不对最早执行时间进行更新,并在本轮执行完成后重新将对象插入定时器对象组中调度管理以实现周期性触发效果。
47.为什么这么做?重新理解对于周期性调度任务的定义:充分保证在指定时间间隔内执行一次既定任务。
48.周期性任务调度实际需求:
49.1、对于任务本身,充分非必要在一个时间间隔内完成既定任务;
50.2、对于调度方式,充分必要在一次时间间隔内能正确执行一次既定任务;
51.那么如果当前调度失败,因暂时使当前线程暂时放弃cpu所有权,由运行变为就绪状态。cpu检查当前所有线程中是否存在线程竞争情况,待cpu空闲时再将该线程就绪进行调度,及线程短调度规则。
52.问题2.2无论单个任务执行的成功与失败,若均插入对象组中同样消耗资源与时间
53.与操作系统定时器做对比,在不考虑其线程资源、轮询方式、调度策略等情况对调度时间的影响,仅关注其操作流程,操作系统:信号触发->任务执行;目前模块流程:插入对象组->获取最早执行对象->执行任务->插入对象组。从流程复杂度即可看出无论任务的成功与失败,实际模块执行的资源需求远高于操作系统。
54.除此之外模块的执行也无法在当前时间间隔内充分执行,及在当前分配的时间间隔内任意时刻均可能开执行对象既定任务操作,并在结束时超出所分配时间间隔。
55.因此任务执行后当前最早执行时间时应与当前系统时间做对比,如果超出当前系统时间则直接继续执行,否则加入对象组中进行管理调度(需要加入对象组的是分配了周期性调度任务的定时器对象,仅在该对象被创建时或者本轮本次对象指定调度任务被执行完成时,需要被添加入对象组)。同时对于单任务执行失败可能导致的定时器时间不更新而陷入流程卡死问题,通过检测系统时间与最早执行时间差超过10个时间间隔周期后将最早时间更新为系统当前时间来解决。等待对象组内的最早运行时间是指组内当前时刻最近最早需要被调度执行任务的对象的时刻。这一时刻便是定时器管理者最早执行时间。
56.本发明的实现了单线程模块利用系统时钟完成对于多个周期性调度线程的分配管理,同等任务数量情况下cpu使用率降低300%。采用自定义线程调度策略,使周期性调度模块在分时操作系统环境中仍然具有实时操作系统下高精度的时钟周期调度特性。与windows定时器调度模块一致接口调用方式使用简单高效,同时充分降低人员对于周期性调度线程的管理难度。模块纯由c 语言实现,简洁明了支持跨平台使用。
57.显然本发明具体实现并不受上述方式的限制,只要采用了本发明的方法构思和技术方案进行的各种非实质性的改进,均在本发明的保护范围之内。
再多了解一些

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

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

相关文献