Linux时间子系统之二:表示时间的单位和结构
人们习惯用于表示时间的方法是:年、月、日、时、分、秒、毫秒、星期等等,但是在内核中,为了软件逻辑和代码的方便性,它使用了一些不同的时间表示方法,并为这些表示方法定义了相应的变量和数据结构,本节的内容就是阐述这些表示方法的意义和区别。
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
1. jiffies
内核用jiffies变量记录系统启动以来经过的时钟滴答数,它的声明如下:
[cpp] view plain copy
- extern u64 __jiffy_data jiffies_64;
- extern unsigned long volatile __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进行比较时,应该使用以下辅助宏来实现:
[cpp] view plain copy
- 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 plain copy
- unsigned int jiffies_to_msecs(const unsigned long j);
- unsigned int jiffies_to_usecs(const unsigned long j);
- unsigned long msecs_to_jiffies(const unsigned int m);
- unsigned long usecs_to_jiffies(const unsigned int u);
2. struct timeval
timeval由秒和微秒组成,它的定义如下:
[cpp] view plain copy
- struct timeval {
- __kernel_time_t tv_sec; /* seconds */
- __kernel_suseconds_t tv_usec; /* microseconds */
- };
__kernel_time_t 和__kernel_suseconds_t 实际上都是long型的整数。gettimeofday和settimeofday使用timeval作为时间单位。
3. struct timespec
timespec由秒和纳秒组成,它的定义如下:
[cpp] view plain copy
- struct timespec {
- __kernel_time_t tv_sec; /* seconds */
- long tv_nsec; /* nanoseconds */
- };
同样地,内核也提供了一些辅助函数用于jiffies、timeval、timespec之间的转换:
[cpp] view plain copy
- static inline int timespec_equal(const struct timespec *a, const struct timespec *b);
- static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs);
- static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs);
- extern unsigned long mktime(const unsigned int year, const unsigned int mon,
- const unsigned int day, const unsigned int hour,
- const unsigned int min, const unsigned int sec);
- extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
- static inline struct timespec timespec_add(struct timespec lhs, struct timespec rhs);
- static inline struct timespec timespec_sub(struct timespec lhs, struct timespec rhs);
- static inline s64 timespec_to_ns(const struct timespec *ts);
- static inline s64 timeval_to_ns(const struct timeval *tv);
- extern struct timespec ns_to_timespec(const s64 nsec);
- extern struct timeval ns_to_timeval(const s64 nsec);
- static __always_inline void timespec_add_ns(struct timespec *a, u64 ns);
[cpp] view plain copy
- unsigned long timespec_to_jiffies(const struct timespec *value);
- void jiffies_to_timespec(const unsigned long jiffies, struct timespec *value);
- unsigned long timeval_to_jiffies(const struct timeval *value);
- void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value);
timekeeper中的xtime字段用timespec作为时间单位。
4. struct ktime
linux的通用时间架构用ktime来表示时间,为了兼容32位和64位以及big-little endian系统,ktime结构被定义如下:
[cpp] view plain copy
- union ktime {
- 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作为计时单位。下面是一些辅助函数用于计算和转换:
[cpp] view plain copy
- ktime_t ktime_set(const long secs, const unsigned long nsecs);
- ktime_t ktime_sub(const ktime_t lhs, const ktime_t rhs);
- ktime_t ktime_add(const ktime_t add1, const ktime_t add2);
- ktime_t ktime_add_ns(const ktime_t kt, u64 nsec);
- ktime_t ktime_sub_ns(const ktime_t kt, u64 nsec);
- ktime_t timespec_to_ktime(const struct timespec ts);
- ktime_t timeval_to_ktime(const struct timeval tv);
- struct timespec ktime_to_timespec(const ktime_t kt);
- struct timeval ktime_to_timeval(const ktime_t kt);
- s64 ktime_to_ns(const ktime_t kt);
- int ktime_equal(const ktime_t cmp1, const ktime_t cmp2);
- s64 ktime_to_us(const ktime_t kt);
- s64 ktime_to_ms(const ktime_t kt);
- ktime_t ns_to_ktime(u64 ns);
Linux时间子系统之二:表示时间的单位和结构的更多相关文章
- 【原创】Linux中断子系统(二)-通用框架处理
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- Linux时间子系统之二:Alarm Timer
一.前言 严格来讲Alarm Timer也算POSIX Timer一部分,包含两种类型CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM.分别是在CLOCK_REALT ...
- Linux时间子系统(十二) periodic tick
一.tick device概念介绍 1.数据结构 在内核中,使用struct tick_device来抽象系统中的tick设备,如下: struct tick_device { struct ...
- Linux时间子系统之二:表示时间的单位和结构【转】
本文转载自:http://blog.csdn.net/droidphone/article/details/7979295 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] ...
- Linux usb子系统(二):USB设备驱动usb-skeleton.c
usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...
- linux led子系统(二)
对于led子系统中,有那么多得trigger,下面就来简单了解下. 1.default-on static void defon_trig_activate(struct led_classdev * ...
- Linux时间子系统专题汇总
关于Linux时间子系统有两个系列文章讲的非常好,分别是WowoTech和DroidPhone. 还有两本书分别是介绍: Linux用户空间时间子系统<Linux/UNIX系统编程手册>的 ...
- 【原创】Linux中断子系统(三)-softirq和tasklet
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- Linux 网络子系统
今天记录一下Linux网络子系统相关的东西. 因为感觉对这一块还是有一个很大的空白,这件事情太可怕了. 摘抄多份博客进行总结一下Linux网络子系统的相关东西. 一. Linux网络子系统体系结构 L ...
随机推荐
- Linux - info
基本上,info与man的用途其实差不多,都是用来查询命令的用法或者是文件的格式.但是与man page一口气输出一堆信息不同的是,info page则是将文件数据拆成一个一个的段落,每个段落用自己的 ...
- 在Windows使用git工具将代码同步至github(作者:ying1989920)
[ps]git是一个分布式代码管理工具,类似于svn,方便协同开发,git里面有所谓的仓库(用来存放代码的),分为本地和线上,线上的你可以自己搭建,不想搭建的话github就给你提供了. [关于 ...
- 如何在Eclipse CDT中编译含有多个main函数的项目
最近在杭电ACM上做题,使用的C++工具是Eclipse,但是Eclipse CDT不能同时存在多个main函数的文件,上网也搜了很多资料,但是按他们的步骤来,还是不能实现自己想要的效果.经过一下午的 ...
- 使用Interlocked在多线程下进行原子操作,无锁无阻塞的实现线程运行状态判断
巧妙地使用Interlocked的各个方法,再无锁无阻塞的情况下判断出所有线程的运行完成状态. 昨晚耐着性子看完了clr via c#的第29章<<基元线程同步构造>>,尽管这 ...
- Salesforce的数据权限机制
本文主要介绍了 Salesforce 对于系统中数据的访问控制是如何设计的,然后也了解了下 Alfresco 和 Oracle VPD 的数据权限机制.希望对一些业务系统的数据权限的访问控制设计能有所 ...
- ionic1 下拉刷新 上拉加载 功能
html页面如下 <ion-content> <ion-refresher pulling-text="刷新" on-refresh="search() ...
- 用PULL解析器解析XML文件
第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值): 1 package lee.service; 2 3 import java.io.InputS ...
- 框架学习:ibatis框架的结构和分析
由于最近一段时间比较忙碌,<框架学习>系列的文章一直在搁浅着,最近开始继续这个系列的文章更新. 在上篇文章中我们说到了hibernate框架,它是一种基于JDBC的主流持久化框架,是一个优 ...
- 前端技术之_CSS详解第五天
前端技术之_CSS详解第五天 一.行高和字号 1.1 行高 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的. <!DOCTYPE html ...
- 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)
洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...