linux 取系统相对时间和绝对时间
取绝对时间: 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 取系统相对时间和绝对时间相关推荐
- Linux查看系统开机时间(转)
1.who命令查看 who -b查看最后一次系统启动的时间. who -r查看当前系统运行时间 2.last reboot last reboot可以看到Linux系统历史启动的时间. 重启一下操作 ...
- linux已开机时间,Linux查看系统开机时间
1: who 命令查看 who -b 查看最后一次系统启动的时间. who -r 查看当前系统运行时间 [root@DB-Server ~]# who -b system boot May 11 09 ...
- linux双系统切换时间,linux与windows双系统下时间不一致的解决办法
装完win7和Linux双系统后,进入Linux后再进入Windows,你会惊奇的发现时间不对了,差了有8个小时. 导致这样的原因是Winows和 Linux 对硬件时间的处理方法不同,Windows ...
- mysql取系统当前时间的函数
NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中. CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DA ...
- Linux获取系统当前时间(精确到毫秒)
为什么80%的码农都做不了架构师?>>> #include <stdio.h> #include <time.h> #include <sys/t ...
- win10 linux双系统切换不了,Ubuntu20和windows10 双系统 切换 时间会变不同步的问题...
时间不一致的原因: Windows 与 Mac/Linux 看待系统硬件时间的方式是不一样的:Windows把计算机硬件时间当作本地时间(local time),所以在Windows系统中显示的时间跟 ...
- linux服务器系统cpu监控-shell脚本
监控服务器系统cpu占用情况: 1.使用top命令查看linux系统cpu使用情况: # top -b -n 1 | grep Cpu (-b -n 1 表只需要1次的输出结果) C ...
- 如何装双系统xp和linux,如何安装xp和linux双系统
如何安装xp和linux双系统 更新时间:2019-10-12 05:36 最满意答案 linux系统建议使用ubuntu. 选择时有32位和64位系统选择,可以下载优化大师查看. 2:先使用一个虚拟 ...
- xp双系统linux 视频教程,如何安装XP和Linux双系统
如何安装XP和Linux双系统 更新时间:2019-05-30 14:38 最满意答案 linux系统建议使用ubuntu. 选择时有32位和64位系统选择,可以下载优化大师查看. 2:先使用一个虚拟 ...
最新文章
- mdk编译后的HTML,[转载]keil MDK编译完成后,Program Size:
- 指定jdk8_动图+源码+总结:深度解析 JDK8 中的数据结构(珍藏版)
- redhat 挂载 iso文件 提示 mount :not a directory
- Java方法中的参数太多,第3部分:构建器模式
- 跳槽和求职 ,10条掏心建议
- linux常用命令总结-第一次考试
- json转excel_手写JAVA实现个性化业务的Excel转JSON,效率提高99.99%
- python实验指导书答案函数代码复用_#Python学习笔记(5)函数和代码重用,复用
- PHP中各种Hash算法性能比较
- nginx做反向代理导致request.getServerName()获取不到代理地址的问题
- python智能化推荐_windows python flask
- 机器学习,总是不得其法,问题出在哪里?
- (day 49 - 另起数组牺牲空间换取时间 ) 剑指 Offer 66. 构建乘积数组
- (转)惊魂24小时!真实还原光大“乌龙指”事件,比小说还离奇
- jsp浏览图像bean原理分析与改良-JSP实用教程(第三版)耿祥义 张跃平编著第4章例题4_9-动态获取文件夹中的文件并返回
- ffmpeg bt709 to bt601
- RK987A键盘蓝牙连接电脑
- 车牌识别 php,智能车牌识别系统
- ICPC2019徐州区域赛 H.Yuuki and a problem
- optimizer(三) Adam 系列