李 颖 孙晓良
(航天恒星科技有限公司,北京 100086)
遥感卫星地面系统从卫星数据接收系统获取卫星遥感数据,根据不同的业务需要,进行不同级别和类型的卫星数据产品的生产和分发。任务调度是遥感卫星地面应用系统的一个主要功能,负责系统内的各类任务的调度。随着卫星数据应用业务的快速发展,卫星地面应用系统规模增大,卫星数据产品种类增多,处理流程日益复杂,任务量快速增长,需要一种有效的调度方法,实现自动、科学高效地系统资源调配与任务调度,满足遥感数据产品快速、高效、可靠生产的需求[1]。
为了有效地利用计算资源,快速完成系统任务,本文提出了一种基于任务优先级策略的多线程并行任务调度方法。根据遥感卫星应用系统内的任务特点设计多个优先级队列存储任务,采用多线程调度任务执行,并用线程池管理多线程。该方法解决了卫星数据产品生产流程复杂、任务量大、任务种类多等问题,提高了任务调度的实时性和并行性以及系统的资源利用率,解决了遥感卫星地面应用系统多任务并行调度时效性低的问题,最大限度地发挥遥感卫星对地观测系统的效益。
遥感卫星应用系统一般由数据管理、用户服务、产品生产(n 个系统)、运行管理、数据传输分系统等组成。遥感卫星应用系统组成如图1 所示[2]。
图1 遥感卫星应用系统组成Fig.1 Composition of remote-sensing satellite application system
数据管理分系统建立综合数据管理平台,形成对海量数据的集成、存档、管理与共享;用户服务分系统以直接数据存取、数据查询检索和定制处理等多种形式,向各用户提供目录查询、产品订购和产品分发服务;各产品生产分系统根据业务需求生产不同种类的数据产品;数据传输分系统从卫星地面接收站或其他卫星应用系统采集获取卫星遥感数据。
运行管理分系统是整个遥感卫星地面应用系统业务化自动运行的中枢。其中任务调度功能是运行管理分系统的核心,负责整个系统的任务制定、生产调度、流程监视,控制系统内的业务流程和数据流程,调度系统资源完成卫星数据产品的生产和分发。
传统的优先级队列都是采用单一队列存储不同优先级别的任务,在优先级队列中任务按照优先级大小排序,有新的任务加入到优先级队列时,需要在队列中寻找合适的位置,即使采用最快速的排序算法,队列的排序和任务的插入操作所耗费的时间也随着任务量的增加呈线性增长,而且算法复杂,不易于实现。另外,在单一的队列中,优先级别低的任务可能会一直排在队列的末尾,会造成长时间得不到执行的问题[3]。
本文设计的方法采用多个优先级队列存储不同优先级的任务,改变了传统采用单一队列需要使用排序算法将任务插入到相应位置的优先级队列管理方式。根据遥感卫星应用系统内任务类别和任务特性,定义任务优先级别,系统运行时创建相应数量的线程安全的队列,分别存储相应级别的任务[4]。
任务的优先级由操作员的优先级别和任务类型共同决定。任务类型分为常规和应急两类,应急任务的优先级高于常规任务。其次,操作员的级别越高,任务的优先级越高。根据业务需要,任务优先级的计算算法为
1)假设常规任务的优先级权重为1,应急任务的优先级权重为n;
2)则操作员的优先级别分为0~(n-1)级;
3)任务优先级等于操作员优先级加任务种类优先级权重,共1~(2n-1)个级别。
该计算方式可以确保应急任务的优先级不低于常规任务,并且相同类型任务优先级的高低由操作员优先级决定。
在制定卫星数据产品生产任务时,根据业务需要,确定任务的优先级和任务在优先级队列中的最长等待时间,任务生成后按照优先级插入到相应的优先级队列中,并为任务增加一个时间戳,记录该任务加入到队列的时间。
任务的执行按优先级由高到低的顺序执行,首先从高优先级队取出任务执行,在高优先级队列为空后,再从下一级优先级队列取任务,以此类推,直至所有优先级队列都为空。
为防止低优先级的任务长时间得不到执行,在任务调度过程中,检查非最高优先级队列中每个任务的等待时间,如果等待时间超过设定的任务最长等待时间,而该任务仍未被执行,则将该任务转移到上一级优先级更高的队列中,并更改时间戳为当前加入队列的时间。
由于遥感卫星地面应用系统的生产和发布任务数量巨大,如果为每一个任务调度请求创建单独线程,并在任务完成后销毁该线程,系统开销会很大。虽然创建和销毁一个线程只需耗费较少的系统资源,但对于并发任务数特别多的遥感卫星地面应用,频繁地创建和销毁线程会占用大量CPU 时间和内存,同时会花费大量时间。线程池是一种多线程处理形式,为线程生命周期开销问题和资源不足问题提供了解决方案,降低了操作系统的负担,从而可以获得更好的调度性能[5-6]。
线程池的工作流程是先启动一定数量的线程,并让这些线程处于休眠状态。当有一个新的任务开始执行时,唤醒线程池中的某一个休眠线程处理该任务的执行,任务执行完成后,线程重新转换为休眠状态[7]。
本文设计的线程池能够根据任务数量动态地调整线程池中线程数量。线程池中的线程分为守护线程和任务线程。任务线程是为系统内的任务调度执行而创建的,负责调度任务的执行线程。守护线程维护线程池中任务线程的数量和任务线程状态表,记录和控制任务线程状态的变化。本文的多任务并行调度的方法,首先是创建任务线程和守护线程,由守护线程维护线程池中任务线程的数量和任务线程的状态。
1)任务线程创建
任务调度为每一个任务创建线程。任务线程数量是设计的关键,任务线程太多或太少都会降低任务调度的性能。线程池内任务最大和最小线程数量根据系统资源确定。根据系统CPU 的数量、任务的I/O 等待时间和任务生成频率等情况,确定任务线程的最大数量和最小数量,并设置任务线程的最长空闲时间。
任务线程的数量计算算法:假设任务的I/O 等待时间为Tw(单位:s),真正占用CPU 的时间为Ts(单位:s),系统CPU 的数量为N,任务生成频率为Fc(单位:个/s),则:
线程池中的任务线程的最大数量设定为
任务线程的最小数量设定为
任务线程的最长空闲时间设定为
2)守护线程创建
线程池创建并启动唯一的守护线程,根据设定的任务线程的最小数量创建任务线程,并为每个任务线程分配唯一的ID;将任务线程的状态分为Ready 态、空闲态、运行态和终结态四种状态。任务线程状态转变如图2 所示:任务线程创建成功但未启动时,任务线程为Ready 态;如果任务线程开始执行任务,则转变为运行态;如果优先级队列全部为空,则将任务线程在空队列上阻塞,并设置最长阻塞时间,此时任务线程转变空闲态;如果任务线程被守护线程终止或达到最长空闲时间, 则转变为终结态[8-9]。
图2 任务线程状态转移示意图Fig.2 Diagram of task-thread state shifting
3)守护线程运行
线程创建完成后,启动线程池中所有任务线程,所有任务线程变为运行态,任务线程按优先级由高到低的顺序,从优先级队列中取出任务进行执行。守护线程维护调整线程池中任务线程的数量和任务线程状态表,记录和控制任务线程状态的变化,守护线程执行流程如图3 所示,具体算法如下[10]:
(1)如果有新任务加入到队列,而当前无处于Ready 态或空闲态的任务线程,并且任务线程总数小于设定的任务线程最大数量,则守护线程负责创建新的任务线程执行任务;
(2)如果所有优先级队列为空,即无需要执行的任务,任务线程进入空闲状态,如果处于空闲态的时间超过设定的最长空闲时间,则任务线程自动结束转变为终结态;
(3)如果所有优先级队列为空,守护线程扫描所有的空闲线程,由守护线程设置终结标识,结束处于空闲态的任务线程将其转变为终结态,但守护线程要保证线程池中任务线程的数量不少于设定的任务线程的最小数量。
图3 守护线程的流程示意图Fig.3 Diagram of w atch-thread working flow
多任务并行调度分为5 部分:任务制定、任务管理、生产调度、流程监视和故障处理,如图4 所示。
1)任务制定提供任务录入的人机界面,对录入任务参数进行检验并生成任务;
2)任务管理负责任务列表显示、存储和维护,根据任务执行结果,更新任务状态;
3)任务调度按照任务类型、所需数据、可用数据等情况,确定任务调度的流程,安排任务执行日程和策略,根据任务优先级将任务加入相应级别的任务队列,由线程池中的任务线程执行任务,生成调度命令,依次下发调度命令给系统内的其他分系统;
4)流程监视监测业务流程中的各类任务执行状态。将任务执行过程以流程结构图的形式显示在监视界面上,在接收到任务状态数据后,能够通过节点颜色变化反映节点状态的变化;
图4 任务调度功能组成图Fig.4 Composition of task scheduling function
5)故障处理模块:当任务执行的节点出现故障时,根据故障信息对故障发生位置信息进行定位,并按照该类故障的处理预案进行处理。处理方式包括报警和异常中止控制令下发。报警方式主要有客户端的声光报警,以及服务端部署的短信报警,短信报警服务实现了在无人值守的情况下及时报告故障信息的功能。
任务调度的任务管理和流程监视的界面如图5和图6 所示。
图5 任务管理列表Fig.5 List of tasks
图6 任务调度的实时效果Fig.6 Real-time effect of task scheduling
本文提出的基于优先级的遥感卫星产品生产任务调度方法,根据任务优先级顺序调度任务执行,解决了任务处理流程复杂、任务量大、并行处理要求高等带来的调度问题,能同时调度的任务数量大大增加,满足了任务调度的实时性、并行性和高效率的需求。目前该技术已经在某遥感卫星应用系统得到应用,实践检验效果良好,在Window s Server 2008 操作系统,4 路4 核主频2.4G Hz 的CPU,32Gbyte 内存的运行环境下,该调度方法同时能够调度的任务数量可以达到2 000 个;此外,由于采用多优先级队列的方式,在任务量增加时,低优先级任务的延迟时间平均比单优先级队列减少20s 左右。该方法提高了遥感卫星数据产品的生产效率,能够应对突发事件快速调度产品生产,相应地提高了卫星地面应用系统的经济效益和社会效益。
)
[1]吴美蓉.中巴地球资源卫星应用系统及其数据处理系统[C]// 台湾台北:2001年海峡两岸空间资讯与防灾科技研讨会,2001
[2]周海莺, 祝春萌,黄锦渊.风云三号卫星广州地面数据接收处理系统设计[C]//北京:中国气象学会2008年会, 2008
[3]刘殿兴, 杜忠华.一种新型的多优先级队列缓存管理算法[C]//沈阳:辽宁省通信学会2005年年会,2005
[4]田杭沛,高德远, 樊晓桠,等.面向实时流处理的多核多线程处理器访存队列[J].计算机研究与发展, 2009, 46(10)
[5]孙凌.基于Java 多线程的任务调度实现策略[J].计算机工程,2004, 30(z1)
[6]王菁,魏霞.Java 语言多线程技术及应用探讨[J].农业网络信息,2009(5)
[7]胡宁,张德运,史宏锋.一种低开销的多任务调度模型[J].微电子学与计算机, 2005,22(4)
[8]刘瑞敏,张云生.实时多任务调度程序设计[C]//昆明:第三届工业控制系统应用学术会议, 1997
[9]黄宝边,曾文华.网格环境中任务调度算法的分析与比较[C]// 武汉:2005 中国计算机大会, 2005
[10]黄金贵, 康宝生.并行任务调度的近似算法[C]// 青岛:第一届全国几何设计与计算学术会议,2002