取绝对时间: sysinfo(),clock_gettime()

取相对时间:time(),clock(),gettimeofday()   当ntp 或者手动date 更改日期 取出对的时间会变。

clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别

1. clock_gettime( ) 提供了纳秒的精确度
int clock_gettime(clockid_t clk_id, struct timespect *tp);
clockid_t clk_id用于指定计时时钟的类型,对于我们Programmr以下三种比较常用:
CLOCK_REALTIME, 系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户该成其他,则对应的时间相应改变
CCLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间
CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间
struct timespect *tp用来存储当前的时间,其结构如下:
struct timespec {
    time_t tv_sec; /* seconds */
   long tv_nsec; /* nanoseconds */
};

一)ANSI clock函数 
1)概述:
clock 函数的返回值类型是clock_t,它除以CLOCKS_PER_SEC来得出时间,一般用两次clock函数来计算进程自身运行的时间.

ANSI clock有三个问题:
1)如果超过一个小时,将要导致溢出.
2)函数clock没有考虑CPU被子进程使用的情况.
3)也不能区分用户空间和内核空间.
所以clock函数在Linux系统上变得没有意义.

3)总结:
(1)程序调用 system("cd");,这里主要是系统模式子进程的消耗,test1程序不能体现这一点.
(2)0.180000 seconds秒的消耗是两次clock()函数调用除以CLOCKS_PER_SEC.
(3)clock()函数返回值是一个相对时间,而不是绝对时间.
(4)CLOCKS_PER_SEC是系统定义的宏,由GNU标准库定义为1000000.

二)times()时间函数
1)概述:
原型如下:
clock_t times(struct tms *buf);
tms结构体如下:
strace tms{
 clock_t tms_utime;
 clock_t tms_stime;
 clock_t tms_cutime;
 clock_t tms_cstime;
}

注释:
tms_utime记录的是进程执行用户代码的时间.
tms_stime记录的是进程执行内核代码的时间.
tms_cutime记录的是子进程执行用户代码的时间.
tms_cstime记录的是子进程执行内核代码的时间.

3)总结:
(1)通过这个测试,系统的time程序与test2程序输出基本一致了.
(2)(double)clktck是通过clktck=sysconf(_SC_CLK_TCK)来取的,也就是要得到user-cpu所占用的时间,就要用
(tmsend->tms_utime - tmsstart->tms_utime)/(double)clktck);
(3)clock_t times(struct tms *buf);返回值是过去一段时间内时钟嘀嗒的次数.
(4)times()函数返回值也是一个相对时间.

三)实时函数clock_gettime
在POSIX1003.1中增添了这个函数,它的原型如下:
int clock_gettime(clockid_t clk_id, struct timespec *tp);

它有以下的特点:
1)它也有一个时间结构体:timespec ,timespec计算时间次数的单位是十亿分之一秒.
strace timespec{
 time_t tv_sec;
 long tv_nsec;
}

2)clockid_t是确定哪个时钟类型.
CLOCK_REALTIME: 标准POSIX实时时钟
CLOCK_MONOTONIC: POSIX时钟,以恒定速率运行;不会复位和调整,它的取值和CLOCK_REALTIME是一样的.
CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID是CPU中的硬件计时器中实现的.

四)时间函数gettimeofday()
1)概述:
gettimeofday()可以获得当前系统的时间,是一个绝对值

原型如下:
int gettimeofday ( struct timeval * tv , struct timezone * tz )

timeval结型体的原型如下:
struct timeval {
               time_t      tv_sec;    
               suseconds_t tv_usec;   
           };

所以它可以精确到微秒

五)四种时间函数的比较
1)精确度比较:
以下是各种精确度的类型转换:
1秒=1000毫秒(ms), 1毫秒=1/1000秒(s);
1秒=1000000 微秒(μs), 1微秒=1/1000000秒(s);
1秒=1000000000 纳秒(ns),1纳秒=1/1000000000秒(s);

2)
clock()函数的精确度是10毫秒(ms)
times()函数的精确度是10毫秒(ms)
gettimofday()函数的精确度是微秒(μs)
clock_gettime()函数的计量单位为十亿分之一,也就是纳秒(ns)

六)内核时钟

默认的linux时钟周期是100HZ,而现在最新的内核时钟周期默认为250HZ.
如何得到内核的时钟周期呢?
grep ^CONFIG_HZ /boot/config-2.6.26-1-xen-amd64

CONFIG_HZ_250=y
CONFIG_HZ=250

结果就是250HZ.

而用sysconf(_SC_CLK_TCK);得到的却是100HZ

为什么得到的是不同的值呢?
因为sysconf(_SC_CLK_TCK)和CONFIG_HZ所代表的意义是不同的.
sysconf(_SC_CLK_TCK)是GNU标准库的clock_t频率.
它的定义位置在:/usr/include/asm/param.h

最后总结一下内核时间:
内核的标准时间是jiffy,一个jiffy就是一个内部时钟周期,而内部时钟周期是由250HZ的频率所产生中的,也就是一个时钟滴答,间隔时间是4毫秒(ms).
也就是说:
1个jiffy=1个内部时钟周期=250HZ=1个时钟滴答=4毫秒

