一个在schedsim中模拟linux调度器的方法

文档序号:6460427阅读:161来源:国知局
专利名称:一个在schedsim中模拟linux调度器的方法
技术领域
本发明涉及操作系统内核模拟领域,尤其涉及一个在schedsim中模拟linux 调度器的方法。
技术背景调度器即在多任务系统中,在合适的时间通过一定机制选择任务执行的一种 方法,它是多任务操作系统的基础。在linux操作系统中调度器对系统性能具有 重大的影响。在操作系统中,CPU是一种资源,调度器可以临时分配一个任务在上面执 行(单位是时间片)。调度器使得我们同时执行多个程序成为可能,因此可以与 具有各种需求的用户共享CPU。调度器的一个重要目标是有效地分配CPU时间片,同时提供很好的用户体 验。调度器还需要面对一些互相冲突的目标,例如既要为关键实时任务最小化 响应时间,又要最大限度地提高CPU的总体利用率。在操作系统的发展过程中,人们根据不同的应用需求提出了多种多样的调度 算法,如先到先服务调度、最短作业优先调度、轮转法调度、多级队列调度。 这些调度算法在不同的领域都有着广泛的应用。但没有一种调度算法适用于所 有的情况,对于不同的软硬件需求,需要选择合适的调度机制。Linux作为一个 通用操作系统,它的调度算法也经历了长久的演变过程。从最早期的循环检测 至U2.6.24的Complete Fair Schedule调度,其核心调度代码几经更改。 在Linux2.6内核中,调度器将进程分为三类1) 交互式进程)此类进程有大量的人机交互,因此进程不断地处于睡眠状 态,等待用户输入。典型的应用比如编辑器vi。此类进程对系统响应时间要求 比较高,否则用户会感觉系统反应迟缓。2) 批处理进程)此类进程不需要人机交互,在后台运行,需要占用大量的 系统资源。但是能够忍受响应延迟。比如编译器。3) 实时进程)实时对调度延迟的要求最高,这些进程往往执行非常重要的 操作,要求立即响应并执行。比如视频播放软件或飞机飞行控制系统,很明显 这类程序不能容忍长时间的调度延迟,轻则影响电影放映效果,重则机毁人亡。根据进程的不同分类Lirmx采用不同的调度策略。对于实时进程,采用FIFO 或者Round Robin的调度策略。对于普通进程,则需要区分交互式和批处理式的不同。传统Linux调度器提高交互式应用的优先级,使得它们能更快地被调 度。而CFS和RSDL等新的调度器的核心思想是"完全公平"。这个设计理念 不仅大大简化了调度器的代码复杂度,还对各种调度需求提供了更完美的支持。 当新的调度算法提出后,为了检测算法在linux上的性能,需要修改liimx内 核调度器以及时钟中断等相关的内容,这需要对linux内核非常熟悉,而且还要 有扎实的linux内核编程经验及调试经验,对于多数人来说是不现实的。因此需 要一个对Linux内核调度机制的模拟平台,目前有很多虚拟机软件及模拟平台来 运行整个操作系统,如VMvare,sosim,sesc,schedsim等。其中多数是对完整OS的 模拟,不利于快速获得调度效果。Schedsim是一个专门针对linux调度算法的模 拟器,提供了良好的接口及几种常见的调度算法,可以容易的实现新的调度算 法并可立刻获得直观的结果。但它对多处理器的情况支持太单一,系统中只有 一个就绪队列,而且不支持linux的新调度算法。 发明内容本发明的目的是克服schedsim的不足,提供一个在schedsim中模拟linux调度器的方法。包括如下步骤1) 修改schedsim的调度接口,为其添加变量timeinterval,来记录模拟过程 的时钟中断大小;2) 修改schedsim的调度接口,为其添加数组processCap和processLists, 用来记录每个处理器的处理能力及就绪队列;3) 修改调度接口中的方法RunNextTimeUnit,当时钟周期为0时把任务分 配到各处理器,当时钟中断来临时对每个处理器的就绪队列调度;4) 添加linux调度算法Complete Fair Scheduler,添加相应的算法类 CFSScheduler、 CFSProcessList禾口 CompleteFairProcess;5) 修改SchedulerGenerator,加入complete fair scheduler调度算法。步骤1)所述的修改schedsim的调度接口,为其添加变量timeinterval,来 记录模拟过程的时钟中断大小在CmdListPanel类中加入一个JTextFidd对象, 由用户输入时钟中断大小,并在Schedulerlnterface中加入timeinterval,用来保 存时钟中断的数值。步骤2)所述的修改schedsim的调度接口,为其添加数组processCap和 processLists,用来记录每个处理器的处理能力及就绪队列在类 Schedulerlnterface中加入数组processCap,代表每个处理器的处理能力,由用户初始化其值;在schedulerlnterface中加入数组processLists,代表每个处理器的 就绪队列。步骤3)所述的修改调度接口中的方法RunNextTimeUnit,当时钟周期为0 时把任务分配到各处理器,当时钟中断来临时对每个处理器的就绪队列调度 修改Schedulerlnterface的RunNextTimeUnit方法,当时钟周期为0时调用 dispatchProcess方法把任务分配到各处理器就绪队列中,当时间计数为步骤1)所 设的时钟中断倍数时,根据是否设置抢占模式对每个处理器重新调度,依据用 户选择的调度算法从每个处理器的就绪队列中选择一个进程执行。步骤4)所述的添力卩linux调度算法Complete Fair Scheduler,添加相应的算 法类CFSScheduler、 CFSProcessList和CompleteFairProcess:加入CFSScheduler 类,使它继承自GeneralScheduler类,实现其Schedule调度方法,它从就绪队列 中选择执行时间最早的一个进程返回;加入CFSProcessList类,使它继承自 ProcessList类,增加保存队列负载及最早运行时间的变量,它们用于计算进程的 执行时间;加入CompleteFairProcess类,使它继承自GeneralProcess类,该类添 加vruntime变量用于记录进程何时应当被执行,在调度时通过比较vruntime来 选择最先需要运行进程。步骤5)所述的修改SchedulerGenerator,加入CFS调度算法修改 SchedulerGenerator,在GetSchedulerList方法中加入对象CFSScheduler,在 GetSchedulerByName方法中添加创建CFSScheduler的语句。 本发明与现有技术相比具有的有益效果1) 增加了模拟平台对linux新调度算法的支持;2) 增加时钟中断时间细化每个进程的运行时间,使模拟更加精确;3) 增加了对异质多处理器的支持,可以检测多处理器下调度算法的性能。


