1. Linux中time相关概念

1.1 real time

指的是实际流逝的时间,又称为Wall Clock Time(墙上时间)。

比如,time命令统计出的real time指的是该进程从开始运行到运行结束所消耗的时间。在这段时间内不仅仅执行了该进程,其他进程的时间片也得到了轮转。

1.2 process time

指的是执行某进程所消耗的CPU time。CPU time指的是执行该进程有关代码所花的时间,分为User CPU time和System CPU time两部分。

User CPU time指的是在用户态执行该进程的代码所花费的时间,不统计该进程阻塞花费的时间,也不统计其他进程的时间片。

System CPU time指的是在内核态执行该进程的代码所花费的时间,不统计该进程阻塞花费的时间,也不统计其他进程的时间片。。

其实,我觉得“该进程阻塞花费的时间”和“其他进程的时间片” 是一个意思。因为,进程阻塞时,内核会调度其他进程执行,所以我觉得这两个是一个意思。

需要注意,Real time != User CPU time + System CPU time。两个原因:

对于多核处理器上跑的多线程程序,会出现real time < User CPU time + System CPU time的情况。

毕竟计算机上不止一个进程在跑,real time中还统计了其他进程的时间片。

1.3 hardware clock

指计算机中电池供电的硬件时钟,记录了当前的墙上时间,又被称为RTC(Real Time Clock)。内核在启动时会读取该硬件时钟,来初始化内核中的软件时钟(Software Clock)。

1.4 software clock, HZ, and jiffy

software clock指的是内核维护的软件时钟。需要设置timeout的系统调用(例如,select,sigtimedwait)以及测量cpu time的系统调用(例如,getrusage)的准确度(accuracy)由软件时钟的精度(precision / resolution)决定。

Linux内核维护的软件时钟的精度是jiffy,也就是说软件时钟用jiffy衡量时间。jiffy对应的real time由内核中的常量HZ决定,jiffy = 1 / HZ。HZ的值可人为调节,可取的值在不同的内核版本和不同的硬件平台下也不一样。在i386平台下,内核版本2.6.0后,HZ的取值可以达到1000,意味着jiffy对应0.001秒。

那么为什么设置timeout的系统调用和测量cpu time的系统调用的准确度受jiffy的限制呢?原因如下。

cpu里面有可编程间隔定时器PIT,(Programmable interval timer),目前x86-64/arm/8051-based的绝大多数cpu/mcu都是内置PIT的,PIT以一个可调节的时间间隔,即jiffy,触发时钟中断,使得操作系统的时钟中断处理程序可以可调节地周期性运行。时钟中断处理程序负责维护所有的软件定时器,在当前进程的时间片用光,或有定时器触发时执行进程调度(线程调度)。时钟中断处理程序还负责维护软件时钟。因此,软件时钟的精度以及timer相关系统调用的精度都由jiffy限制。

1.5 High-resolution timers

在内核版本2.6.21之前,timer and sleep system calls 的准确度由jiffy限制。自从内核版本2.6.21之开始,Linux开始支持高精度定时器(High-resolution timers, HRTs)。

在支持HRTs的系统上,timer and sleep system calls 的准确度不再受jiffy限制,可以达到硬件级别的准确度。可以通过clock_getres()返回的时钟的精度判断系统是否支持高精度定时器。

sleep system calls 包括:

1.6 Epoch

Unix系统使用从1970-01-01 00:00:00 +0000 (UTC)到现在的秒数表示时间。1970-01-01 00:00:00 +0000 (UTC)这个时间点称为Epoch。

2. 获取时间

2.1 结构体

目前所知,表示时间只有两种结构体timeval和timespec,它们的区别主要是精度不同,有些函数的参数使用timeval,有些使用timespec。

struct timeval {

time_t tv_sec; /* seconds */

suseconds_t tv_usec; /* microseconds */

};

struct timespec {

time_t tv_sec; /* seconds */

long tv_nsec; /* nanoseconds */

};

