天天看点

linux times函数分析。

时钟滴答(clock tick) 请问时间的嘀嗒数是根据什么来设定的

有必要明确一些Linux内核时钟驱动中的基本概念。

(1)时钟周期(clock cycle)的频率:8253/8254 PIT的本质就是对由晶体振荡器产生的时钟周期进行计数,晶体振荡器在1秒时间内产生的时钟脉冲个数就是时钟周期的频率。Linux用宏 CLOCK_TICK_RATE来表示8254 PIT的输入时钟脉冲的频率(在PC机中这个值通常是1193180HZ),该宏定义在include/asm-i386/timex.h头文件中:

#define CLOCK_TICK_RATE 1193180

(2)时钟滴答(clock tick):我们知道,当PIT通道0的计数器减到0值时,它就在IRQ0上产生一次时钟中断,也即一次时钟滴答。PIT通道0的计数器的初始值决定了要过多少时钟周期才产生一次时钟中断,因此也就决定了一次时钟滴答的时间间隔长度。

(3)时钟滴答的频率(HZ):也即1秒时间内PIT所产生的时钟滴答次数。类似地,这个值也是由PIT通道0的计数器初值决定的(反过来说,确定了时钟滴答的频率值后也就可以确定8254 PIT通道0的计数器初值)。Linux内核用宏HZ来表示时钟滴答的频率,而且在不同的平台上HZ有不同的定义值。对于ALPHA和IA62平台HZ的值是1024,对于SPARC、MIPS、ARM和i386等平台HZ的值都是100。该宏在i386平台上的定义如下(include/asm- i386/param.h):

#ifndef HZ

#define HZ 100

#endif

根据HZ的值,我们也可以知道一次时钟滴答的具体时间间隔应该是(1000ms/HZ)=10ms。

times函数使用不适用于线程上取执行时间间隔。一般的时间精度为10ms,比gettimeofday低的。

==times tms_utime HandControlProcess=== 0.000000

==times tms_stime HandControlProcess=== 0.000000

==times tms_cutime HandControlProcess=== 0.000000

==times tms_cstime HandControlProcess=== 0.000000

==times tms_cstime HandControlProcess times_2-times_1=== 2000.000000

HZ=100

20.000000

#include <stdio.h>

#include <linux/time.h>

#include<sys/times.h>

#include <unistd.h>

#define CLOCKS_PER_SEC 1l

//#define _SC_CLK_TCK 100l

int main()

{

  struct tms tmp;

        struct tms tmp1, tmp2;

     clock_t times_1, times_2;

  clock_t begin = times(&tmp);

  times_1 = times(&tmp1);

  sleep(20);

  times_2 = times(&tmp2);

  printf("==times tms_utime HandControlProcess=== %lf\n", (double)(tmp2.tms_utime-tmp1.tms_utime)/1);

  printf("==times tms_stime HandControlProcess=== %lf\n", (double)(tmp2.tms_stime-tmp1.tms_stime)/1);

  printf("==times tms_cutime HandControlProcess=== %lf\n", (double)(tmp2.tms_cutime-tmp1.tms_cutime)/1);

  printf("==times tms_cstime HandControlProcess=== %lf\n", (double)(tmp2.tms_cstime-tmp1.tms_cstime)/1);

  printf("==times tms_cstime HandControlProcess times_2-times_1=== %lf\n", (double)(times_2-times_1)/1);

  clock_t end = times(&tmp);

  unsigned long HZ = sysconf( _SC_CLK_TCK );

  printf("HZ=%ld\n", HZ);

  printf("%lf\n", (double)(end-begin)/HZ );

}