首先是两个常用概念:Cycle和Tick。Cycle是由CPU主频决定的,而CPU主频是由CPU的物理特性决定的,因此它可以说是平台无关的。现在的主流CPU主频都是以G为单位了,所以1个cycle的单位一般在纳秒级别。Tick泛指一段时长(一般为两次timer interrupt间的时长,毫秒级),由操作系统指定(Linux中由Kernel决定,Windows 中由硬件抽象层HAL决定)。
Windows中,还有一个概念叫qunatum,它是线程调度的时间单位。它可分为若干个(如Vista中为2,Windows Server中为12个)Clock intervals(ticks)。Clock interval即两次timer interrupt间的时间间隔。一个clock interval一般为若干个毫秒(如x86单核体系中为10,x86和x64多核体系中为15),该值以100纳秒为单位存并放在KeMaximumIncrement这个内核变量中。quantums以1/3个tick为单位存放,因此1个tick就等于3个quantum单位。这样,Vista中一个quantum就有6个单位。注意.Net中DateTime::Ticks中的tick表示100纳秒,用于记录日期,和前面提到的tick不是一个概念。
Vista之前的系统以clock interval timer来作为quantum的计时。Vista(含Vista)之后,都是转化为clock cycle为计数。这之间的换算关系系统在启动时就算好并放在内核变量KiCyclesPerClockQuantum中。
Linux中有两种计时机制-Low resolution和High-resolution计时。由timer interrupt来记录的为low-resolution计时方式。timer interrupt的时长由开机时确定的体系相关值HZ(范围在12 – 1535 ticks/second之间,默认值50 – 1200 ticks/second,在如VirtualBox此类虚拟机里跑就更低些)确定。HZ就是一秒内的tick数。Linux特有概念jiffies就是最近一次开机后的ticks数,jiffies在每次timer interrupt时更新。High-resolution计时方式则是直接用clock cycles计数。具体方法是用x86体系中的rdtsc读取模型相关寄存器(MSR)。既然是模型相关了,那就意味着这种方式以移植性换取了精确性。
可见,Linux中的Low resolution和High-resolution计时机制的思想分别类似于Windows Vista之前和之后的计时方式。前者用clock tick计时,后者用clock cycle计时。