绝对时间与相对时间

多雨的季节

四川的秋冬交替时节,天总是阴沉,雨总是不停歇。成都已经超过48小时在连续下雨,真是令代码发霉的季节。
DPDK在国庆回来就卡住了,没有任何回应,像是叫不醒的正在装睡的客人。
………省略一万字先………
经过终极分析,发现问题的原因竟是因为修改了系统时间,导致条件变量等待提前超时,而引起的互斥锁死锁,最终DPDK整体卡住。
这里有一个有趣的细节,条件变量超时等待接口pthread_cond_timedwait,第三参数abstime是一个绝对时间,正是因为系统时间被修改,导致绝对时间提前到来,不经思考为什么计算机有的超时用绝对时间,有的用相对时间,二者的差异是什么?接口pthread_cond_timedwait如下所示:

int pthread_cond_timedwait(pthread_cond_t *restrict cond,
           pthread_mutex_t *restrict mutex,
           const struct timespec *restrict abstime);

时间

不难发现POSIX标准定义的sem、mutex、cond之类具有超时等待的接口,所使用的时间都是绝对时间,而普遍延时采用的是相对时间。

在聊绝对时间和相对时间前,先谈时间,什么是时间,怎么度量时间,怎么衡量时间的好坏。站在宏观的角度,可以通过准确度来度量时间,承载时间流逝的记录器对真实流逝的时间进行记录,误差的大小衡量时间记录器的准确度。人类要准确表达一个事务,总是先量化,在度量,最小的单位是可度量的精度,站在微观层面,可以通过精度来衡量时间,1秒钟嘀嗒一次的机械表,它的精度是1秒,0.001秒嘀嗒一次是电子表,它的精度是0.001秒。

在说回来,事实上时间的准确度和精度是一体两面,仅仅是度量时间角度不同。

绝对时间

首先理解什么是绝对时间,绝对时间关注的重点是类似时间点A、时间点B,并不关注时间点A怎么到达时间点B。这就好比目的地是北京,从成都出发,是走路去,还是乘火车去,亦或者乘飞机,交通方式不关注,侧重的点是到达北京这个位置。

在计算机系统,同样是类似的原理,绝对时间关注点是时间点的位置,而如何到达时间点并不关注,通过将时间调快,或者直接修改时间,知道到达对应的时间点,那么就会出发相应的事件。

时间在计算机的表达方式,正是关键点精度问题,最常见的时钟源应该是系统ticks、定时器或者HPET,其中系统ticks受系统调度影响,是精度最不准确最低的,一般操作系统一秒是1K个系统ticks,精度对应是0.001秒,一般系统ticks精度是毫秒ms级别;定时器的精度依赖时钟源或晶振,常见的时11M、24M和44M等,定时器的精度一般可以轻易做到微秒us级别;再说HPET,不是所有处理器都有,没有的可以用定时计数器替代,HPET和定时计数器的精度基本能达到处理器主频的1/4到1/2之间,一般和处理器主频差距不超过一个数量级,即使是3块钱的处理器也是微秒us级别,X86处理器基本都是纳秒ns级别,部分高端处理器能达到皮秒ps级别。总结:系统ticks精度 < 定时器 < HPET。

上面好像没有提到外部时钟RTC,CPU和RTC通信就会耗费难以度量的时间,谁会本末倒置用RTC做系统控制的时钟源。

说回绝对时间,重点是时间点,恰巧绝对时间有确定的时间点,绝对时间可以换算为系统ticks,这是最基础的。因为是不关注中间过程的确定的时间点,那么结合中断,可以将绝对时间转换为精度更高的定时器或HPET。

相对时间

相对时间是倒计时,与起始时间无关,就像酿酒,时间多长出什么酒是确定的,不能多不能少。

对比绝对时间,相对时间则是关注中间过程的时间,并没有严格的确定的时间点。那么最小的中间过程单位将决定相对时间的精度。

相对时间时钟源常见的是换算为系统ticks。为什么不换算为定时器或HPET,首先定时器和HPET都需要中断配合,需要确定的时间点,相对时间是难以配合;另外计算时间到设置时间是绝对的空隙,是相对时间无法回避的问题。

总结

绝对时间与相对时间,主要差异在精度,在计算机中绝对时间精度远高于相对时间,基本绝对时间精度下限是相对时间精度的上限。

对于时间,在计算机上就绕不开时钟源的话题,常见的有实时时钟CLOCK_REALTIME和单调时钟CLOCK_MONOTONIC,实时时钟又称为系统时间,会受系统时间修改影响,并不是说单调时钟没有修改时间的负面影响,而是系统时间修改太容易(设置年月日即可修改系统时间)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值