Linux 使用clock_gettime在CPU上移动线程(clock_单调)
我听人抱怨,当操作系统决定将调用线程移动到新的物理CPU时,WinAPI函数QueryPerformanceFrequency()和QueryPerForamnCounter()的行为可能会不稳定 有人知道clock_gettime(clock_单调)是否也有类似的问题吗?还是更能保证稳定 另外,对WinAPI上的QPF/QPC的担忧是否已经成为过去?或者,即使到了今天,他们仍然担心吗?作品: 我听人抱怨,当操作系统决定将调用线程移动到新的物理CPU时,WinAPI函数QueryPerformanceFrequency()和QueryPerForamnCounter()的行为可能会不稳定 我不确定你所说的“不稳定”或“不稳定”是什么意思。如果你是指内核之间的漂移或差异,这些问题可能是基于12-15年前出厂的计算机(XP和基于Win2000的操作系统)。来自Microsoft: QPC可在Windows XP和Windows 2000上使用,在大多数系统上运行良好。然而,一些硬件系统的BIOS没有正确指示硬件CPU特性(非不变TSC),一些多核或多处理器系统使用的处理器带有无法跨核同步的TSC。如果使用TSC作为QPC的基础,运行这些版本Windows的固件有缺陷的系统可能无法在不同的内核上提供相同的QPC读数。 对于大多数当前的硬件来说,这几乎已经不是一个问题了(参见下面的链接) 作品: 有人知道clock_gettime(clock_单调)是否也有类似的问题吗?还是更能保证稳定 嗯,任何高频时钟都必须来自某个地方。在Windows框中(因为您询问了QPC),该值将从何而来?在对QueryPerformanceCounter的任何调用中添加一个附加层基本上保证了更低的精度,因为在“now”和“now as”之间的混合中会有更多的CPU指令由操作系统向您报告”(而且,尽管极不可能,但先发制人的可能性会小幅增加,导致精度进一步降低) 这同样适用于任何基于Intel的Linux/BSD/任何设备,因为它们必须以相同的硬件特性运行。在Intel体系结构世界中,您能够获得的最高频率将是基于RDTSC的值,并且操作系统将尽最大努力在内核或进程之间保持任何TSC值尽可能接近SSOR(至少在没有专用硬件的情况下) 这就是为什么任何基准测试都应该是基于大量数据点的平均性能预期 微软实际上有一份非常好的文档,概述了高频定时器的实现特性,包括HPET和ACPI电源管理时间,并简要介绍了多时钟和虚拟化: 作品: 另外,对WinAPI上的QPF/QPC的担忧是否只是过去的事?还是直到今天他们仍然担心 对世界上大多数国家来说,是的。我使用的是基于服务器的代码,其中微秒计数(高频市场数据),但大多数认为几百微秒就能完成或破坏程序的人都是在开玩笑。你知道服务一个网页需要多长时间吗?CPU本身对所有这些等待感到厌倦,即使有成千上万的用户Linux 使用clock_gettime在CPU上移动线程(clock_单调),linux,windows,multithreading,winapi,posix,Linux,Windows,Multithreading,Winapi,Posix,我听人抱怨,当操作系统决定将调用线程移动到新的物理CPU时,WinAPI函数QueryPerformanceFrequency()和QueryPerForamnCounter()的行为可能会不稳定 有人知道clock_gettime(clock_单调)是否也有类似的问题吗?还是更能保证稳定 另外,对WinAPI上的QPF/QPC的担忧是否已经成为过去?或者,即使到了今天,他们仍然担心吗?作品: 我听人抱怨,当操作系统决定将调用线程移动到新的物理CPU时,WinAPI函数QueryPerforma