This commit is contained in:
Vonng 2018-04-26 11:57:16 +08:00
parent b87e7ae9c5
commit 270494983d
2 changed files with 8 additions and 0 deletions

8
ch8.md
View File

@ -278,6 +278,14 @@
单调钟适用于测量持续时间时间间隔例如超时或服务的响应时间Linux上的`clock_gettime(CLOCK_MONOTONIC)`和Java中的`System.nanoTime()`都是单调时钟。这个名字来源于他们保证总是前进的事实(而时钟可以及时跳回)。
你可以在某个时间点检查单调钟的值,做一些事情,且稍后再次检查它。这两个值之间的差异告诉你两次检查之间经过了多长时间。但单调钟的绝对值是毫无意义的:它可能是计算机启动以来的纳秒数,或类似的任意值。特别是比较来自两台不同计算机的单调钟的值是没有意义的,因为它们并不是一回事。
在具有多个CPU插槽的服务器上每个CPU可能有一个单独的计时器但不一定与其他CPU同步。操作系统会补偿所有的差异并尝试向应用线程表现出单调钟的样子即使这些线程被调度到不同的CPU上。当然明智的做法是不要太把这种单调性保证当回事【40】。
如果NTP协议检测到计算机的本地石英钟比NTP服务器要更快或更慢则可以调整单调钟向前走的频率这称为**偏移skewing**时钟。默认情况下NTP允许时钟速率增加或减慢最高至0.05但NTP不能使单调时钟向前或向后跳转。单调时钟的分辨率通常相当好在大多数系统中它们能在几微秒或更短的时间内测量时间间隔。
在分布式系统中,使用单调钟测量**经过时间elapsed time**(比如超时)通常很好,因为它不假定不同节点的时钟之间存在任何同步,并且对测量的轻微不准确性不敏感。
### 时钟同步与准确性
单调钟不需要同步但是时钟需要根据NTP服务器或其他外部时间源来设置才能有用。不幸的是我们获取时钟的方法并不像你所希望的那样可靠或准确——硬件时钟和NTP可能会变幻莫测。举几个例子

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB