第二章 实时系统的相关研究
尽管现在的操作系统变得种类繁多,但是UNIX及其兼容的系统仍然是工业和学术领域标准的操作系统。一些非UNIX系统,比如Windows NT,也是与POSIX.1003标准兼容,这个标准无疑是基于UNIX。这个系统的成功是由于它的开放性、稳定性和事实的标准。随着POSIX1003.1b实时扩展标准的发布,UNIX有机会成为分布最广泛的实时处理平台。Linux作为一个类UNIX的系统,凭借其开放源码的优势,获得越来越广泛的应用。
由于以上的原因,在这一章我将集中讨论与Linux相关的实时系统。我将讨论在Linux上进行实时运算的问题,和在一些系统中如何解决这些问题。
2.1 LINUX的分时特性
UNIX最初是作为一个分时系统设计的[17]。LINUX作为UNIX的克隆,很多当前的实现中仍然保留了这些特点。它们力争最优的平均性能。这个目标通常与实时系统的低延迟和高可预言的要求相勃的。为了说明这个问题,让我们考虑一个通过扬声器发声的程序(程序2.1)。
#define DELAY 10000
main()
{
int i;
while (1) {
for (i=0;i
图2.1 异步中断和中断响应时间
中断响应时间并不是一个常量。它与操作系统和硬件平台有关。要测量精确的关闭中断的时间,并不是通过上面的定义来进行。因为从中断到来到当前任务停止属于中断延迟时间。在Linux中,内核或驱动程序显式地关/开中断,一般是通过调用__cli()/__sti()来进行操作。中断延迟程序计算一对__cli()/__sti()调用之间的时间。在调用__cli()时,记录系统时间值,读出__sti()被调用时的系统时间值。他们之间的时间差就是关中断时间。Linux下的关中断时间如图2.2所示:
关中断时间测试程序重新写了__cli()/__sti()宏,以允许记录调用它们的文件以及在何处调用。记录这些信息以分析在Linux中那些关中断时间是比较长。(中断测试程序的代码在附录A)
我对Linux进行了大约3个小时的测试,测试的结果如表。在测试中运行一些程序,其中包括一个磁盘循环拷贝程序,打开一些应用程序。可以发现系统负载比较重时,系统的页面调度花了比较多的时间,将近500微秒。表2.1表2.2是统计结果。
图2.2 关中断时间
表2.1 中断关闭时间直方图
表2.2 中断关闭时间概率密度函数直方图
可以看出在我的测试系统中系统中断关闭时间最大达到496微秒,一般中断关闭时间是在250微秒到300微秒左右。这次测试并没有进行所有情况下的测试,从这些结果我们就可以看出: Linux的系统设计人员采用分时的调度、低的计时分辨率、非占先式内核、关中断和虚拟内存是造成系统关中断时间过于长的原因。
2.2.2 上下文切换测试
上下文切换时间是保存一个进程状态,然后恢复另外一个进程状态的时间。我写了一个测试程序来测试这个时间(程序见附录B)。程序运行时,根据输入的参数来决定创建多少个进程。所有的进程用一个环形的UNIX管道连接。程序中实现一个令牌在这些进程之间传递,迫使进行进程间的上下文切换。程序记录在进程间传递令牌2000次所花的时间。每一次令牌的传递有两个开销:上下文切换开销和令牌传递开销。程序首先计算令牌在环形管道中传递的开销,在输出的结果已经除去了这部分开销。
为了计算更真实的切换时间,我加入了人为的数据在里面,进程切换时间包括保存用户级数据状态的时间。测试的结果在表2.3所示,Y轴表示切换时间,X轴表示进程数目,size表示进程的大小。
从结果看,进程的随着进程的大小变化,切换时间在增加,在16k以内增加幅度不大,是因为此时进程的大小还没有超出一级缓存的大小,超过16k时,增加幅度比较大,进程大小达到64k时,切换时间达到300微秒。Linux切换时间过于大的原因是系统保存了过于多的状态。在上下文切换过程中,系统是关中断的,意味着此时的系统关中断时间超过300微秒。对于实时应用来所是不能接受的。
表2.3 上下文切换时间
本文地址:http://com.8s8s.com/it/it28519.htm