文章目录

  • 时间为什么总是走“不准”?
  • 自动校准网络时间
  • 国际时间标准
  • 计算机如何同步时间?
  • 参考文献

在网上看到这个问题,这是个好问题。在分布式锁的学习过程中看到马丁博士指出计算机时钟不可信的观点的时候,我也曾疑虑过,我认同这个观点,但是我不知道为什么计算机时钟不可信。
今天有个大佬把这个问题解答了,我学习总结一下。


时间为什么总是走“不准”?

小时候,家里的墙上总是挂着一个大时钟。每过一段时间,我就要去手动调整一下,因为它不准了。那时候小,以为是指针向上走的时候比较难,向下走的时候有惯性,所以走着走着就有了偏差。

后来有电脑了,但是由于经常的高三,电脑就一直处于关机状态。当高考完想打开电脑打游戏的时候,发现它的时钟也不准了。当时觉得是因为长时间断电导致的。


后来我明白,钟表和计算机内部都有一个叫做「晶体振荡器」的东西,给它加上电压,它就会以固定的频率振动。但这个振动频率的「稳定性」,取决于它的制造工艺,以及外界环境的影响。虽然它们的误差很小,但日积月累下来,误差就越来越明显。

原来墙上的钟表不准是时间的杰作呀,原来那个电脑时钟不准真的是因为断电呀。。


自动校准网络时间

现在的计算机都有自动校准网络时间的功能了,但是问题来了,这个网络时间?哪儿来的?可靠?可控?

为什么我电脑上的网络时间和你电脑上的网络时间会是一致的呢?

首先我们排除一下我们的电脑通过网络互通有无的可能性哈,网络都是有延迟的。

其实最早接触计算机时间的时候,我是这样想的:国际上有某个管理计算机时钟的组织,我们的每台电脑向该组织校准我们的时间,再通过一定的技术消除这个网络延迟。

看到我这句话学物理的朋友估计要冲出来揍我了:误差只能减少,不可能消除。

虽然我物理不咋地,但是这句话我还是有深刻印象的。


所以,我电脑上的时间,跟你电脑上的时间,肯定是不一样的,只不过这个差距可以通过技术手段使得它小的可怜。

我看的那篇回答中还介绍了时间是怎么来的,以及人类对时间认知的发展。这里我就不多说了,文末附上原文,感兴趣的朋友或者觉得我说的理论不通的朋友可自行查看。


国际时间标准

现在,科学家制定出了两套时间标准:
1、世界时:基于天文现象 + 钟表计时,永远与地球自转时间相匹配。(如果对天文学有感兴趣的朋友会知道,地球的自转是越来越慢的,每年都要少那么几分钟。)
2、国际原子时:基于原子钟计时,每一秒的周期完全等长且固定(以铯原子跃迁 9192631770 个周期,所持续的时间长度定义为 1 秒!)
这个铯原子非常之稳定,计时上亿年误差不会超过一秒。

为了协调二者,出现了闰秒的概念。(这里主要是要说一声儿:虽然一个慢,一个稳,但是会通过人为手段使二者基本一致。我们的计算机使用的自然是原子时间了。)

同时,为了进一步降低原子钟的测量误差,每个国家会在每个月,统一上报自己计算的协调世界时到一个权威机构,然后这个权威机构会根据各国实验室的精度,进行加权计算,算出「最终」的协调世界时。

之后,再把这个最终的时间下发到各个国家,让各个国家进行对表校准,保证全世界的时间误差在 100 纳秒以内。

之后,中国会在自己算出的协调世界时的基础上,再加 8 个小时(中国在东八区),最终得出来的时间,就是「北京时间」!


计算机如何同步时间?

通常来说,无线电波的传播速度更快、传播误差小,所以授时中心会通过这种方式,把时间发送给全国各地的「时间服务器」。

时间服务器有了准确的时间后,再通过其它方式(例如网络)广播到下一层的终端用户使用。

