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

上传人:白大夫 文档编号:3255374 上传时间:2019-08-06 格式:DOC 页数:4 大小:26.50KB
返回 下载 相关 举报
Linux时间子系统之二:表示时间的单位和结构.doc_第1页
第1页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Linux时间子系统之二:表示时间的单位和结构.doc》由会员分享,可在线阅读,更多相关《Linux时间子系统之二:表示时间的单位和结构.doc(4页珍藏版)》请在三一文库上搜索。

1、Linux时间子系统之二:表示时间的单位和结构人们习惯用于表示时间的方法是:年、月、日、时、分、秒、毫秒、星期等等,但是在内核中,为了软件逻辑和代码的方便性,它使用了一些不同的时间表示方法,并为这些表示方法定义了相应的变量和数据结构,本节的内容就是阐述这些表示方法的意义和区别。/*/声明:本博内容均由http:/blog.csdn/droidphone原创,转载请注明出处,谢谢!/*/1. jiffies内核用jiffies变量记录系统启动以来经过的时钟滴答数,它的声明如下:cppview plaincopyexternu64_jiffy_datajiffies_64;externunsign

2、edlongvolatile_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,那么,低精度定时

3、器(TImer_list)的精度就是1ms=1/1000秒。因为jiffies变量可能存在溢出的问题,所以在用基于jiffies进行比较时,应该使用以下辅助宏来实现:cppview plaincopyTIme_after(a,b)TIme_before(a,b)TIme_after_eq(a,b)time_before_eq(a,b)time_in_range(a,b,c)同时,内核还提供了一些辅助函数用于jiffies和毫秒以及纳秒之间的转换:cppview plaincopyunsignedintjiffies_to_msecs(constunsignedlongj);unsignedin

4、tjiffies_to_usecs(constunsignedlongj);unsignedlongmsecs_to_jiffies(constunsignedintm);unsignedlongusecs_to_jiffies(constunsignedintu);2. struct timevaltimeval由秒和微秒组成,它的定义如下:cppview plaincopystructtimeval_kernel_time_ttv_sec;/*seconds*/_kernel_suseconds_ttv_usec;/*microseconds*/;_kernel_time_t 和_kern

5、el_suseconds_t 实际上都是long型的整数。gettimeofday和settimeofday使用timeval作为时间单位。3. struct timespectimespec由秒和纳秒组成,它的定义如下:cppview plaincopystructtimespec_kernel_time_ttv_sec;/*seconds*/longtv_nsec;/*nanoseconds*/;同样地,内核也提供了一些辅助函数用于jiffies、timeval、timespec之间的转换:cppview plaincopystaticinlineinttimespec_equal(con

6、ststructtimespec*a,conststructtimespec*b);staticinlineinttimespec_compare(conststructtimespec*lhs,conststructtimespec*rhs);staticinlineinttimeval_compare(conststructtimeval*lhs,conststructtimeval*rhs);externunsignedlongmktime(constunsignedintyear,constunsignedintmon,constunsignedintday,constunsigned

7、inthour,constunsignedintmin,constunsignedintsec);externvoidset_normalized_timespec(structtimespec*ts,time_tsec,s64nsec);staticinlinestructtimespectimespec_add(structtimespeclhs,structtimespecrhs);staticinlinestructtimespectimespec_sub(structtimespeclhs,structtimespecrhs);staticinlines64timespec_to_n

8、s(conststructtimespec*ts);staticinlines64timeval_to_ns(conststructtimeval*tv);externstructtimespecns_to_timespec(consts64nsec);externstructtimevalns_to_timeval(consts64nsec);static_always_inlinevoidtimespec_add_ns(structtimespec*a,u64ns);cppview plaincopyunsignedlongtimespec_to_jiffies(conststructti

9、mespec*value);voidjiffies_to_timespec(constunsignedlongjiffies,structtimespec*value);unsignedlongtimeval_to_jiffies(conststructtimeval*value);voidjiffies_to_timeval(constunsignedlongjiffies,structtimeval*value);timekeeper中的xtime字段用timespec作为时间单位。4. struct ktimelinux的通用时间架构用ktime来表示时间,为了兼容32位和64位以及bi

10、g-little endian系统,ktime结构被定义如下:cppview plaincopyunionktimes64tv64;#ifBITS_PER_LONG!=64struct#ifdef_BIG_ENDIANs32sec,nsec;#elses32nsec,sec;#endiftv;#endif;64位的系统可以直接访问tv64字段,单位是纳秒,32位的系统则被拆分为两个字段:sec和nsec,并且照顾了大小端的不同。高精度定时器通常用ktime作为计时单位。下面是一些辅助函数用于计算和转换:cppview plaincopyktime_tktime_set(constlongsec

11、s,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);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1