图1是在schedsim中模拟linux调度器的类关系图;图2是在schedsim中模拟linux调度器的方法软件流程图。
具体实施方式
在schedsim中模拟linux调度器的方法包括如下步骤1)修改schedsim的调度接口,为其添加变量timeinterval,来记录模拟过程 的时钟中断大小;修改schedsim的调度接口,添加时钟中断,在CmdListPanel类中加入一个 JTextField对象,由用户输入时钟中断大小,并在Schedulerlnterface中加入整型变量timeinterval,用来保存时钟中断的数值。2) 修改schedsim的调度接口,为其添加数组processCap和processLists, 用来记录每个处理器的处理能力及就绪队列;修改schedsim的调度接口,在类Schedulerlnterface中加入整型数组 pmcessCap,代表每个处理器的处理能力,由用户初始化其值;在 Schedulerlnterface中加入数组processLists,代表每个处理器的就绪队列。3) 修改调度接口中的方法RunNextTimeUnit,当时钟周期为0时把任务分 配到各处理器,当时钟中断来临时对每个处理器的就绪队列调度;修改调度接口中类Schedulerinterface类的方法RunNextTimeUnit,当时钟周 期为0时把任务分配到各处理器,当时间计数为步骤1)所设的时钟中断倍数时, 根据是否设置抢占模式对每个处理器重新调度,依据用户选择的调度算法从每 个处理器的就绪队列中选择一个进程执行。Public void RunNextTimeUnit() throws SchedBaseException。。。。。。(和原来相同省略) If(this.Timecounter == 0)dispatchProcess(); 。。。。。。(和原来相同省略) else if ((this.timecounter % this.timeinterval) == 0)result = Scheduler.Schedule(processLists[n]); ActualTimeslice[n] = 1;state = Defines.PREEMPTIVE—TIMESLICE_END; }。。。。。。(和原来相同省略)为类Schedlerlnterface添力卩dispatchProcess方法 void dispatchProcess()int i,posjObject[] ps = Processes.RtGetAllProcesses().toArray();if(this.GetSchedulerName() == CFS Scheduler. SchedulerName()) for(i = 1 ; i <= this.Processors ; i++)this.processLists[i] = new CFSProcessList(this);for(i = 0 ; i < ps.length ; i++) pos = i % this.Processors + 1;processLists[pos].AddProcess((GeneralProcess)ps[i],false); ((GeneralProcess)ps[i]).setProcessorID(pos);4)添力口 linux调度算法Complete Fair Scheduler,添加相应的算法类 CFSScheduler、 CFSProcessList禾口 CompleteFairProcess;添加linux调度算法Complete Fair Scheduler,加入CFSScheduler类,使它 继承自GeneralScheduler类,实现其Schedule调度方法,它从就绪队列中选择执 行时间最早的一个进程返回;加入CFSProcessList类,使它继承自ProcessList类, 增加保存队列负载及最早运行时间的变量,它们用于计算进程的执行时间;加 入CompleteFairProcess类,使它继承自GeneralProcess类,该类添力口 vruntime 变量用于记录进程何时应当被执行,在调度时通过比较vruntime来选择最先需 要运行进程。public class CFSScheduler extends GeneralScheduler{ public static String SchedulerName()return ("CFS Scheduler");public CFSScheduler()super(SchedulerName());public GeneralProcess Convert(GeneralProcess Process)return (GeneralProcess) new CompleFairProcess(Process);public GeneralProcess Schedule(ProcessList processList) throws SchedBaseExceptionCFSProcessList cfspl = (CFSProcessList)processList; Vector Processes = processList.RtGetAUProcesses(); GeneralProcess Result = new GeneralProcess(); Object[] List = Processes.toArray(); boolean find = false;cfspl.updateCurr(); if(List.length > 1)if(cfspl.getCurr() != null)long ideal = cfspl.getSchedPeriod(List.length); ideal = ideal / Listlength;if(ideal < cfspl.getSchedulerInterface().getTimeCounter() cfspl.getCurr().getStartTime(》find = true;elsefind = true;if(! find)return cfspl.getCurr();CompleFairProcess tmp = null; for (int a = 0; a < List.length; a++)if ( ((GenemlProcess)List[a]).GetState() == READY)if(tmp == null)tmp = ((CompleFairProcess)List[a]); else if(cfspl.getCurr() != null &&((CompleFairProcess)List[a]).getVRuntime() <tmp.getVRuntime()) tmp = (((CompleFairProcess)List[a]));if(tmp != cfspl.getCurr()) cfspl.setCurr(tmp);tmp.setStartTime(cfspl.getSchedulerInterface().getTimeCounter()); return (GeneralProcess)cfspl.getCurr();public class CFSProcessList extends ProcessList{ private long load—weight = 0; private long min一vruntime = 0; static public long sysctl一sched一latency = 20; static public long sched_nr_latency = 5; private CompleFairProcess curr = null;public CFSProcessList(SchedulerInterface Interface)public CompleFairProcess getCurr() public void setCurr(CompleFairProcess process) public boolean AddProcess(GeneralProcess Process) public void updateCurr()public long calculateVR(CompleFairProcess c粉public long getSchedPeriod(int nr)public long getVRuntime()public void setVRuntime(long vruntime)public CompleFairProcess getFirstRimnable()public CompleFairProcess getLastRunnable()public boolean RtUpdateStatistics()public class CompleFairProcess extends GeneralProcess{ private long load = 0; private long vruntime = -1; public boolean firstadd = true; private long start_exec = -1;public CompleFairProcess(GeneralProcess gp)public void setLoad(long 1)public long getLoad()public long getVRuntime()public void setVRuntime(long vr)public void setStartTime(long start)public long getStartTime()5)修改SchedulerGenerator,加入Complete Fair Scheduler调度算法。 修改SchedulerGenerator,加入CFS调度算法修改SchedulerGenerator,在GetSchedulerList方法中加入对象CFSScheduler,在GetSchedulerByName方法中添加创建CFSScheduler的语句。public class SchedulerGenerator {public static Vector GetSchedulerList()。。。。。。(和原来相同省略)result.add((Object) CFSSchduer.SchedulerName());return (result);public static GeneralScheduler GetSchedulerByName(String SName) throws SchedBaseException。。。。。。(和原来相同省略)else if(SName == CFSSchduer.SchedulerName())Sched = (GeneralScheduler) new CFSSchduer();elsethrow new SchedBaseException("No such Scheduler!"); return(Sched);
权利要求
1.一个在schedsim中模拟linux调度器的方法,其特征在于包括如下步骤1)修改schedsim的调度接口,为其添加变量timeinterval,来记录模拟过程的时钟中断大小;2)修改schedsim的调度接口,为其添加数组processCap和processLists,用来记录每个处理器的处理能力及就绪队列;3)修改调度接口中的方法RunNextTimeUnit,当时钟周期为0时把任务分配到各处理器,当时钟中断来临时对每个处理器的就绪队列调度;4)添加linux调度算法Complete Fair Scheduler,添加相应的算法类CFSScheduler、CFSProcessList和CompleteFairProcess;5)修改SchedulerGenerator,加入Complete Fair Scheduler调度算法。
2. 根据权利要求1所述的一个在schedsim中模拟linux调度器的方法,其特 征在于步骤1)所述的修改schedsim的调度接口,为其添加变量timeinterval, 来记录模拟过程的时钟中断大小在CmdListPand类中加入一个JTextField对 象,由用户输入时钟中断大小,并在Schedulerlnterface中加入timeinterval,用 来保存时钟中断的数值。
3. 根据权利要求1所述的一个在schedsim中模拟linux调度器的方法,其特 征在于步骤2)所述的修改schedsim的调度接口,为其添加数组processCap和 processLists ,用来记录每个处理器的处理能力及就绪队列在类 Schedulerlnterface中加入数组processCap,代表每个处理器的处理能力,由用户 初始化其值;在schedulerlnterface中加入数组processLists,代表每个处理器的 就绪队列。
4. 根据权利要求1所述的一个在schedsim中模拟linux调度器的方法,其特 征在于步骤3)所述的修改调度接口中的方法RunNextTimeUnit,当时钟周期为 0时把任务分配到各处理器,当时钟中断来临时对每个处理器的就绪队列调度 修改Schedulerlnterface的RunNextTimeUnit方法,当时钟周期为0时调用 dispatchProcess方法把任务分配到各处理器就绪队列中,当时间计数为步骤1)所 设的时钟中断倍数时,根据是否设置抢占模式对每个处理器重新调度,依据用 户选择的调度算法从每个处理器的就绪队列中选择一个进程执行。
5.根据权利要求1所述的一个在schedsim中模拟linux调度器的方法,其 特征在于步骤4)所述的添加linux调度算法Complete Fair Scheduler,添加相应的算法类CFSScheduler 、 CFSProcessList和CompleteFairProcess :力口入 CFSScheduler类,使它继承自GeneralScheduler类,实现其Schedule调度方法, 它从就绪队列中选择执行时间最早的一个进程返回;加入CFSProcessList类,使 它继承自ProcessList类,增加保存队列负载及最早运行时间的变量,它们用于计 算进程的执行时间;加入CompleteFairProcess类,使它继承自GeneralProcess 类,该类添加vruntime变量用于记录进程何时应当被执行,在调度时通过比较 vruntime来选择最先需要运行的进程。
6.根据权利要求1所述的一个在schedsim中模拟linux调度器的方法,其特 征在于步骤5)所述的修改SchedulerGenerator,加入Complete Fair Scheduler调 度算法修改SchedulerGenerator,在GetSchedulerList方法中加入对象 CFSScheduler,在GetSchedulerByName方法中添加创建CFSScheduler的语句。
全文摘要
本发明公开了一个在schedsim中模拟linux调度器的方法。包括如下步骤1)修改schedsim的调度接口,为其添加变量timeinterval,来记录模拟过程的时钟中断大小;2)修改schedsim的调度接口,为其添加数组processCap和processLists,用来记录每个处理器的处理能力及就绪队列;3)修改调度接口中的方法RunNextTimeUnit,当时钟周期为0时把任务分配到各处理器,当时钟中断来临时对每个处理器的就绪队列调度;4)添加linux调度算法Complete FairScheduler,添加相应的算法类CFSScheduler、CFSProcessList和CompleteFairProcess;5)修改SchedulerGenerator,加入Complete Fair Scheduler调度算法。本发明通过增加时钟中断细化每个进程的运行时间,使模拟更加精确;增加了模拟平台对linux新调度算法的支持;增加了对异质多处理器的支持,可以检测多处理器下调度算法的性能。
文档编号G06F9/455GK101266551SQ200810060458
公开日2008年9月17日 申请日期2008年4月11日 优先权日2008年4月11日
发明者陈文智, 从 高, 博 高, 扬 高 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1