简单单调速率分析假设线程具有以下属性:
·没有资源共享(进程不共享资源,例如硬件资源、队列或任何类型的信号量阻塞或非阻塞(忙-等待))
·决定性的截止日期正好等于周期
·静态优先级(具有最高静态优先级且可立即运行的任务优先于所有其他任务)
·根据单调速率约定分配的静态优先级(周期/期限较短的任务被赋予更高的优先级)
·上下文切换时间和其他线程操作是免费的,对模型没有影响
它是一个数学模型,包含封闭系统中周期的计算模拟,在封闭系统中,循环调度器和分时调度器不能满足调度需求。单调速率调度着眼于系统中所有线程的运行建模,并确定满足相关线程集的保证所需的时间。
Liu & Layland刘&蕾兰(1973)证明,对于一组具有唯一周期的n个周期任务,如果CPU利用率低于特定的界限(取决于任务的数量),就存在一个总是满足截止日期的可行调度。RMS可调度性测试是:
其中Ci是计算时间,Ti是发布周期(截止日期在一个周期之后),n是要计划的进程数。例如,两个过程的U ≤ 0.8284。当过程的数量趋向于无穷大时,这个表达式将趋向于:
因此,粗略估计,如果中央处理器利用率低于69.32%,RMS可以满足所有期限。另外30.7%的中央处理器可以专用于较低优先级的非实时任务。众所周知,当利用率为85%或更低时,随机生成的周期性任务系统将满足所有的截止日期,[3]但是这一事实取决于对确切的任务统计数据(周期、截止日期)的了解,而这些数据并不能保证适用于所有的任务集。
双曲线界限[4]是比Liu & Layland提出的可调度性更严格的充分条件:
,
其中Ui是每个任务的CPU利用率。
单调速率优先级分配是最优的,这意味着如果任何静态优先级调度算法都可以满足所有的截止日期,那么单调速率算法也可以。期限单调调度算法在相同的周期和期限下也是最优的,事实上在这种情况下算法是相同的;此外,当截止时间小于周期时,截止时间单调调度是最佳的。对于期限大于周期的任务模型,奥德斯利(Audsley)算法通过对该模型进行精确的可调度性测试,找到了最优的优先级分配。[5]
在许多实际应用中,资源是共享的,未修改的RMS会受到优先级反转和死锁的危害。实际上,这可以通过禁用抢占或优先级继承来解决。替代方法是使用无锁算法或避免互斥体/信号量在不同优先级的线程之间共享。这样一来,资源冲突就不会首先产生。
■在实时内核中锁定CPU中断的操作系统输入关键()和操作系统输出关键()原语(OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL() ),例如微处理器/操作系统(MicroC/OS-II)
■splx()原语家族嵌套了设备中断的锁定(FreeBSD 5.x/6.x)。
优先级继承算法可以用两个参数来表征。首先,继承是懒惰的(仅在必要时)还是直接的(在冲突发生前提高优先级)。其次是继承乐观(增加最小数量)或悲观(增加超过最小数量):
悲观的 | 乐观的 | |
---|---|---|
立即 | 操作系统_输入_关键()/操作系统_退出_关键() | splx(),最高优先级锁 |
懒惰的 | 优先级上限协议、基本优先级继承协议 |
在实践中,惰性算法和即时算法之间没有数学上的区别(就Liu & Layland系统的使用范围而言),即时算法的实现效率更高,因此它们是大多数实际系统使用的算法。
使用基本优先级继承的一个例子与“火星探路者重置错误(Mars Pathfinder reset bug)”有关, [11][12]该错误是通过改变信号量的创建标志以启用优先级继承而在Mars上修复的。
过程 | 执行时间 | 时期 |
---|---|---|
第一亲代P1 | 1 | 8 |
P2 | 2 | 5 |
P3 | 2 | 10 |
利用率将为:
对于3个进程,我们可以得出系统是可调度的充分条件为:
因为 该系统肯定是可调度的。
需要注意的是,这个条件不是必须的。因此,我们不能说高利用率的系统不能用这种调度算法来调度。
^Liu, C. L.; Layland, J. (1973), "Scheduling algorithms for multiprogramming in a hard real-time environment", Journal of the ACM, 20 (1): 46–61, doi:10.1145/321738.321743..
^Bovet, Daniel P.; Cesati, Marco, Understanding the Linux Kernel, http://oreilly.com/catalog/linuxkernel/chapter/ch10.html#85347 Archived 2014-09-21 at the Wayback Machine..
^Lehoczky, J.; Sha, L.; Ding, Y. (1989), "The rate monotonic scheduling algorithm: exact characterization and average case behavior", IEEE Real-Time Systems Symposium, pp. 166–171, doi:10.1109/REAL.1989.63567..
^Enrico Bini, Giorgio C. Buttazzo and Giuseppe M. Buttazzo (2003), "Rate Monotonic Analysis: the Hyperbolic Bound", IEEE Transactions on Computers, 52: 933–942, doi:10.1109/TC.2003.1214341CS1 maint: Uses authors parameter (link).
^Alan Burns and Andy Wellings (2009), Real-Time Systems and Programming Languages (4th ed.), Addison-Wesley, pp. 391, 397, ISBN 978-0-321-41745-9.
^Lampson, B. W.; Redell, D. D. (1980), "Experience with processes and monitors in Mesa", Communications of the ACM, 23 (2): 105–117, doi:10.1145/358818.358824..
^Buttazzo, Giorgio (2011), Hard Real-Time Computing Systems: Predictable Scheduling Algorithms and Applications (Third ed.), New York, NY: Springer, p. 225.
^"Real-Time Linux Wiki". kernel.org. 2008-03-26. Retrieved 2014-03-14..
^Sha, L.; Rajkumar, R.; Lehoczky, J. P. (1990), "Priority inheritance protocols: an approach to real-time synchronization", IEEE Transactions on Computers, 39 (9): 1175–1185, doi:10.1109/12.57058..
^Buttazzo, Giorgio (2011), Hard Real-Time Computing Systems: Predictable Scheduling Algorithms and Applications (Third ed.), New York, NY: Springer, p. 212.
^https://web.archive.org/web/20221028230904/http://research.microsoft.com/~mbj/Mars_Pathfinder/.
^https://web.archive.org/web/20221028230904/http://anthology.spacemonkeys.ca/archives/770-Mars-Pathfinder-Reset-Bug.html.
暂无