VxWorks实时性能探究

VxWorks操作系统是一款硬实时操作系统,一直听闻其实时性能非常优秀,但是一直没有一个直观地概念。

笔者最近在使用 VxWorks , 由大名鼎鼎的风河(WindRiver)开发。本篇文章就是将VxWorks操作系统和市面上几种其他实时操作系统的实时性能进行对比。

前期知识准备

实时性能和响应时间有关,为此,先对计算机操作系统中的时间概念和时间尺度进行一下介绍。

1 s = 1000 ms = 1000000 us = 1000000000 ns,看不出来1 s时间还是很长的嘛

  • 时钟周期:主频为4 GHz的CPU的时钟周期为1/4G = 0.25 ns,时钟周期是计算机中最基本的、最小的[时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。

  • CPU周期:CPU周期亦称机器周期,一条指令执行过程被划分为若干阶段,每一阶段完成所需时间。完成一个基本操作所需要的时间称为机器周期。通常用内存中读取一个指令字的最短时间来规定CPU周期。

  • 指令周期:取出并执行一条指令的时间。想要详细了解可以看这篇文章【浅析】CPU中的指令周期、CPU周期和时钟周期

  • 内存时钟周期:相比CPU,一般的DDR内存芯片速率仅为400 MHz,时钟周期达2.5 ns, 再加上总线延时,导致内存访问时间达到几十纳秒。CPU运行速率与内存访问速率比大致为100:1。

  • 硬盘读取时间:硬盘的读写速度就更慢了,一般的机械硬盘的完成一次读写所需要的时间,主要取决寻道时间+旋转时间,完成一次读或者写的时间量级大致为ms级别,因此内存访问速率与磁盘存取速度比大致为1000:1。

上面是有关硬件方面的时间周期情况,对于操作系统或者应用程序来说,我们一般关注的是算法的时间复杂度和空间复杂度,这是从整理理想的情况来衡量一个算法的优劣。如果想要详细了解每条代码的执行所耗时间,我们需要更深入了解代码是怎么在计算机上执行的。

C语言代码都是经过预处理、编译,产生汇编代码(汇编代码几乎已经接近机器码了),一句高级语言代码相当于汇编语言的几行甚至几十行。而学过汇编语言的都应该知道,不同的汇编代码指令执行所耗费的时间也是不同的。一般来说,移位,加法,取反这种指令只需要一个时钟周期,而乘法,除法等指令需要几个乃至几十个时钟周期执行。

实时操作系统(RTOS)的实时性能评价指标

实时操作系统的实时性能评价指标一般有两个:

  • 任务切换时间

当多任务应用程序运行在操作系统上时,它把正在运行的任务的状态保存到任务自己的栈区之中,然后把下一个将要运行的任务的当前状态从该任务的栈区装入CPU的寄存器,并开始这个任务的执行,这个过程就叫做任务切换。

  • 中断响应时间

计算机接收到中断信号到操作系统做出响应,并完成切换转入中断服务程序的时间。

下图是几种实时操作系统的实时性能对比:

Commercial LTS QT 5.15.10 Released

可以看出不管是任务切换时间还是中断响应,VxWorks都是最好的,当然VxWorks也是最贵的。

此外我们还可以看出不管是任务切换还是中断响应,时间尺度都是在几个us,根据CPU主频的不同,大概是几千个时钟周期的样子。 下面代码是测试执行100万次简单循环语句所耗费的时间:

int i = 1000000;
int j = 0;
while(i){
j += 0;
i--;
}
timer = 2033 us //执行100万次该循环所耗时间,可以将执行每次的时间和任务切换的时间进行对比