Linux时间子系统之二:表示时间的单位和结构

人们习惯用于表示时间的方法是:年、月、日、时、分、秒、毫秒、星期等等,但是在内核中,为了软件逻辑和代码的方便性,它使用了一些不同的时间表示方法,并为这些表示方法定义了相应的变量和数据结构,本节的内容就是阐述这些表示方法的意义和区别。
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
1. jiffies
内核用jiffies变量记录系统启动以来经过的时钟滴答数,它的声明如下:
[cpp]view plaincopy
externu64__jiffy_datajiffies_64;
externunsignedlongvolatile__jiffy_datajiffies;
可见,在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进行比较时,应该使用以下辅助宏来实现:
[cpp]view plaincopy
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和毫秒以及纳秒之间的转换:
[cpp]view plaincopy
unsignedintjiffies_to_msecs(constunsignedlongj);
unsignedintjiffies_to_usecs(constunsignedlongj);
unsignedlongmsecs_to_jiffies(constunsignedintm);
unsignedlongusecs_to_jiffies(constunsignedintu);
2. struct timeval
timeval由秒和微秒组成,它的定义如下:
[cpp]view plaincopy
structtimeval{
__kernel_time_ttv_sec;/*seconds*/
__kernel_suseconds_ttv_usec;/*microseconds*/
};
__kernel_time_t 和__kernel_suseconds_t 实际上都是long型的整数。gettimeofday和settimeofday使用timeval作为时间单位。
3. struct timespec
timespec由秒和纳秒组成,它的定义如下:
[cpp]view plaincopy
structtimespec{
__kernel_time_ttv_sec;/*seconds*/
longtv_nsec;/*nanoseconds*/
};
同样地,内核也提供了一些辅助函数用于jiffies、timeval、timespec之间的转换:
[cpp]view plaincopy
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,s64nsec);
staticinlinestructtimespectimespec_add(structtimespeclhs,structtimespecrhs);
staticinlinestructtimespectimespec_sub(structtimespeclhs,structtimespecrhs);
staticinlines64timespec_to_ns(conststructtimespec*ts);
staticinlines64timeval_to_ns(conststructtimeval*tv);
externstructtimespecns_to_timespec(consts64nsec);
externstructtimevalns_to_timeval(consts64nsec);
static__always_inlinevoidtimespec_add_ns(structtimespec*a,u64ns);
[cpp]view plaincopy
unsignedlongtimespec_to_jiffies(conststructtimespec*value);
voidjiffies_to_timespec(constunsignedlongjiffies,structtimespec*value);
unsignedlongtimeval_to_jiffies(conststructtimeval*value);
voidjiffies_to_timeval(constunsignedlongjiffies,structtimeval*value);
timekeeper中的xtime字段用timespec作为时间单位。
4. struct ktime
linux的通用时间架构用ktime来表示时间,为了兼容32位和64位以及big-little endian系统,ktime结构被定义如下:
[cpp]view plaincopy
unionktime{
s64tv64;
#ifbits_per_long!=64&&!defined(config_ktime_scalar)
struct{
#ifdef__big_endian
s32sec,nsec;
#else
s32nsec,sec;
#endif
}tv;
#endif
};
64位的系统可以直接访问tv64字段,单位是纳秒,32位的系统则被拆分为两个字段:sec和nsec,并且照顾了大小端的不同。高精度定时器通常用ktime作为计时单位。下面是一些辅助函数用于计算和转换:
[cpp]view plaincopy
ktime_tktime_set(constlongsecs,constunsignedlongnsecs);
ktime_tktime_sub(constktime_tlhs,constktime_trhs);
ktime_tktime_add(constktime_tadd1,constktime_tadd2);
ktime_tktime_add_ns(constktime_tkt,u64nsec);
ktime_tktime_sub_ns(constktime_tkt,u64nsec);
ktime_ttimespec_to_ktime(conststructtimespects);
ktime_ttimeval_to_ktime(conststructtimevaltv);
structtimespecktime_to_timespec(constktime_tkt);
structtimevalktime_to_timeval(constktime_tkt);
s64ktime_to_ns(constktime_tkt);
intktime_equal(constktime_tcmp1,constktime_tcmp2);
s64ktime_to_us(constktime_tkt);
s64ktime_to_ms(constktime_tkt);
ktime_tns_to_ktime(u64ns);

华为手机中国市场Q3占比超40% 华为18年对欧洲GDP贡献128亿欧元
边缘计算产业的现状如何?遇到的困难有哪些?
频谱分析仪的应用及类型
一种嵌入式的实时视频采集系统设计
互联汽车是现实还是未来的梦想?
Linux时间子系统之二:表示时间的单位和结构
人工智能与传统监控系统的加速融合
下一代Mac操作系统OS X Lion或于6月14日上市
防止黑客入侵网站都有些什么办法
数字孪生技术赋能港口三维可视化平台建设,确保港口安全运营
华为手机尚未崛起,但即将崛起!
三相异步电动机的转速是多少啊?三相异步电动机的转速与什么有关?
索尼XperiaXZ2体验 一切看起来都新鲜了不少
如何调整直线位移传感器安装,直线位移传感器的调整方法!
高压锂离子电池的发展现状详细资料说明
超低功耗离线智能语音识别芯片AT6811
智慧消防领域,传感器如何助力余压监控系统发挥最大产品价值?
专注视频监控,杭州海康威视做到了全球第一
核电站大型精密件测量分析平面度尺寸以及外形位置度尺寸检测过程
虹膜识别安全吗_虹膜识别不出来怎么办