linux时间是什么单位,[转载]Linux时间子系统之二:表示时间的单位和结构

人们习惯用于表示时间的方法是:年、月、日、时、分、秒、毫秒、星期等等,但是在内核中,为了软件逻辑和代码的方便性,它使用了一些不同的时间表示方法,并为这些表示方法定义了相应的变量和数据结构,本节的内容就是阐述这些表示方法的意义和区别。

声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!

1.

jiffies

内核用jiffies变量记录系统启动以来经过的时钟滴答数,它的声明如下:

externu64 __jiffy_data jiffies_64;

externunsignedlongvolatile__jiffy_data jiffies;

可见,在32位的系统上,jiffies是一个32位的无符号数,系统每过1/HZ秒,jiffies的值就会加1,最终该变量可能会溢出,所以内核同时又定义了一个64位的变量jiffies_64,链接的脚本保证jiffies变量和jiffies_64变量的内存地址是相同的,通常,我们可以直接访问jiffies变量,但是要获得jiffies_64变量,必须通过辅助函数get_jiffies_64来实现。jiffies是内核的低精度定时器的计时单位,所以内核配置的HZ数决定了低精度定时器的精度,如果HZ数被设定为1000,那么,低精度定时器(timer_list)的精度就是1ms=1/1000秒。因为jiffies变量可能存在溢出的问题,所以在用基于jiffies进行比较时,应该使用以下辅助宏来实现:

time_after(a,b)

time_before(a,b)

time_after_eq(a,b)

time_before_eq(a,b)

time_in_range(a,b,c)

同时,内核还提供了一些辅助函数用于jiffies和毫秒以及纳秒之间的转换:

unsignedintjiffies_to_msecs(constunsignedlongj);

unsigned intjiffies_to_usecs(constunsignedlongj);

unsigned longmsecs_to_jiffies(constunsignedintm);

unsigned longusecs_to_jiffies(constunsignedintu);

2.

struct timeval

timeval由秒和微秒组成,它的定义如下:

structtimeval {

__kernel_time_t tv_sec;

__kernel_suseconds_t tv_usec;

};

__kernel_time_t 和__kernel_suseconds_t

实际上都是long型的整数。gettimeofday和settimeofday使用timeval作为时间单位。

3.

struct timespec

timespec由秒和纳秒组成,它的定义如下:

structtimespec {

__kernel_time_t tv_sec;

longtv_nsec;

};

同样地,内核也提供了一些辅助函数用于jiffies、timeval、timespec之间的转换:

staticinlineinttimespec_equal(conststructtimespec *a,conststructtimespec *b);

staticinlineinttimespec_compare(conststructtimespec *lhs,conststructtimespec *rhs);

staticinlineinttimeval_compare(conststructtimeval *lhs,conststructtimeval *rhs);

externunsignedlongmktime(constunsignedintyear,constunsignedintmon,

constunsignedintday,constunsignedinthour,

constunsignedintmin,constunsignedintsec);

externvoidset_normalized_timespec(structtimespec *ts,time_tsec, s64 nsec);

staticinlinestructtimespec timespec_add(structtimespec lhs,structtimespec rhs);

staticinlinestructtimespec timespec_sub(structtimespec lhs,structtimespec rhs);

staticinlines64 timespec_to_ns(conststructtimespec *ts);

staticinlines64 timeval_to_ns(conststructtimeval *tv);

externstructtimespec ns_to_timespec(consts64 nsec);

externstructtimeval ns_to_timeval_r(consts64 nsec);

static__always_inlinevoidtimespec_add_ns(structtimespec *a, u64 ns);

unsignedlongtimespec_to_jiffies(conststructtimespec *value);

voidjiffies_to_timespec(constunsignedlongjiffies,structtimespec *value);

unsigned longtimeval_to_jiffies(conststructtimeval *value);

voidjiffies_to_timeval_r(constunsignedlongjiffies,structtimeval *value);

timekeeper中的xtime字段用timespec作为时间单位。

4.

struct ktime

linux的  通用时间架构

用ktime来表示时间,为了兼容32位和64位以及big-little

endian系统,ktime结构被定义如下:

unionktime {

s64 tv64;

#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)

struct{

# ifdef __BIG_ENDIAN

s32 sec, nsec;

# else

s32 nsec, sec;

# endif

} tv;

#endif

};

64位的系统可以直接访问tv64字段,单位是纳秒,32位的系统则被拆分为两个字段:sec和nsec,并且照顾了大小端的不同。高精度定时器通常用ktime作为计时单位。下面是一些辅助函数用于计算和转换:

ktime_t ktime_set(constlongsecs,constunsignedlongnsecs);

ktime_t ktime_sub(constktime_t lhs,constktime_t rhs);

ktime_t ktime_add(constktime_t add1,constktime_t add2);

ktime_t ktime_add_ns(constktime_t kt, u64 nsec);

ktime_t ktime_sub_ns(constktime_t kt, u64 nsec);

ktime_t timespec_to_ktime(conststructtimespec ts);

ktime_t timeval_to_ktime(conststructtimeval tv);

structtimespec ktime_to_timespec(constktime_t kt);

structtimeval ktime_to_timeval_r(constktime_t kt);

s64 ktime_to_ns(constktime_t kt);

intktime_equal(constktime_t cmp1,constktime_t cmp2);

s64 ktime_to_us(constktime_t kt);

s64 ktime_to_ms(constktime_t kt);

ktime_t ns_to_ktime(u64 ns);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值