Linux嵌入式实时操作系统开发与设计(三)

类别:编程语言 点击:0 评论:0 推荐:

第二章  实时系统的相关研究

尽管现在的操作系统变得种类繁多,但是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