linux 多核 系统时钟,Linux中的时间

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经纬度 在线计算距离

http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html 转载于:https://www.cnblogs.com/sgdkg/p/3558112.html

如何使用Hibernate批处理INSERT和UPDATE语句

介绍 JDBC长期以来一直为DML语句批处理提供支持。 默认情况下&#xff0c;所有语句都一个接一个地发送&#xff0c;每个语句都在单独的网络往返中发送。 批处理使我们能够一次性发送多个语句&#xff0c;从而节省了不必要的套接字流刷新。 Hibernate将数据库语句隐藏在事务后写…

【ASP.NET Web API教程】5.4 ASP.NET Web API批处理器

【ASP.NET Web API教程】5.4 ASP.NET Web API批处理器 原文:【ASP.NET Web API教程】5.4 ASP.NET Web API批处理器注&#xff1a;本文是【ASP.NET Web API系列教程】的一部分&#xff0c;如果您是第一次看本系列教程&#xff0c;请先看前面的内容。 Batching Handler for ASP.N…

linux 查看系统组账号密码是什么,Linux 用户与组管理详解(system-config-users 命令行)...

用户与组管理用户相关文件组账号相关文件用户和组管理软件&#xff1a;基于命令行的用户和组管理创建用户查看用户信息删除用户修改用户信息为用户创建密码更改用户密码信息创建组删除组查看当前登录到系统的用户用户与组管理什么是用户&#xff0c;用户是人吗&#xff1f;用户…

C++中指针和引用的选择

何时使用引用和指针1. 尽可能使用引用传递参数2. 尽可能的使用const来保护引用和指针3. 在可以使用引用的时候不要使用指针4. 不要试图给引用重新赋值&#xff0c;使之指向另一个变量&#xff0c;这是不可能的&#xff08;因为引用是变量的别名&#xff0c;和变量是统一的&…

linux 7 没有权限访问,[CentOS 7系列]文件或目录的权限与属性

在开始今天的话题之前&#xff0c;我们首先来回顾下ls命令。在ls命令中参数“-l”会显示出来目标的详细信息&#xff0c;如下所示&#xff1a;[rootserver02~]#ls-l/tmp/总用量4-rwx------.1rootroot8365月2706:19ks-script-ogzDFAdrwxr-xr-x.5rootroot755月3005:26testdrwxr-x…

POJ 2386 Lake Counting DFS水水

http://poj.org/problem?id2386 题目大意&#xff1a; 有一个大小为N*M的园子&#xff0c;雨后积起了水。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼&#xff1f; 思路&#xff1a; 水题~直接DFS&#xff0c;DFS过程把途中表示水洼的W改为‘.&#xff0c;看…

linux没有root密码xshell,LINUX终端免密登陆(以Xshell为例)

1&#xff0c;工具-新建用户密钥生成向导linux2&#xff0c;密钥类型选择&#xff1a;RSA&#xff0c;而后下一步shell3&#xff0c;输入密钥名称和密码ssh4&#xff0c;公钥格式为SSH-OpenSSH,保存为文件(后缀为pub)(记录此文件目录)工具二&#xff0c;登陆在须要免密登陆的主…

ActionBar之style出现Cannot resolve symbol 'Theme' 错误

今天 2014/03/08 00:49 刚刚升级 android studio 到了 0.5.0 版本&#xff0c;修复了许多 bug&#xff0c;包含当前这个问题&#xff0c;之前一直困扰我很久&#xff0c;莫名奇妙的提示主题样式找不到&#xff0c;无法解析&#xff0c; 后来一直谷歌发现很多人都认为是 IDE 的b…

单片机上运行linux程序代码,在Linux下烧录51单片机

原标题&#xff1a;在Linux下烧录51单片机*本文作者&#xff1a;LEdge1&#xff0c;本文属 FreeBuf原创奖励计划&#xff0c;未经许可禁止转载。背景我一直在学习Linux 系统&#xff0c;但是最近还要学习51单片机&#xff0c;所以在Linux下给51单片机烧录程序那是非常必要的。之…