每经过一个时钟滴答就会调用一次时钟中断处理程序,处理程序用jiffy来累计时钟滴答数,每发生一次时钟中断就增1.
而每个中断之后,系统通过调度程序跟据时间片选择是否要进程继续运行,或让进程进入就绪状态.
最后需要说明的是每个操作系统的时钟滴答频率都是不一样的,LINUX可以选择(100,250,1000)HZ,而DOS的频率是55HZ.

七)为应用程序计时
用time程序可以监视任何命令或脚本占用CPU的情况.

1)bash内置命令time
例如:
time sleep 1
real    0m1.016s
user    0m0.000s
sys     0m0.004s

2)/usr/bin/time的一般命令行
例如:
\time sleep 1
0.00user 0.00system 0:01.01elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (1major+176minor)pagefaults 0swaps

注:
在命令前加上斜杠可以绕过内部命令.
/usr/bin/time还可以加上-v看到更具体的输出:
\time -v sleep 1
        Command being timed: "sleep 1"
        User time (seconds): 0.00
        System time (seconds): 0.00
        Percent of CPU this job got: 0%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.00
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 178
        Voluntary context switches: 2
        Involuntary context switches: 0
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
       
这里的输出更多来源于结构体rusage.

linux 取系统相对时间和绝对时间相关推荐

  1. Linux查看系统开机时间(转)

    1.who命令查看 who -b查看最后一次系统启动的时间. who -r查看当前系统运行时间 2.last  reboot last reboot可以看到Linux系统历史启动的时间. 重启一下操作 ...

  2. linux已开机时间,Linux查看系统开机时间

    1: who 命令查看 who -b 查看最后一次系统启动的时间. who -r 查看当前系统运行时间 [root@DB-Server ~]# who -b system boot May 11 09 ...

  3. linux双系统切换时间,linux与windows双系统下时间不一致的解决办法

    装完win7和Linux双系统后,进入Linux后再进入Windows,你会惊奇的发现时间不对了,差了有8个小时. 导致这样的原因是Winows和 Linux 对硬件时间的处理方法不同,Windows ...

  4. mysql取系统当前时间的函数

    NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中. CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DA ...

  5. Linux获取系统当前时间(精确到毫秒)

    为什么80%的码农都做不了架构师?>>>    #include <stdio.h> #include <time.h> #include <sys/t ...

  6. win10 linux双系统切换不了,Ubuntu20和windows10 双系统 切换 时间会变不同步的问题...

    时间不一致的原因: Windows 与 Mac/Linux 看待系统硬件时间的方式是不一样的:Windows把计算机硬件时间当作本地时间(local time),所以在Windows系统中显示的时间跟 ...

  7. linux服务器系统cpu监控-shell脚本

    监控服务器系统cpu占用情况: 1.使用top命令查看linux系统cpu使用情况:  #  top -b -n 1 | grep Cpu   (-b -n 1 表只需要1次的输出结果)      C ...

  8. 如何装双系统xp和linux,如何安装xp和linux双系统

    如何安装xp和linux双系统 更新时间:2019-10-12 05:36 最满意答案 linux系统建议使用ubuntu. 选择时有32位和64位系统选择,可以下载优化大师查看. 2:先使用一个虚拟 ...

  9. xp双系统linux 视频教程,如何安装XP和Linux双系统

    如何安装XP和Linux双系统 更新时间:2019-05-30 14:38 最满意答案 linux系统建议使用ubuntu. 选择时有32位和64位系统选择,可以下载优化大师查看. 2:先使用一个虚拟 ...

最新文章

  1. mdk编译后的HTML,[转载]keil MDK编译完成后,Program Size:
  2. 指定jdk8_动图+源码+总结:深度解析 JDK8 中的数据结构(珍藏版)
  3. redhat 挂载 iso文件 提示 mount :not a directory
  4. Java方法中的参数太多,第3部分:构建器模式
  5. 跳槽和求职 ,10条掏心建议
  6. linux常用命令总结-第一次考试
  7. json转excel_手写JAVA实现个性化业务的Excel转JSON,效率提高99.99%
  8. python实验指导书答案函数代码复用_#Python学习笔记(5)函数和代码重用,复用
  9. PHP中各种Hash算法性能比较
  10. nginx做反向代理导致request.getServerName()获取不到代理地址的问题
  11. python智能化推荐_windows python flask
  12. 机器学习,总是不得其法,问题出在哪里?
  13. (day 49 - 另起数组牺牲空间换取时间 ) 剑指 Offer 66. 构建乘积数组
  14. (转)惊魂24小时!真实还原光大“乌龙指”事件,比小说还离奇
  15. jsp浏览图像bean原理分析与改良-JSP实用教程(第三版)耿祥义 张跃平编著第4章例题4_9-动态获取文件夹中的文件并返回
  16. ffmpeg bt709 to bt601
  17. RK987A键盘蓝牙连接电脑
  18. 车牌识别 php,智能车牌识别系统
  19. ICPC2019徐州区域赛 H.Yuuki and a problem
  20. optimizer(三) Adam 系列

热门文章

  1. 全网首发 | Python实现vlookup函数“一表引用”和“跨表引用”
  2. APISpace 将照片转化成漫画风格API
  3. 线性回归 --梯度下降法与标准方程法
  4. 权限开发手册,数据权限和接口权限配置
  5. 国内P2P网贷平台的运营模式
  6. 替换war包中的文件
  7. Android标准App的四大自动化测试
  8. Java项目:ssm汽车维修管理系统
  9. Tarjan算法及其引申
  10. 北威州启动无线充电电动出租车试点项目