cyclictest实现原理

做嵌入式虚拟化实验时,对实时性能的测试一直都是用的cyclictest,它其实代码只有几百行,基本的原理也是非常简单的,但是它用到的API是要注意一下的。
这里假定cyclictest所用参数为:cyclictest -t1 -n -m -p 80 -i 10000 -l 10000。这里面与clock相关的设置是:-n指定使用clock_nanosleep();没有指定-clock,那么就是用默认的CLOCK_MONOTONIC,而不是CLOCK_REALTIME;没有指定-r,那么就是使用默认的absolute time,而不是relative。
cyclictest代码的关键流程是:
1. 先用clock_gettime(CLOCK_MONOTONIC,&now)获取当前时间T1;
2. 然后判断出par->mode是MODE_CLOCK_NANOSLEEP,par->timermode=TIMER_ABSTIME,因而执行clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next, NULL);
3. 之后再用 clock_gettime( CLOCK_MONOTONIC,&now)获取当前时间T2,计算T2-(T1+interval)就可以得到latency了。从代码中看,T1+interval赋值给了next,于是只要计算第二次的now(T2) - next就可以了。
那么,如果要将cyclictest移植到其他OS中去,clock_gettime和clock_nanosleep是两个很关键的API,要看在其他OS中是否有对应的API可以调用。
稍微看了一下clock_gettime在Linux内核中的实现,参考clock_gettime.c:如果是CLOCK_REALTIME,那么它将调用gettimeofday获取时间放入struct timeval变量中,然后将其转换为struct timespec类型(timeval精度是微妙,timespec精度是纳秒)。如果是CLOCK_MONOTONIC,调用hp_timing_gettime。hp_timing_gettime流程如下:
1. 先调用__get_clockfreq获取CPU时钟频率freq,也就是主频;
2. 然后调用HP_TIMING_NOW(tsc)获取当前时间,从变量名称上看应该是读的TSC;
3. tsc减去当前进程启动时读取的TSC
4. tsc/freq就可以计算出经过的秒数;(tsc%freq)*10^9 / freq可以计算出经过的纳秒数
查过一些资料,在x86中,gettimeofday一般也是用TSC来实现的,但是精度只有微妙级。所以,总的来说,clock_gettime就是通过读取TSC来gettime,这就与HZ的值无关了。另外,我想gettimeofday的实现应是在启动读RTC时,将REAL-TIME转换为TSC值,之后gettimeofday返回这个值加上当前TSC(因为TSC在CPU启动时是从0开始计数),再转换为微妙格式。
最后提一下,cyclictest的timerthread中,还有判断par->mode是否为MODE_CYCLIC,这个与本参数的设置无关系,它的作用是不是每测一次iteration后马上开始下一个,而是指定从本次iteration开始后的某周期时间后开始下次iteration。这就类似于ltp_latency的period测试方式了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值