长期调度:哪一个程序被系统选中并创建进程运行它
中期调度:决定是否将进程调入内存
短期调度:哪个进程获得处理器资源(通常所说调度):单、多、实时处理器调度
FCFS算法(FIFO算法,抢占式)
循环执行算法(时间片轮转法,抢占式),缺点:I/O操作密集型进程和处理器使用密集型进程时会带来的资源使用不平衡。改进:虚拟循环执行算法,该算法在FCFS基础上加入一个辅助进程队列,一个因I/O操作挂起的进程现在如果它申请的I/O操作已经完成的话,它进入辅助队列,而不是普通队列,新的处理器时间片来临的时候,辅助队列优先获得处理器控制权,而其运行时间不会超过它在上一次自己获取的时间片里剩下来的时间。
SPN算法(非抢占式):运行时间最短的进程优先运行。缺点:时间较长的永远等不到处理器
SRT算法(SPN算法的抢占式版本):总是选择剩余时间最短的进程运行
HRRN算法:选择运行进程时遵循最高响应时间比率原则:R=(w+s)/s,w为等待时间,s获取后的预计运行时间。
反馈算法:过去运行时间最短者优先。编程方法:创建进程并进入最高优先级等待队列;每运行一段时间后,降一级等待下一次运行,如此递推,直到完成。
二、多处理器调度算法
1、多处理器系统分类:
松耦合型:总系统由一些自治子系统组成
紧耦合型:一组处理器共用一个内存,并处于一个操作系统的控制下。又分为:主从型(例如通用ARM+专用DSP);对等型系统
2、多处理器进程调度需要解决的问题:
2.1按处理器分配进程问题
对等型,将多个处理器看成一个处理器资源库,分配方法:静态方法(分配后在进程生命周期内不在更改处理器)和动态方法(允许更改处理器,修正静态方法的处理器负荷不均匀)
考虑到进程地位的不平等性,核心进程一般运行在特定的处理器上,另外的处理器只运行用户进程,这样导致的问题是:单个处理器出现故障将导致整个系统崩溃(创新点:能否实现一种复合调度算法优先采用主/从方式,当单个处理器出现故障时,再采用对等式??),对等式,实现比较复杂,很多系统实现采用这两种方式的折衷。
2.2 单个处理器上的多道程序设计问题
松耦合性的处理器相对独立,应该考虑多道程序设计,紧耦合型则未必,必须考虑系统总体性能,一个多线程程序只有当所有线程都运行时,程序性能才能显著提高。
2.3进程实际分派问题
进程形成若干个队列,按某种调度策略从处理器资源库中获取处理器,研究表明:调度算法的差异所带来的多处理器系统性能上的差异不是明显,这种影响随着处理器数目的增多而淡化。
3 线程调度方案
做为一个研究热点有以下四种方案比较突出:
3.1负荷共同承担法(Load Sharing)
所有等待线程排成队列,空闲处理器按照某种策略选取一个线程运行,而不管它属于哪个进程。优点:1、计算负荷在处理器中实现均匀分布;2、无需中央级调度程序存在,某个处理器空闲时就在其上运行并选择下一个需要运行的线程;3、单处理器算法可以很容易推广到这里来使用。缺点:等待线程队列统一管理,必须要与互斥控制,因此导致一个应用程序的所有线程不大可能同时都获得处理器控制权,从而程序性能不是最佳。
3.2 组调度法(Gang Scheduling)
存在耦合的线程同时一对一地指定同样数目的处理器并运行。优点:减少阻塞同步、减少进程切换、按组调度,降低调度程序执行频度。
3.3 处理器指定分配法(Dedicated Processor Assignment)
处理器指定分配算法是组调度策略的一个极端情况,思想是:一个应用程序的生命周期中,将一组处理器都分配给该程序,每个线程占用一个处理器会因为等待I/O而造成阻塞,但应用程序的性能比单个处理器的利用率更重要,所有这种方法能减少进程切换,提高程序性能,采用这样一种调度方式在多处理器系统中还是不错的。
3.4 动态调度法(Dynamic Scheduling)
进程运行时利用工具实时调整系统负荷,从而使系统资源得到最大限度的利用。
三、实时调度算法
0 实时操作系统基础知识
0.1 实时分类:
硬实时(Hard Real-Time):系统对某个实时任务的处理未能在某个截止时间开始或者结束的话,最终结果将是灾难性的。
软实时(Soft Real-Time):处理任务启动或者结束的截止时间只是一个期望值,即使超过截止时间,计算结果也是有意义的。
0.2 实时系统与普通操作系统的区别:
任务处理的确定性(中断请求到对应任务启动时间)、响应灵敏度(系统响应请求时间)、用户参与控制、可靠性以及故障保护措施。
0.3 目标
尽可能快的中断处理和任务分配速度。
0.4 两个要求:
需要合乎逻辑的计算结果;
需要满足一定的时间要求。
1 实时算法分类(3个角度)
系统是否做调度分析?(调度分析所需要的信息包括周期性到达时间、执行时间、周期性结束截止时间以及各个任务的优先级等)
是动态分析还是静态分析?
分析结果是否真正影响到进程的实时分派。
据此可将实时调度算法分为4类: 1.1 ST(Static Table-driver)类:
根据相关信息做出一个实时调度计划表,严格按照该表调度进程。比较适合周期性任务,灵活性欠佳。
1.2 SSP(Static Priority-driven Preemptive)类:
也需静态调度计划表,只是在赋予各个任务优先级的时候提供参考,实际运行,则根据优先级进行采用抢占式调度(如用RMS调度算法)。
1.3 DP(Dynamic Planning-based)类:
运行中动态规划调度计划,新任务请求能满足的时候才受理,受理后由调度算法决定何时调用。
1.4 DBE(Dynamic Best Effort)类:
无须调度分析,系统竭尽全力满足任务提出的要求,将不满足要去的进程直接丢掉。优点:容易实现。缺点:无法预知任务的截止时间。目前被许多商业化的实时操作系统采用。
2 时限调度(Deadline Scheduling)
实时调度算法需要提供下列关于任务本身的更多的信息:
任务准备运行时的时间
任务开始处理的时间上限
任务完成处理的时间上限
任务处理所耗费的时间
资源需求
任务的优先级
一个任务最好能够分成两个子任务(上半区、下半区类似):急需处理部分;更多选择余地的部分。
实时调度需要回答以下两个问题:
下个供调度的任务是哪个?选择何种抢占式?
关于第二个问题:如果强调任务开始处的时间上限,那么非抢占式的调度方法就很有效。
3 RMS调度 (Rate Monotonic Scheduling)
SSP(Static Priority-driven Preemptive)类已经提到,它采用静态调度方法赋予各个任务优先级,实际运行中按优先级调度,显然,RMS方法适合周期性任务。任务的优先级的高低与其任务周期长短成反比。
4 RT-Linux RT-linux中实现了一个硬件控制设备的软件模拟器,即采用了所谓的虚拟机技术,linux内核作为一个任务运行在一个小的实时内核之上,该任务比其他用户级别的实时任务优先级低,因此,linux只有在没有实时任务运行的前提下才能获得处理器控制权。RT-linux运行过程如下:linux发出中断禁止请求,实时内核截获该请求,记录并假装做出回应,而实际上linux禁止硬件中断的请求不被实际硬件理会的。当一个中断信号来到时,实时内核截获并做出相应处理,不管linux内部状态如何,都要为实时任务的处理让路。RT-Linux有两个可供选择的实时调度算法:EDF算法(最早到达截止时间的实时进程最早运行);RMS算法