2.2 函数

Linux中获取时间的函数有多种,这里我只提gettimeofday()和clock_gettime()。

2.2.1 gettimeofday()

int gettimeofday(struct timeval *tv, struct timezone *tz);

gettimeofday()是系统调用,用于获取从Epoch开始到现在的时间,精度是微秒。

各种资料表明,gettimeofday()读取的是内核中的xtime变量的值,xtime每个时钟中断更新一次,其精度受限于jiffy。既然是这样,那么为什么gettimeofday()的精度是微秒呢?经过我查阅资料,jiffy虽然会影响软件时钟的精度,但是gettimeofday()不是简单地读取xtime,gettimeofday()的实现仍然会依赖于硬件时钟。更具体的解释请查看[7]。

我个人认为,gettimeofday()的精度和内核是否支持高精度定时器并没有关系。一个是读取时间,一个是定时器,两者是不同的概念。查阅资料,没发现有人明确讲这个,以后遇到了再做补充吧。

2.2.2 clock_gettime()

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

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

int clock_settime(clockid_t clk_id, const struct timespec *tp);

通过上面的接口可以访问多个时钟,这些时钟表示不同的含义。上面的接口中,用户需要通过clk_id指定对哪个时钟进行操作。其中clock_gettime()可以获取指定时钟的时间,clock_getres()可以获取指定时钟的精度。这些时钟的更新原理并不清楚,但是可以肯定的是,其精度和内核是否支持高精度定时器密切相关。因为,多个资料提到可以使用clock_getres()得到的精度判断内核是否支持高精度定时器。

clk_id的值:

CLOCK_REALTIME 墙上时间,真实的时间,但是受系统时钟(system clock)改变的影响,例如用户调用adjtime函数改变了系统时钟,那么该墙上时间就会随之改变。

CLOCK_MONOTONIC 该时钟用于测量相对的real time,该时钟和实际的时间相同的速度流逝,并且不被系统时钟(system clock)的手动/自动改变所影响。

CLOCK_PROCESS_CPUTIME_ID 用于测量进程所用的CPU time。

CLOCK_THREAD_CPUTIME_ID 用于测量线程所用的CPU time。

int timer_create (clockid_t clockid, struct sigevent *evp, timer_t *timerid);

该系统调用用于创建定时器,参数clk_id用于指定该定时器使用的时钟。该系统调用创建的定时器是高精度定时器。因此,我们使用clock_getres()得到的精度肯定应该小于jiffy。这就印证了之前说的,可以通过clock_getres()查看时钟的精度来判断内核是否支持高精度定时器。我自己使用clock_getres()测试的各时钟的精度是1ns,表示内核支持高精度定时器。

3. 某些系统调用的time accuracy

sleep的参数是秒,accuracy可以达到1秒。Linux下其由nanosleep实现,

usleep的参数是微秒,但是有人说其accuracy不是微秒,说它仍是由时间中断实现的,本人还没有找到资料证明usleep究竟有没有使用HRTs。

nanosleep的参数是纳秒,其由HRTs实现,使用CLOCK_MONOTONIC测量时间,不受jiffy限制,accuracy具体可以达到多少不清楚,但是应该可以达到微秒级别。

select的参数是微秒,别人测试accuracy可以达到微秒,有人说其由HRTs实现,但是本人未找到更具体的资料。

因此,选择延时函数应该一步到位直接用nanosleep。

4. Reference

