编程接口指南

分发延迟

对于实时应用程序,调度行为中最重要的元素是提供实时调度类。标准的分时调度类并不适用于实时应用程序,因为此调度类会平等对待每个进程。标准的分时调度类中的优先级概念有限。实时应用程序需要完全采用进程优先级的调度类,另外还需要进程优先级仅由显式应用程序操作更改的调度类。

术语分发延迟是指系统响应进程开始操作的请求所用的时间。使用专门根据应用程序优先级而编写的调度器,可以开发具有有限分发延迟的实时应用程序。

下图说明了应用程序响应来自外部事件的请求所用的时间。

图 10–2 应用程序响应时间

上下文说明了此图形。

应用程序总响应时间包括中断响应时间、分发延迟以及应用程序的响应时间。

应用程序的中断响应时间包括系统的中断延迟以及设备驱动程序自身的中断处理时间。中断延迟由系统在禁用中断时必须运行的最长间隔确定。在 SunOS 中,使用通常不需要提高处理器中断级别的同步元语可以最小化此时间。

在中断处理过程中,驱动程序的中断例程会唤醒高优先级进程并在完成时返回。系统可检测优先级高于已中断进程的进程现在是否可进行分发,然后分发此进程。将上下文从优先级较低的进程切换到优先级较高的进程所用的时间包括在分发延迟时间中。

图 10–3 说明了系统的内部分发延迟和应用程序响应时间。响应时间根据系统响应内部事件所用的时间定义。内部事件的分发延迟表示进程唤醒优先级较高的进程所需的时间。分发延迟还包括系统分发优先级较高的进程所用的时间。

应用程序响应时间是指驱动程序执行以下操作所用的时间:唤醒优先级较高的进程,释放低优先级进程中的资源,重新调度优先级较高的任务,计算响应以及分发任务。

分发延迟的时间间隔内会发生中断并可对中断进行处理。此处理会增加应用程序响应时间,但是不会影响测量分发延迟。因此,此处理不受分发延迟保证的限制。

图 10–3 内部分发延迟

此图形显示了内部分发延迟的组成部分:唤醒和分发。

使用实时 SunOS 提供的新调度技术,可以将系统分发延迟时间限制在指定的范围内。如下表中所示,可以通过有限进程数来改善分发延迟。

表 10–1 实时系统分发延迟

工作站 

有限进程数 

任意进程数 

SPARCstation 2 

在活动进程数小于 16 的系统中,小于0.5 毫秒 

1.0 毫秒 

SPARCstation 5 

小于 0.3 毫秒 

0.3 毫秒 

调度类

SunOS 内核按优先级分发进程。调度器或分发程序支持调度类这一概念。可以将类定义为实时类 (RT)、系统类 (SYS) 和分时类 (TS)。每个类都有一个唯一的调度策略,用于分发属于此类的进程。

内核首先分发优先级最高的进程。缺省情况下,实时进程优先于 sysTS 进程。管理员可以配置系统以使 TS 进程和 RT 进程的优先级重叠。

下图说明了 SunOS 内核所查看的类的概念。

图 10–4 调度类的分发优先级

此图形显示了优先级高于实时、内核或分时进程中软件中断的硬件系统中断。

无法由软件控制的硬件中断具有最高优先级。处理中断的例程会从中断处直接立即进行分发,而不会考虑当前进程的优先级。

实时进程具有最高的缺省软件优先级。RT 类中的进程具有优先级以及时间量程值。RT 进程将严格按照这些参数进行调度。只要 RT 进程准备运行,SYSTS 进程便无法运行。通过固定优先级调度,关键进程可以按照预先确定的顺序运行,直到完成为止。这些优先级永远不会更改,除非应用程序对其进行更改。

RT 类的进程可继承父进程的时间量程(有限或无限)。具有有限时间量程的进程将一直运行到时间量程到期为止。如果具有有限时间量程的进程在等待 I/O 事件时阻塞,或者被优先级较高的可运行实时进程抢占,则该进程也会停止运行。具有无限时间量程的进程仅当终止、阻塞或被抢占时才会停止执行。

