编程接口指南

实时应用程序的基本规则

满足特定条件时才能保证实时响应。本节介绍了这些条件以及一些比较严重的设计错误。

此处所述的大多数潜在问题都会延长系统的响应时间。其中一个潜在问题可能会冻结工作站。其他更为隐蔽的错误包括优先级倒置和系统过载。

Solaris 实时进程具有以下特征:

本章通过单线程进程介绍实时操作,但是相关说明也可适用于多线程进程。有关多线程进程的详细信息,请参见《多线程编程指南》。要保证实时调度线程,必须将此线程创建为绑定线程。此外,还必须在 RT 调度类中运行此线程的 LWP。内存锁定和之前的动态绑定对于进程中的所有线程均有效。

如果进程是优先级最高的实时进程,则此进程会在变为可运行的保证分发延迟期间内占用处理器。有关更多信息,请参见分发延迟。只要此进程仍然是优先级最高的可运行进程,它便会继续运行。

实时进程可能会因为其他系统事件而失去对处理器的控制,还可能会因为其他系统事件而无法获取对处理器的控制。这些事件包括:外部事件(如中断)、资源匮乏、等待外部事件(如同步 I/O)以及进程被优先级较高的进程抢占。

实时调度通常不适用于系统初始化服务和终止服务,如 open(2)close(2)

延长响应时间的因素

本节所述的问题会在不同程度上延长系统的响应时间。这种延长可能会非常严重,以至导致应用程序错过临界期限。

实时处理也会破坏运行实时应用程序的系统上其他应用程序各方面的操作。由于实时进程具有较高的优先级,因此可能会长时间阻止分时进程运行。这种现象会导致交互式活动(如显示器和键盘响应时间)明显减慢。

同步 I/O 调用

SunOS 中的系统响应不提供 I/O 事件的时限。这意味着不应在任何执行时间性强的程序段中包含同步 I/O 调用。即使允许具有较长时限的程序段也不能执行同步 I/O。海量存储 I/O 即是这样一个示例,它会导致在执行读写操作时将系统挂起。

常见应用程序错误是执行 I/O 以从磁盘中获取错误消息文本。应该通过独立进程或独立线程以此方式执行 I/O 操作。此类独立进程或独立线程不应该实时运行。

中断服务

中断优先级与进程优先级无关。一组进程操作引起的硬件中断服务无法继承为这些进程设置的优先级。因此,高优先级实时进程所控制的设备不必具有高优先级中断处理。

共享库

通过使用动态链接的共享库,分时进程可以节省大量内存。此类型的链接通过文件映射的形式实现。动态链接库例程将导致隐式读取。

调用程序时,实时程序可以将环境变量 LD_BIND_NOW 设置为非 NULL 值。通过设置此环境变量的值,可以在避免动态绑定的同时使用共享库。此过程还会强制在开始执行程序之前绑定所有动态链接。有关更多信息,请参见《链接程序和库指南》

优先级倒置

分时进程可以通过占用实时进程所需的资源来阻塞实时进程。当优先级较低的进程阻塞优先级较高的进程时,便会出现优先级倒置。术语阻塞是指进程必须等待一个或多个进程放弃对资源的控制的情况。如果此阻塞时间延长,则实时进程可能会错过其最终期限。

请考虑下图所示的情况,其中高优先级进程需要共享资源。优先级较低的进程占用资源并被中优先级的进程抢占,从而阻塞高优先级进程。其中可涉及任意数量的中间进程。必须执行完所有中间进程以及优先级较低的进程的关键部分。这一系列执行操作可能需要任意长时间。

图 10–1 无限制的优先级倒置

上下文说明了此图形。

此问题及其处理方法在《多线程编程指南》中的“互斥锁属性”中介绍。

严格锁定

页面的锁定计数达到 65535 (0xFFFF) 时,此页面便会永久锁定到内存中。值 0xFFFF 通过实现来进行定义并可能会在将来发行版中发生更改。无法解除锁定以此方式锁定的页面。

失控的实时进程

失控的实时进程可能会导致系统停止。此类失控 (runaway) 进程还会极大减慢系统响应速度,从而使系统看似停止。


注 –

如果 SPARC 系统中具有失控 (runaway) 进程,请按 Stop-A。您可能必须按 Stop-A 多次。如果按 Stop-A 不起作用,请关闭电源,稍等片刻,然后重新打开电源。如果非 SPARC 系统中具有失控 (runaway) 进程,请关闭电源,稍等片刻,然后重新打开电源。


如果高优先级实时进程没有放弃对 CPU 的控制,则必须中断死循环才能重新获取对系统的控制。此类失控 (runaway) 进程不会对 Ctrl-C 做出响应。尝试使用优先级设置为高于失控 (runaway) 进程优先级的 shell 也不起作用。

异步 I/O 行为

异步 I/O 操作不会始终按照这些操作在内核中的排队顺序执行。异步操作不必按照这些操作的执行顺序返回到调用方。

如果针对一系列快速 aioread(3AIO) 调用指定单个缓冲区,则此缓冲区的状态是不确定的。从首次调用到将最后结果通知给调用方这段时间内,缓冲区的状态始终是不确定的。

一个单独的 aio_result_t 结构只能用于一个异步操作。操作可以是读操作,也可以是写操作。

实时文件

SunOS 未提供任何功能来确保按照物理连续的方式分配文件。

对于常规文件,会始终缓冲 read(2)write(2) 操作。应用程序可以使用 mmap(2)msync(3C) 在辅助存储器与进程内存之间实现直接 I/O 传输。