11.11
1. 硬件时标计数器的发展
起初的 IBM PC 是不包含任何硬件时标计数器的。它确实有一个记录一天之中的时间的
时钟,软件也可以读取这个时间。最早的微软的 C 运行时库复制了 ANSI C 库,提供了
time_t time(time_t*) 函数。该函数会返回一个距离 UTC 时间 1970 年 1 月 1 日 0:00 的秒
数。旧版本的 time() 函数返回的是一个 32 位有符号整数,但是在经历了 Y2K3 之后,它被
修改成了一个 64 位的有符号整数。
起初的 IBM PC 会使用来自交流电源的周期性的中断来唤醒内核去进行任务切换或是进行
其他内核操作。在北美,这个周期是 16.67 毫秒,因为交流电源是 60Hz 的。如果交流电
源是 50Hz 的话,这个周期就是 20 毫秒。
自 Windows 98(可能更早)以来,微软的 C 运行时提供了 ANSI C 函数 clock_t clock()。
该函数会返回一个有符号形式的时标计数器。常量 CLOCKS_PER_SEC 指定了每秒钟的时标的
次数。返回值为 -1 表示 clock() 不可用。clock() 会基于交流电源的周期性中断记录时标。
clock() 在 Windows 上的实现方式与 ANSI 所规定的不同,在 Windows 上它所测量的是经
过时间而非 CPU 时间 4。最近,clock() 被根据 GetSystemTimeAsfileTime() 重新实现了。在
2015 年时它的时标是 1 毫秒,分辨率也是 1 毫秒。这使得它成了 Windows 上一个优秀的
毫秒级别的时钟.
自