clock_gettime参数中不同clock ID含义的差别

在分布式系统各个通信的过程中,有的应用场景需要把事件发生的时间戳放在消息中一起传递,接收端根据时间戳来判断事件发生的先后顺序。为此,就需要能够获取精确时间的函数,比如下面的代码:

clock_gettime(CLOCK_MONOTONIC, &ts);

msg.hb_send_ts = ts;

ret_val = msg_send(dest_id, MSG_OP_HBEAT, (char *)&msg, sizeof(msg));

此外,在性能统计的过程中,我们也需要设置固定的时间间隔,以便获取期间的运算次数或者IO数量。比如下面的代码:

pthread_mutex_lock(&(info->stat_lock));

if (info->stat_run != 0) {

info->stat_run = 0;

clock_gettime(CLOCK_MONOTONIC, &tv);

tv.tv_sec += 1;

pthread_cond_timedwait(&(info->stat_thd_exist), &(info->stat_lock), &tv);

pthread_mutex_unlock(&(info->stat_lock));

}

上面的两个应用场景中都用到了clock_gettime()函数,问题是这种调用方法正确么?

这就要求对clock_gettime()的不同clk_id有深入的了解,根据个人的理解,下表列出了不同类型的区别:

这里需要补充的是:上面提到的NTP (NetWork Time Protocal)里后台会调用adjtime(),因此不收NTP影响也就不会受adjtime()函数影响。

在我们实际运行的Linux操作系统中,比如CentOS 7中, NTP服务chronyd默认会开启,用户可以参考下面的命令去检查:

[[email protected] ~]# systemctl status  chronyd

● chronyd.service - NTP client/server

Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)

Active: active (running) since Wed 2017-09-27 16:52:07 CST; 3h 9min ago

Main PID: 1287 (chronyd)

CGroup: /system.slice/chronyd.service

└─1287 /usr/sbin/chronyd -u chrony

Sep 27 16:52:07 localhost.localdomain systemd[1]: Starting NTP client/server...

Sep 27 16:52:07 localhost.localdomain chronyd[1287]: chronyd version 1.29.1 starting

Sep 27 16:52:07 localhost.localdomain chronyd[1287]: Linux kernel major=3 minor=10 patch=0

Sep 27 16:52:07 localhost.localdomain chronyd[1287]: hz=100 shift_hz=7 freq_scale=1.00000000 nominal_tick=10000 slew_delta_tick=833 max_tick_bias=1000 shift_pll=2

Sep 27 16:52:07 localhost.localdomain chronyd[1287]: Frequency -1.497 +/- 1.312 ppm read from /var/lib/chrony/drift

Sep 27 16:52:07 localhost.localdomain systemd[1]: Started NTP client/server.

Sep 27 16:52:17 localhost.localdomain chronyd[1287]: Selected source 120.25.115.20

在此情况下,如果clk_id使用CLOCK_MONOTONIC,显然会受NTP的影响,这会导致时间的时间间隔不准。为此,根据上面的对比表,上面的列举的两个应用场景,应该使用CLOCK_MONOTONIC_RAW 。读者,如果对具体的差异感兴趣,可以在LInux下输入man clock_gettime()查看具体的描述信息。

据此举一反三,不但在读取时间或时间间隔的时候,我们需要考虑到不同始终类型是否受系统时间设置函数以及NTP的影响。在调用设置时间的函数的时候,也需要考虑到对系统各种时钟会带来何种改变,这样才能保证在多个软件模块组成的系统中,不会因为时间读取、时钟设置、NTP服务等带来误差甚至错误。

时间: 2024-10-09 15:54:27

clock_gettime参数中不同clock ID含义的差别的相关文章

PB中自定义事件ID含义

PB中自定义事件ID含义 单选或多选按钮消息(前缀:pbm_bm) pbm_bmgetcheck 单选按钮或多选按钮是否被选. pbm_bmgetstate 按钮是否加亮. pbm_bmsetcheck 将无线按钮或确认框的选中状态改为未选中状态,反之亦然. pbm_bmsetstate 加亮或不加亮按钮. pbm_bmchange 改变按钮的风格,例如,改为单选按钮或组合框. 单选或多选按钮通知消息(前缀:pbm_bn) pbm_bnclicked 按钮控件被点中. pbm_bndisable

LTE中的各种ID含义

ECI (28 Bits) = eNB ID(20 Bits) + Cell ID(8 Bits) 换成16进制就是ECI共7位,eNB ID5位,Cell ID 2位: 例如:Scell ID 80682509 转换成正常 EnodeB ID和CI 80682509换算为16进制就是4CF1E0D: 也就是eNB ID:4CF1E: Cell ID:0D ▊IMSI国 际移动用户识别码(IMSI:International Mobile Subscriber Identification Nu

oracle函数参数中=>的含义

作者:iamlaosong 今天看到一个MD5加密的问题,很多语言都提供了加密函数,oracle也提供MD5加密函数,网上搜了一下,加密函数是: DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>'abc') 不过,其参数中出现了一个"=>"符号,那么这个符号到底什么意思呢? oracle实参与形参有二种对应方式: 1.一种是位置方式,和面向对象语言参数传递类似: 2.另外一种是=> 作为形参对应,因为位置对应方法有缺限,比如一个

Linux中shell变量的含义

$# 是传给脚本的参数个数  $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 [email protected] 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误 Linux中shell变量的含义

android权限--android开发中的权限及含义(上)

android权限--android开发中的权限及含义(上) android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.FLASHLIGHT 访问闪光灯,android开发网提示HTC Dream不包含闪光灯 android.pe

C语言中关键字volatile的含义【转】

本文转载自:http://m.jb51.net/article/37489.htm 本篇文章是对C语言中关键字volatile的含义进行了详细的分析介绍,需要的朋友参考下 volatile 的意思是“易失的,易改变的”.这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化.通常在程序中申明了一个变量时,编译器会尽量把它存放在通用寄存器中,例如ebx.当CPU把其值放到ebx中后就不会再关心对应内存中的值.若此时其他程序(例如内核程序或一个中断)修改了内存中它的值,ebx中的值并

php判断URL参数中是否存在某些项

<?php $old_url = $_SERVER["REQUEST_URI"]; //检查链接中是否存在 ? $check = strpos($old_url, '?'); //如果存在 ? if($check !== false) { //如果 ? 后面没有参数,如 http://www.yitu.org/index.php? if(substr($old_url, $check+1) == '') { //可以直接加上附加参数 $new_url = $old_url; }

[转]html js中name和id的区别和使用分析

js中web页面元素的调用可以有两种识别方法:id和name 自己在用的过程中总结一下id和name的使用区别. 一,使用范围 除 BASE, HEAD, HTML, META, SCRIPT, STYLE, TITLE 标签外,id 都可用. name只用于APPLET,SELECT,FORM,FRAME,IFRAME,IMG,A,INPUT,OBJECT,MAP,PARAM,META. (name有时有自己的用途) name 用于 form 内元素,提交需要 id 用于 form 外元素好用

在ASP.NET 的服务器端控件中有三种关于 ID 的属性

在ASP.NET 的服务器端控件中有三种关于 ID 的属性,即 ID, ClientID 和 UniqueID. ID 表示控件的服务器端编程的标识符,我们写"服务器端的代码",就要用到这个 ID, 通过这个 ID 可以在服务器端对服务器端控件的属性.方法和时间进行编程访问.(可写) ClientID 表示由服务器端生成的客户端控件的ID,"经常用于在客户端脚本中访问服务器控件所呈现的 HTML 元素".一般情况下与服务器端的 ID 相同,有时,不能为控件生成唯一的