linux 相对时间

转载 2015年07月10日 11:45:00
今天,再次碰到一个由于系统时间调整导致的bug。不得不再次查找完美的问题解决方案。

虽然,按道理来说,系统时间进行重置之后,一些应用程序的行为出现异常是合乎情理,并且是可以被理解并接受的,最重要的是这样的问题都可以通过重新启动操作系统来解决(微软大哥解决问题之道),但是,对于软件开发人员来说,应该尽量避免非必要的重启。对自己严格要求点儿似乎没什么过错!?

对绝对时间的依赖似乎不怎么容易摆脱,但是我们的应用程序又有多少是严格依赖于系统的绝对时间呢?很多时候,我们只要求能够求出时间间隔就可以了。时间间隔实际上是可以抛开绝对时间求得的,我们可以采用相对于某个时间点的相对时钟来计时,比如说系统启动时间。

自然地,我们就想到了proc伪文件系统下的/proc/uptime文件。通过读这个文件,我们能够获得相对于系统启动时刻的相对时间,其精度为百分之一秒:

[xiaosuo@Ulard-iolo ~]$ cat /proc/uptime
4057840.13 3326432.09

读/proc/uptime简单易行,也适合shell操作,但是只为了一个简单的相对时间就进行三次系统调用(open, read, close)和一次字符串解析,这样的复杂度显然不能满足吹毛求疵的我这种人的非礼要求。

联想到Linux内核空间的精度为(1/HZ)秒的计时变量jiffies,如果有哪个系统调用把它导到用户空间,其效率可见是比较高的,再次扒到了系统调用times:

       #include <sys/times.h>

       clock_t times(struct tms *buf);


times的返回值是相对于某个固定时刻的时间。这个固定时刻,在2.4内核及其之前是系统启动,以后就改成了系统启动((2^32/HZ) - 300)秒之前(这个对jiffies初始值的改动是为了使Linux内核能够尽快地暴露有关jiffies变量回卷的bug)。所以,应用程序不要依赖于这个开始时刻,如果非要依赖,可以通过其他的方式先得到系统的启动时间,然后与其做差值,求得偏移量,以后就能参考这个偏差求得系统的启动时间。这个函数的返回值clock_t的单位为(1/sysconf(_SC_CLK_TCK);)秒(sysconf(_SC_CLK_TCK)通常为100),并且clock_t可能溢出(在2.6内核的Linux系统上,系统启动5分钟就会溢出),所以需要特别小心。

times虽然高效,但是他的精度还是略显不够,所以我继续挖掘。最终找到了clock_gettime这个系统调用:

       #include <time.h>

       int clock_getres(clockid_t clk_id, struct timespec *res);
       int clock_gettime(clockid_t clk_id, struct timespec *tp);


clk_id为CLOCK_MONOTONIC的单调时钟能够满足我们的需求,并且它的精度一般都会很高,略微地浏览了一遍它的内核实现,也较为轻量,可谓完美!

以上介绍的三种获得相对时间的方法的详细用法,还请各位在需要的时候去翻看其手册页,

Linux时间戳和标准时间的互转

Linux时间戳和标准时间的互转 在LINUX系统中,有许多场合都使用时间戳的方式表示时间,即从1970年1月1日起至当前的天数或秒数。如/etc/shadow里的密码更...
  • hittata
  • hittata
  • 2012年06月07日 10:36
  • 67144

linux网络对时命令

linux网络对时命令   1.安装netdate   yum install ntpdate   2.设置自己的时区 # vi /etc/sysconfig/clock   ZONE...
  • customicondesign
  • customicondesign
  • 2015年10月29日 15:41
  • 2813

Linux启动时间的极限优化

       在上次完成嵌入式应用的Linux裁减后,Linux的启动时间仍需要 7s 左右,虽然勉强可以接受,但仍然没有达到我个人所追求的目标——2s 以内。况且,在实际的商用环境中,设备可靠性的要...
  • hubu01
  • hubu01
  • 2007年05月21日 02:20
  • 1822

Linux Kernel启动时间调试

要观察Kernel各个模块启动时间,并且针对性的进行优化,一般用Initcall Debug来进行调试,我的调试笔记如下: 1. u-boot修改     首先修改u-boot的启动参数,在boo...
  • qq_29729577
  • qq_29729577
  • 2016年07月29日 11:21
  • 703

linux下ntp对时设置

1、首先在 /etc/profile 中添加环境变量: ntp=/mnt export ntp PATH=$PATH:$HOME:$ntp: export PATH2、在开发板上ping...
  • xxgxgx
  • xxgxgx
  • 2016年04月11日 15:05
  • 1696

Linux内核时间管理

(1)内核中的时间概念     时间管理在linux内核中占有非常重要的作用。     相对于事件驱动而言,内核中有大量函数是基于时间驱动的。     有些函数是周期执行的,比如每10毫秒...
  • liuhongwei123888
  • liuhongwei123888
  • 2013年03月16日 14:42
  • 4548

嵌入式linux开机时间优化小结

Ø        用Image替代zImage,zImage是压缩后的内核镜像文件,所以使用Image就省去的加载时的解压所消耗的时间(大概可以节省2~3秒的启动时间)。但若使用Image则应考虑Na...
  • cjsycyl
  • cjsycyl
  • 2012年07月04日 16:45
  • 4138

Linux开机启动顺序小结

Linux开机启动十步骤 收藏分享2012-2-6 11:15| 发布者: 红黑魂| 查看数: 1366| 评论数: 0|来自: 比特网 摘要:   开机过程指...
  • bailyzheng
  • bailyzheng
  • 2012年04月21日 20:45
  • 16654

关于lua中显示绝对时间和相对时间

最近做公司项目需要把服务器传过来的毫秒数转换为绝对时间如 2016年4月6日09:55:45 或者相对时间1年3个月\3个月15天\15天11小时\11小时13分 绝对时间直接用lua o...
  • lupin8888
  • lupin8888
  • 2016年04月06日 10:01
  • 328

关于lua中显示绝对时间和相对时间

最近做公司项目需要把服务器传过来的毫秒数转换为绝对时间如 2016年4月6日09:55:45 或者相对时间1年3个月\3个月15天\15天11小时\11小时13分 绝对时间直接用lua o...
  • lupin8888
  • lupin8888
  • 2016年04月06日 10:01
  • 328
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 相对时间
举报原因:
原因补充:

(最多只允许输入30个字)