linux运行core控制台程序,VisualStudioCode创建的asp.net core控制台程序部署到linux

1、asp.net core控制台程序static void Main(string[] args){int times10;while(times>0){Console.WriteLine("Hello World!");times--;Thread.Sleep(1000);}}2、发布发布前&#xff0c;修改test2.csproj文件(项目名称为test2)Exenetcoreapp2.1centos.7-x64主要添…

StringTokenizer(字符串分隔解析类型)

java.util.StringTokenizer 功效:将字符串以定界符为界&#xff0c;分析为一个个的token&#xff08;可理解为单词&#xff09;&#xff0c;定界符可以自己指定。 &#xff11;、构造函数。1. StringTokenizer(String str) &#xff1a;构造一个用来解析str的StringTokenizer对…

linux 秒数转时间格式,通过delphi将秒数转换成日期格式

摘要将秒数转换成日期格式&#xff0c;是经常用到的一个算法&#xff0c;下面有几个方法&#xff0c;可以借鉴具体代码1&#xff1a;转换成HH:MM:SS格式的字符串格式&#xff1a;function SecondToTime(a:integer):string;beginresult:timetostr(a/86400);end;或者function Sec…

Watch online

1.youku 在优酷看视视频时可登录m.youku.com/wap,在IE上都不需wap,但在chrome上不加会自动跳转成www.youku.com。那上面的视频是一个整体&#xff0c;可以用迅雷下也可在浏览器上直接看。 随便搜了下&#xff0c;发现可直接利用www.youku.com上的视频ID找到上述可直接播放下载的…

java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)

WINDOWS:1.新建一个text文件&#xff0c;将 java -jar D:\eclipse-workspace\attendance\target\mybatis-generator.jar写入&#xff0c;修改文件为.bat文件。2.编写run.vbs文件&#xff0c;新建一个run.text文件&#xff0c;将下面代码写入,然后将文件后缀改为.vbsSet ws Cre…

PHP中,json汉字编码

当用json与js或者其它客户端交互时&#xff0c;如果有中文&#xff0c;则会变成unicode。虽然能使用&#xff0c;但是影响观看。不好调试呀。从网上找到了几个方法 一&#xff0c;用下面这个函数&#xff0c;需要编码时&#xff0c;直接调用这个函数就成 function jsonEnco…

[收藏] Opera鼠标手势命令

Opera的Presto内核版本已经不复存在了&#xff01;&#xff01;惋惜&#xff01;痛惜&#xff01; 现在我的电脑硬盘里还保存着两个版本&#xff0c;一个是第三方优化版的v11.00 1156&#xff0c;另一个是Presto的最终官方版&#xff1a;v12.16&#xff0c;现在看起来都有一种莫…

收到有关RabbitMQ集群分区的通知

如果您在集群中运行RabbitMQ&#xff0c;则集群不太可能会被分区 &#xff08;集群的一部分失去与其余部分的连接&#xff09;。 上面的链接页面介绍了显示状态和配置行为的基本命令。 当发生分区时&#xff0c;您首先希望得到通知&#xff0c;然后进行解决。 RabbitMQ实际上使…

wps linux版本支持vba,Wps vba安装包

wps vba是款专用于wps办公软件的宏插件&#xff0c;可以利用VBA制作Excel登录系统&#xff0c;实现一些VB无法实现的功能&#xff0c;操作界面人性化&#xff0c;方便用户的操作&#xff0c;还可以利用VBA来Excel内轻松开发出功能强大的自动化程序。软件简介&#xff1a;wps vb…

九度 1474:矩阵幂(二分法)

题目描述&#xff1a; 给定一个n*n的矩阵&#xff0c;求该矩阵的k次幂&#xff0c;即P^k 思路 1. 和求解整数幂的思路相同, 使用分治策略, 代码的框架是 int pow(a, b) { c pow(a, b/2) c* c; if(b 为奇数) c * a; return c } 2. 这道题求的是矩阵, 上面的框架不太好用, 毕竟返…