linux 多核 系统时钟,Linux中的时间相关推荐

  1. linux 多核 系统时钟,Linux时间子系统之(十五):clocksource

    Linux时间子系统之(十五):clocksource 作者:linuxer 发布于:2014-12-1 19:03 分类:时间子系统 一.前言 和洋葱一样,软件也是有层次的,内核往往需要对形形色色的 ...

  2. linux 设置系统时钟,linux clock命令查看和设置硬件时钟

    clock调整 RTC 时间 使用clock命令可以查看和设置硬件时钟,可以显示现在时钟,调整硬件时钟,将系统时间设置成与硬件时钟一致,或是把系统时间回存到硬件时钟.clock命令是hwclock命令 ...

  3. Linux内核系统时钟管理 感想总结 (未完待续)

    目前讨论根据的是2.6.x 版本的内核 Linux 内核系统时钟需要了解的泛化的概念 绝对时间: 所谓的绝对时间指的是系统流逝的时间,从你启动系统的那一时刻开始计算,直到你关闭系统的那一刻作为结束,这 ...

  4. linux同步硬件和系统时钟,liunx系统下时钟不同步会出现问题 怎么同步Linux 的系统时钟和硬件时钟?...

    linux的系统时钟在很多地方都要用到,要是不准,就会出现一些奇怪的问题: 在linux中,用于时钟查看和设置的命令主要有date.hwclock和clock.linux时钟分为系统时钟(system ...

  5. linux 项目同步,Linux项目系统,Linux控制台窗口,同步和附加到进程的Linux C ++工作负载改进...

    Linux项目系统,Linux控制台窗口,同步和附加到进程的Linux C ++工作负载改进 03/23/2018 4 minutes to read In this article [原文发表时间] ...

  6. Linux蓝牙系统(3) Linux 命令

    Linux蓝牙系统(3) Linux 命令 2010-09-27 10:45:44 分类: LINUX Andrew Haung bluedrum@163.com 一.Linux对于蓝牙的支持 --- ...

  7. linux的系统时钟,【总结】linux系统时间和硬件时钟问题

    ####一.弄清几个概念: 1. "系统时间"与"硬件时间" **系统时间:** 一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用 ...

  8. Linux服务器系统时钟和硬件时钟

    1.介绍 linux系统时钟有两个: 硬件时钟:即BIOS时间,就是CMOS设置时看到的时间 系统时钟:linux系统Kernel时间 当Linux启动时,系统Kernel会去读取硬件时钟的设置,然后 ...

  9. Linux | CentOS系统时钟校正

    一.查看当前的系统时钟 date 二.删除 localtime 文件 rm -f /etc/localtime 三.复制一个新的 localtime 文件 cp /usr/share/zoneinfo ...

最新文章

  1. cmd启动tomcat
  2. centos6源码安装mysql5.6.29
  3. PHPMailer配置QQ邮箱163邮箱和谷歌邮箱发送邮件
  4. Web App和Native App 谁将是未来
  5. 关于回调函数的那点事
  6. MySQL查询in操作 查询结果按in集合顺序显示(转)
  7. C#中如何创建文件夹
  8. ylbtech-dbs-m-YinTai(银泰网)
  9. java字符串反转及替换_Java圆括号翻转字符串
  10. 开发常用技巧之css字体编码
  11. Linux中的线程与进程以及调度
  12. 我的天!你竟然不会用IDEA远程调试Tomcat...
  13. 调试ffmpeg源码配置config参数(包管用)
  14. JDBC作用接口和创建的步骤详细解析
  15. ZoomIt 的安装及使用方法
  16. 各自然带代表植被_自然带气候植被关系
  17. 笔记本电脑外接显示器接口类型
  18. 全同态加密(FHE):BV方案、密钥切换、模约化、自举
  19. python-模块使用方法
  20. 如何规避海外置业风险,2019必备海外房产投资技巧

热门文章

  1. 网络演算(Networkcalculus)
  2. codemirror java代码_codemirror使用(示例代码)
  3. db platform mysql_数据库移植: 从Oracle移植到MySQL 注意databasePlatform | 学步园
  4. php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解
  5. printf 地址_C程序显示主机名和IP地址
  6. ubuntu设置mysql可以非本地访问_ubuntu server下设置mysql的远程访问权限
  7. 技术管理角色认知-管理都需要做哪些事
  8. 单页vue路由router
  9. 7.5 GRASP原则五:高内聚 High Cohesion
  10. CPU时间分片、多线程、并发和并行