Linux 实时系统编程指南
1. 调度算法概述
在系统调度中,有两种常见的调度算法:轮询调度(Round Robin,RR)和先进先出调度(FIFO)。RR 调度与 FIFO 调度类似,但任务会在运行一段固定时间后自动移到队列尾部。这两种调度方法都并非天生适用于实时系统。FIFO 调度的不可预测性源于任务未能正确让出资源,导致其他任务无法运行。若未让出资源的是实时任务,该过程则更具可预测性。RR 调度会在系统的所有进程间平均分配时间,随着任务增多,单个任务分配到的时间减少,降低了调度的可预测性。
调度还有一个重要维度,即系统做出调度决策所需的时间,常被称为调度延迟或上下文切换时间。理想情况下,无论系统上运行多少线程,调度器所需时间应保持恒定。2.6 内核中的所有调度器大致符合这一描述,在计算机科学领域被称为 O(1)。
2. Linux 实时系统的实现
为使 Linux 成为软实时系统,人们付出了大量努力。当前的相关项目是 CONFIG_PREEMPT_RT 补丁,可从 http://rt.wiki.kernel.org 获取。该项目最初致力于通过提高 Linux 内核的可抢占性来降低延迟。
当 Linux 内核首次移植到多处理器系统时,内核的竞态条件通过使用一个名为大内核锁(Big Kernel Lock,BKL)的单一锁来解决。这导致内核整体序列化,因为许多不相关的例程使用此锁来消除竞态条件。BKL 不仅缺乏粒度,还是一个自旋锁,即请求锁的代码会在循环中等待,等待下一个锁的进程不会让出资源,导致系统无法进行实时调度。
预emption(抢占)对实时系统至关重要。当低优先级任务独占高优先级任务所需的资源,或者锁占
超级会员免费看
订阅专栏 解锁全文

1287

被折叠的 条评论
为什么被折叠?



