1.任务的实时性
Linux内核(linux-2.6以前) 是不可抢占的,但支持用户抢占它的调度方法是:一个进程可以通过schedule()函数自愿地启动一次调度。非自愿的强制性调度只能发生在每次从系统调用返回的前夕以及每次从中断或异常处理返回到用户空间的前夕(这种强制性调度又叫用户抢占)。但是,如果在系统空间发生中断或异常是不会引起调度的。这种方式使内核实现得以简化。
Linux内核(linux-2.6) 加入了内核抢占(preempt)机制。内核抢占指用户程序在执行系统调用期间可以被抢占,该进程暂时挂起,使新唤醒的高优先级进程能够运行。这种抢占并非可以在内核中任意位置都能安全进行,比如在临界区中的代码就不能发生抢占。临界区是指同一时间内不可以有超过一个进程在其中执行的指令序列。在Linux内核中这些部分需要用自旋锁保护。旧的spin_lock变为可抢占,新内核需要使用raw_spin_lock才可保护临界区。
修改抢占模式:
Kernel Features
-> Preemption Model
No Forced Preemption(Server):非强迫式抢占。
这是传统的Linux抢占式模型,针对于高吞吐量设计。它同样在很多时候会提供很好的响应,但是也可能会有较长
的延迟。如果是要建立服务器或者用于科学运算,或者要最大化内核的运算能力而不理会调度上的延迟,则选这项。
Voluntary Kernel Preemption(Desktop):自动式内核抢占。
这个选项通过向内核添加更多的“清晰抢占点”来减少内核延迟。这些新的抢占点以降低吞吐量为代价,来降低内
核的最大延迟,提供更快的应用程序响应。这通过允许低优先级的进程自动抢占来响应事件,即使进程在内核中
进行系统调用。这使得应用程序运行得更“流畅”,即使系统已经是高负荷运转。嵌入式系统里面通常选择N。
Preemptible Kernel(Low-Latency Desktop):可抢占式内核(低延迟桌面)。
这个选项通过使所有内核代码(非致命部分)编译为“可抢占”来降低内核延迟。通过允许低优先级进程进行强制抢占来响应事件,即使这些进程正在进行系统调用或者未达到正常的“抢占点”。这使得应用程序运行得更加“流畅”,即使系统已经是高负荷运转。代价是吞吐量降低,内核运行开销增大。嵌入式系统编译内核通常选择Y,这样只有很少的延迟。
2.硬件中断响应实时性
Linux 2.6添加抢占功能后,实时性大幅提高,但是由于不支持中断嵌套,以及系统中使用大量的自旋锁保护临界区,导致高优先级硬件中断不能被及时响应。