SYS 类用于调度特殊系统进程(如换页、STREAMS 和交换程序)的执行。不能将进程的类更改为 SYS 类。SYS 类的进程具有内核在进程启动时所建立的固定优先级。

分时 (TS) 进程的优先级最低。TS 类的进程以动态方式进行调度,每个时间片为数百毫秒。TS 调度器可以循环方式切换上下文,通常足以为每个进程提供平等的运行机会,具体取决于以下各项:

缺省分时策略会为优先级较低的进程提供较大的时间片。

子进程可通过 fork(2) 继承父进程的调度类和属性。通过 exec(2) 无法更改进程的调度类和属性。

每个调度类通过不同的算法分发。内核将调用与类有关的例程以做出有关 CPU 进程调度的决定。内核与类无关,并会删除队列中优先级最高的进程。每个类都负责针对属于此类的进程计算其优先级值。该值将放入此进程的分发优先级变量中。

如下图所示,每个类算法都采用不同的方法来确定将放入全局运行队列中的最高优先级进程。

图 10–5 内核分发队列

上下文说明了此图形。

每个类都具有应用于此类中的进程的一组优先级别。特定于类的映射会将这些优先级映射到一组全局优先级。不要求一组全局调度优先级映射从零开始或具有连续性。

缺省情况下,分时 (TS) 进程的全局优先级值的范围为 -20 到 +20。这些全局优先级值映射到内核 0-40,临时指定值最高为 99。实时 (RT) 进程的缺省优先级范围为 0-59,并映射到内核 100 到 159。与类无关的内核代码将运行队列中具有最高全局优先级的进程。

分发队列

分发队列是指具有相同全局优先级的进程的线性链接表。每个进程都具有调用进程时附加到进程的特定于类的信息。进程将按照基于进程全局优先级的顺序从内核分发表分发。

分发进程

分发进程时,会将进程的上下文连同其内存管理信息、寄存器和栈一起映射到内存。上下文映射完成之后便开始执行进程。内存管理信息采用硬件寄存器的形式,这些寄存器包含针对当前运行的进程执行虚拟内存转换所需的数据。

进程抢占

当可以分发优先级较高的进程时,内核便会中断其计算并强制执行上下文切换,从而抢占当前运行的进程。如果内核发现现在可以分发优先级较高的进程,则可能会随时抢占进程。

例如,假定进程 A 从外围设备执行读操作。内核会将进程 A 置于休眠状态。然后,内核发现优先级较低的进程 B 可运行。此时会分发进程 B 并开始执行此进程。最后,外围设备将中断,进程进入此设备的驱动程序。设备驱动程序使进程 A 可运行并返回。现在,内核通过处理、恢复执行已唤醒的进程 A 来抢占 B,而不是返回到已中断的进程 B。

多个进程争用内核资源时,会出现另一种值得关注的情况。高优先级的实时进程可能会等待低优先级进程所占用的资源。低优先级进程释放资源时,内核便会抢占此进程以恢复执行优先级较高的进程。

内核优先级倒置

一个或多个优先级较低的进程长时间阻塞优先级较高的进程时,便会出现优先级倒置。在 SunOS 内核中使用同步元语(如互斥锁)可能会导致优先级倒置。

某进程必须等待一个或多个进程放弃资源时,此进程便已阻塞。长时间阻塞可能会导致错过最终期限,即使对于低级别使用率也是如此。

通过实现基本优先级继承策略,已经解决了 SunOS 内核互斥锁引起的优先级倒置问题。此策略指明优先级较低的进程阻塞优先级较高的进程的执行时,优先级较低的进程便会继承优先级较高的进程的优先级。此继承将设置进程可保持阻塞状态的时间上限。此策略是内核行为的一个属性,而不是程序员通过系统调用或接口执行制定的解决方案。但是,用户级别进程仍会呈现优先级倒置。

用户优先级倒置

用户优先级倒置问题及其处理方法在《多线程编程指南》中的“互斥锁属性”中介绍。