处理器调度算法
Ⅰ 操作系统应该如何在多CPU上调度工作
操作系统在多CPU上调度工作时,主要采取以下策略:
应用程序并行化:
- 应用程序需要被重写为并行执行,利用多线程或多进程在多个CPU上分工合作。这要求开发者深入理解并发编程原理,并合理地划分任务,以实现高效的并行处理。
处理缓存一致性问题:
- 在多CPU系统中,多个CPU可能同时访问共享数据。为确保数据的一致性,操作系统需要处理缓存一致性问题,防止数据冲突和脏读。这通常通过硬件和软件的协同工作来实现。
负载均衡:
- 调度器需要在多个CPU之间平衡工作负载,以确保每个CPU都能得到充分利用。这可以通过多种策略来实现,如单队列多处理器调度和多队列多处理器调度。MQMS通过为每个CPU分配独立的调度队列来避免同步问题,但可能引发负载不均。为解决此问题,可以采用工作迁移策略,如工作窃取算法,动态调整工作在CPU之间的分布。
调度算法选择:
- 操作系统提供多种调度算法,如O、CFS和BFS等。每种算法都有其优点和局限性,需要根据具体应用场景进行选择。例如,CFS注重公平性和响应时间,而BFS则更注重低延迟和高性能。
考虑性能、复杂度和可维护性:
- 设计一个高效、灵活的调度程序是一项复杂任务,需要平衡性能、复杂度和可维护性等多个因素。随着技术的进步,调度策略也在不断演进,以适应日益复杂的多核环境。
综上所述,操作系统在多CPU上调度工作时,需要综合考虑应用程序并行化、缓存一致性、负载均衡、调度算法选择以及性能、复杂度和可维护性等多个方面。
Ⅱ 实时调度的单处理器实时调度
问题描述:假设一任务集S={t1,t2,t3,...,tn},周期分别是T1,T2,...,Tn,执行时间为c1,c2,...,cn,deadline为D1,D2,...,Dn,Di=Ti。任务ti可以被抢占。
CPU利用率用U=sum(ci/Ti)来表示。对于单处理器,U<=1是S可调度的前提条件,否则S不可调度。 任务按单调速率优先级分配(RMPA)的调度算法,称为单调速率调度(RMS)。RMPA是指任务的优先级按任务周期T来分配。它根据任务的执行周期的长短来决定调度优先级,那些具有小的执行周期的任务具有较高的优先级,周期长的任务优先级低。
不考虑n=1的情况。RMS是单处理器下的最优静态调度算法。1973年Liu和Layland发表的这篇文章的前半部分首次提出了RM调度算法在静态调度中的最优性. 它的一个特点是可通过对系统资源利用率的计算来进行任务可调度性分析, 算法简单、有效, 便于实现。不仅如此, 他们还把系统的利用系数(utilization factor)和系统可调度性联系起来, 推导出用RM调度所能达到的最小系统利用率公式. 同时, 这篇论文中透露出来的证明思想和方法也被人们所效仿. 下面就让我们来看看这篇文章中关于RM调度算法的重要结论。
任何一个结论都有一个模型假设, 让我们先列出这里的假设:
(A1) 所有的任务请求都是周期性的,必须在限定的时限内完成;
(A2) 任务的作业必须在该任务的下一个作业发生之前完成, 这样避免了考虑队列问题; 在这里, 我们对任务和作业不作特别的区分, 因为一个任务请求就是一个作业。
(A3) 任务之间都是独立的,每个任务的请求不依赖于其他任务请求的开始或完成;
(A4) 每个任务的运行时间是不变的,这里任务的运行时间是指处理器在无中断情况下用于处理该任务的时间;
(A5) 所有的非周期性任务都在特殊的情况下运行,比如系统初始化或系统非正常紧急处理程序。
(A6) 其它一些假设, 比如, 单处理器, 可抢占调度, 任务切换的时间忽略不计等等。 (1) 任务T i (P i, Ci, D i) 模型: 周期为P i,计算时间为Ci, 时限D i 为周期终点。任务在周期起点释放, 高优先级任务可抢占低优先级任务的执行。
(2) 优先级分配方法: 静态固定分配。优先级与周期成反比, 周期越短优先级越高。
(3) 可调度性分析: 如果任务集满足下式, 则该任务集可调度。
定理1:n个独立的周期任务可以被RMPA调度,如果U<=n(2^(1/n)-1)。
一个任务的响应时间(response time)是指一个任务请求到这个任务实际完成的时间跨度. 在静态调度中, 任务的临界时刻(critical instant)这个概念被首先提出来. 它被定义为一个特定的时刻, 如果在这个时刻任务请求到来, 那么会导致这个任务的响应时间最大(A critical instant of a task is the time atwhich the release of a task will proce the largestresponse time). 由此得出
定理1: 一个任务的临界时刻就是比这个任务优先级高的所有任务同时发出请求的时刻.
(Lemma: For any task, the critical instant occurs if thattask is simultaneously released with all higher prioritytasks .)
证明: 由于一个任务的响应时间是它自己的负载时间加上被其它优先级高的任务所打断的时间. 由于自己的负载时间是固定的, 我们考虑在什么时候任一高优先级的任务会有最长的打断时间. 显然, 只有当这一高优先级的任务与该任务同时请求处理时, 才能可能产生最大的打断时间.
如果有任务1和任务2,且任务1的优先级比任务2高,那么任务2的响应时间会被任务1延迟。
当任务1的请求到来的更早,那么任务2的响应时间就更长了。
定理1的价值在于它找到了一个用于证明一个调度算法能否调度任一任务集的充分必要条件。那就是所有任务同时请求执行的情况下,每个任务仍能满足各自的期限, 那么这个任务集就可以被这个调度算法调度.
有了这个推论, 我们就可以证明RM调度的最优性了.
定理2: 如果一个任务集能够被静态调度, 那么RMS算法就能够调度这个任务集. 从这个意义上说, RMS是最优的静态调度算法.
这个定理的证明方法就是有名的交换法. 证明思路如下:
假设一个任务集S采用其他静态优先级算法可以调度,那么总有这样两个优先级相邻的任务i和j, 有Ti>Tj,而Pi≤Pj.把Ti和Tj的优先级Pi和Pj互换,明显可以看出这时S仍然可以调度, 因为在所有任务同时请求的情况下, 交换这两个任务不会影响其它任务的完成时间, 同时这两个任务都可以在各自期限内完成. 按照这样的方法,其他任何静态优先级调度最终都可以转换成RM调度.
RMS已被证明是静态最优调度算法, 开销小, 灵活性好, 是实时调度的基础性理论。即使系统瞬时过载, 也完全可预测哪些任务丢失时限。缺点是处理机利用率较低, 最坏的情况下,当n→∞时, 不超过ln2 (≈ 70%)。另外, RMS是充分但非必要条件。而在一般情况下,对于随机的任务集大约只有88%. 70%或者88%的处理器利用率对于许多实时应用来说是一个严重的限制,动态调度算法如最早截止期最先(earliest deadline first,EDF)或者最少空闲时间最先(least laxity first,LLF)已经被证明是最优的,并且能够实现100% 的处理器利用率. 最早截止时间优先算法(EDF)也称为截止时间驱动调度算法(DDS),是一种动态调度算法。EDF指在调度时,任务的优先级根据任务的截止时间动态分配。截止时间越短,优先级越高。EDF有如下定理:
定理2:如果一个任务集按EDF算法调度,当且仅当U<=1。
EDF的特点
(1) 任务模型: 与RMS 调度相同。
(2) 优先级分配方法: 动态分配, 距要求时限所剩时间越短优先级越高。
(3) 可调度性分析: 如果任务集满足下式, 则该任务集可调度。
EDF 调度算法已被证明是动态最优调度, 而且是充要条件。处理机利用率最大可达100% 。但瞬时过载时, 系统行为不可预测, 可能发生多米诺骨牌现象, 一个任务丢失时会引起一连串的任务接连丢失。另外, 它的在线调度开销比RMS大。 最短空闲时间优先算法(LLF)也是一种动态调度算法。LLF指在调度时刻,任务的优先级根据任务的空闲时间动态分配。空闲时间越短,优先级越高。空闲时间=deadline-任务剩余执行时间。LLF可调度条件和EDF相同。
理论上,EDF和LLF算法都是单处理器下的最优调度算法。但是由于EDF和LLF在每个调度时刻都要计算任务的deadline或者空闲时间,并根据计算结果改变任务优先级,因此开销大、不易实现,其应用受到一定限制。