现在知道我们的网络时间是这么来的了,就又回到开头的问题了:消除误差(啊呸,减少误差)。


数据在网络传输过程中,也是需要时间的,这个时间也会影响到时间的准确性。

于是人们想了一种方案,当计算机在做时间校准时,也需要把网络延迟计算进去,最后「修正」这个同步过来的时间,降低误差。

具体怎么做呢?空话谁都会说。

现在,已经有个软件已经把这一切都做好了。我们部署应用程序的服务器上,都会启动一个「自动校准」时间的服务,这个服务就是 NTP(Network Time Protocol),它可以保证每台机器的时间与时间服务器保持同步。

简单来讲,它是通过在网络报文上打「时间戳」的方式,然后配合计算网络延迟,从而修正本机的时间。

网络延时 = (t4 - t1) - (t3 - t2)
时间差 = t2 - t1 - 网络延时 / 2 = ((t2 - t1) + (t3 - t4)) / 2

这个计算过程假设网络来回路径是对称的,并且时延相同。

这样一来,客户端就可以「校准」自己的本机时间了,与服务端保持同步,这个时间误差在广域网下是 10ms - 500ms,在局域网下通常可以小于 1ms。


同步时间时,对正在运行的程序有没有影响?
可大可小,万一出现“时间倒流”的情况,对某些使用时间戳的系统的影响就,嗯。对于无所谓时间的系统那另当别论。

我想这里需要解释一下为什么会出现“时光倒流”的情况:
我们的计算机是每隔一段时间向时间服务器请求时间的,不可能说时时刻刻都在校准哈,校准之后还是要依靠自身电磁振荡来维系的。所以在后面校准的时候可能会出现偏差。

NTP 在校准时间时,提供了 2 种方式:
1、ntpdate:一切以服务端时间为准,「强制修改」本机时间
2、ntpd:采用「润物细无声」的方式修改本机时间,把时间差均摊到每次小的调整上

也就是说,ntpd 当接收到需要「回拨」的时间时,会让本机时间走得「慢」一点,小步调整,逐渐与服务端的时钟「对齐」,这样一来,本机时间依旧是递增的,避免发生「倒流」。

当我们在配置 ntp 服务时,需要格外注意这种情况。另外,在编写程序时,也要注意调用的时间 API 获取的是哪个时间,避免业务逻辑发生异常。


参考文献

计算机时钟是如何运行的?时针硬件、时针软件、NTP与计算机时钟都有什么联系?怎样才能清楚的描述出来?
【转】How to do distributed locking 分布式领域专家 Martin Kleppmann

