用户空间的实时程序需要Linux内核提供的服务,这些服务包含进程调度、进程间通讯、性能提升等等。我们来分析一下各种系统调用(内核为用户程序提供的这些服务对实时应用程序开发者很有帮助)。这些系统调用可被用来限制操作环境。
Linux内核中共有208个系统调用,系统调用通常都是间接通过库例程被使用的,这些库例程和系统调用习惯上都使用相同的名称,但有些时候也会映射到替代的系统调用上,比如Linux中GUN C库(2.6.23版本)中的信号库例程就映射到sigaction系统调用上。
实时应用程序可能会调用几乎所有的系统调用,其中我们最感兴趣的调用是exit(2)、fork(2)、exec(2)、kill(2)、pipe(2)、brk(2)、getrususage(2)、mmap(2)、setitimer(2)、ipc(2)(它有三种形式:semget()、shmget()和msgget())、clone()、mlockall(2)和sched_setscheduler(2)。这些调用中的大多数在W. Richard Stevens所著的《UNIX高级环境编程》或Bill O. Gallmeister所著的《POSIX 4:现实世界编程》中都做了叙述。clone()系统调用是Linux特有的调用,其它大多数系统调用都和Unix系统的系统调用兼容。但是还是请详细阅读相关的帮助发现其中的细微差异。
Linux上的实时应用程序和POSIX线程调用也密切相关,比如pthread_create()和pthread_mutex_lock()例程。Linux中已经存在了这些函数的实现,最常被使用的是来自GUN C库中的实现。这些被称为Linux线程的函数基于clone()系统调用实现并且由Linux调度器调度。但是有些POSIX函数只对POSIX线程有效(比如,sem_wait())而不能用在Linux进程中。
在普通Linux系统中运行的应用程序可能在非理想条件下都相当的慢,因为它要受众多条件影响,特别是资源争用现象,这些资源包含同步原子(synchronization primitives)、内存、CPU、总线、CPU高速缓存和中断控制器等。
应用程序可以采用许多方法减少资源争用发生。对同步机制来说,比如互斥变量和信号量等应该在程序中减少使用;采用优先级继承版本的函数;采用相对快速的实现;减少在临界区中停留时间等等。CPU的争用受优先级的影响,比如可以将非抢占内核看作是抛弃优先级的典型。总线的争用一般不会很长时间,用不着过分关注,但是具体如何是由你硬件决定的。你是否有时钟要花70毫秒时间响应或持有总线?对高速缓存的争用要受切换频率和大量随机数据或指令的影响。