时钟同步(Clock synchronization)是计算机科学与工程学中的一个概念,旨在协调多个独立的时钟。现实中的多个时钟,即使时间已调至一致,但在一段时间后依然会因为时钟漂移(英语:clock drift)而显示不同的时间,因为它们计时的速率会略有差异。时钟计时速率的差异会造成多种问题,但已有多种解决方案,最佳的解决方案须由实际情况决定。
在串行通信中,时钟同步可以指代时钟恢复(英语:clock recovery),即频率同步,与相位同步(英语:phase synchronization)相对。这种时钟同步被用在电信通信中的同步电信通信中的同步(英语:synchronization in telecommunications)与波特率自动检测波特率自动检测(英语:automatic baud rate detection)。
准同步(英语:plesiochronous system)或等时(英语:isochronous)操作指一个系统具有频率同步,但并没有严格要求相位同步。同步操作对时间(可能包括频率)具有更高的同步要求。
如果无法在更小的尺度管理时间,在具有较高时间同步要求的分布式计算中,会产生许多因时间偏移引发的问题。
例如,在 Unix 系统中,make 命令可用于增量编译代码,并避免编译已经编译过且未发生改变的代码。make 命令使用主机的时钟来确定哪些源代码需要编译,如果源代码处于一台单独的文件服务器上,而两者时钟不一致,make 就可能导致错误的结果。
在一个具有中心服务器的系统中,同步方案较为简单:由这个中心服务器指示时间。在这种环境中,Cristian 算法(英语:Cristian's algorithm)或 Berkeley 算法(英语:Berkeley algorithm)可能是最佳的解决方案。
在分布式系统中,问题变得更为复杂,因为并没有全局通用的时间。在互联网上最常用的时钟同步协议是 NTP,采用 UDP 通信,并形成层级的客户端 - 服务端架构。分布式系统的逻辑时钟(英语:logical clock)涉及到的概念包括 Lamport 时间戳(英语:Lamport timestamps)与向量时钟(英语:vector clock)。
在无线网络中,因为其不稳定性,包括同步数据包的碰撞等,这一问题变得更为艰难。
Berkeley 算法(英语:Berkeley algorithm) 适用于无线电时钟(radio clock)不可用的分布式系统,此类系统无法得知真实时间,只能通过维护一个全局的平均时间作为标准时间。一台时间服务器会周期性地获取各个客户端上的时间,将其平均处理后,回传每个客户端的时间与平均时间的偏移,以达到统一使用此平均时间的目的。此算法适用于不仅时间可能不一致,时钟速率也可能不一致的系统。
如果一个客户端的时间偏移过大,超出了容忍值,则通常不会参与平均时间的计算。如此可以防止系统的时间被单个异常的时钟过度影响。