计算机时钟是如何运行的?相关推荐

  1. 您计算机处于状态或者您计算机时钟设置,您的Windows 10时间不正确? 这是如何固定时钟 | MOS86...

    当Windows 10计算机上的时间总是错误或不断变化时,原因可能是电池电量耗尽到设置错误. 我们向您展示为什么您的计算机时钟关闭,以及如何重新设置它. 立即解锁" Windows键盘快捷键 ...

  2. 系统无法在此计算机硬件上运行,Windows安装程序无法将配置未在此计算机的硬件上运行的解决方案-太平洋电脑网...

    "Windows安装程序无法将Windows配置未在此计算机的硬件上运行",在PE下重装Win7 64位系统的时候出现这个提示是不是让遇到此问题的你十分崩溃? 经过在多台机N次的重 ...

  3. 安装Sql Server:以前的某个安装需要重新引导计算机以便使其更改生效。若要继续,请重启计算机,然后再次运行安装程序。

    安装Sql Server,安装失败两次,错误提示:以前的某个安装需要重新引导计算机以便使其更改生效.若要继续,请重启计算机,然后再次运行安装程序.但是,重启过后再次安装仍然失败. 解决方法: 打开注册 ...

  4. 关于计算机运行管理模式,浅谈学校计算机机房管理及维护运行模式.docx

    浅谈学校计算机机房管理及维护运行模式 摘要:计算机辅助教学在学校的教学体系中占有重要地 位,计算机机房是学校教学和学生实践学习的重要学习场 所.合理的机房管理与维护模式,是提高学校教学质量和培 养学生 ...

  5. 安装win10时出现 “windows安装程序无法将windows配置为此计算机的硬件上运行” 解决方案

    给 Intel nuc 重新安装win 10系统,使用"老毛桃"顺利安装镜像,重新启动后,电脑出现此错误: "windows安装程序无法将windows配置为此计算机的硬 ...

  6. win7无法安装到此计算机,win7系统安装出现“windows安装程序无法将windows配置为在此计算机的硬件上运行”的解决方法...

    很多小伙伴都遇到过win7系统安装出现"windows安装程序无法将windows配置为在此计算机的硬件上运行"的困惑吧,一些朋友看过网上零散的win7系统安装出现"wi ...

  7. 安装win7提示无法配置到计算机,安装win7出现“无法将windows配置为在此计算机的硬件上运行”怎么办...

    最近有用户在安装win7系统的过程中,出现了"windows安装程序无法将windows配置为在此计算机的硬件上运行"的提示,导致安装win7系统失败,要如何处理呢,下面为大家详细 ...

  8. 无法在此配置的计算机上运行,win7系统出现“无法将windows配置为在此计算机的硬件上运行”的解决方法...

    很多小伙伴都遇到过win7系统出现"无法将windows配置为在此计算机的硬件上运行"的困惑吧,一些朋友看过网上零散的win7系统出现"无法将windows配置为在此计算 ...

  9. 【安装win7 64位系统】- 出现《Windows安装程序无法将Windows配置为在此计算机的硬件上运行》错误-解决方法

    安装win7 64位系统出现<Windows安装程序无法将Windows配置为在此计算机的硬件上运行>错误的解决方法 出现的原因 解决办法 分割线:以下为查找的资料 博主用U盘安装台式wi ...

最新文章

  1. 跨时钟域设置set_false_path的问题
  2. Jetson TX2 学习资料整理
  3. python自学攻略-你是如何自学 Python 的?
  4. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )
  5. vs2010 qt中文乱码 最终版
  6. 别人7天乐,运维还苦逼值班?
  7. springboot项目自定义注解实现的多数据源切换--亲测有效
  8. C++STL优先队列详解及练习
  9. 第1138期AI100_机器学习日报(2017-10-30)
  10. java最长公共子串_查找字符串最长公共子串
  11. SpringBoot代理设置
  12. 吉时利DMM6500图形触摸屏数字万用表介绍
  13. Vue.js 第5章 webpack配置
  14. Linux下使用FastDFS
  15. struck(结构化SVM用于视觉跟踪)--源代码详解--main.cpp
  16. 虚拟服务器和vdi,比较瘦客户端和VDI
  17. java面试170道精讲:留着慢慢看
  18. 小冈香,何以给生活高级感
  19. python根据星座测性格_星座能够测试个人的性格吗?
  20. 基于EMC的共模干扰与差模干扰以及抑制方法(转载)

热门文章

  1. C# Websocket连接(wss)
  2. 微型计算机中须安装的软件是,每一台可以正常使用的微型计算机中必须安装的软件是...
  3. python文件编译为pyc后运行
  4. 【shell编程】基础篇
  5. Scala開發教程(1): 開始神奇的Scala編程之旅
  6. 我国各省市县的名称列表
  7. 【马士兵】Python基础--12
  8. 44000+ 人一夜之间失业:一拖二懒三不读书,不淘汰你淘汰谁?
  9. python 英语词汇_使用Python进行英文单词分割
  10. 【每日新闻】2017年亚马逊研发投入排世界第一,超过华为、BAT 总和 | 数人云宣布与UMCloud合并...