linux下应读取/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq获取实时核心频率(khz),该路径依赖cpufreq子系统启用及bios节能功能开启;windows需用wmi查询win32_processor.currentclockspeed(mhz),而非queryperformancecounter。

Linux下读取/sys/devices/system/cpu/cpu*/topology/core_freq不可靠
这个路径在多数发行版里根本不存在,core_freq不是标准内核接口。真实可用的是/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq,它返回当前CPU核心的实时频率(单位是kHz)。但要注意:该目录仅在启用了cpufreq子系统的内核中存在,且需对应CPU支持动态调频(如Intel SpeedStep、AMD Cool’n’Quiet)。
- 若
/sys/devices/system/cpu/cpu0/cpufreq/目录不存在,说明内核未加载cpufreq驱动,或BIOS禁用了节能功能 -
scaling_cur_freq值可能被缓存,建议每次读取前先检查scaling_driver是否为intel_pstate或acpi-cpufreq,前者在某些模式下会忽略该文件 - 读取时需以普通用户权限访问,部分发行版默认限制,可加
sudo cat临时验证,但生产环境应改用udev规则或sysfs挂载选项放开权限
Windows用QueryPerformanceCounter无法获取主频,得用WMI或Win32_Processor
很多人误以为高精度计时器能反推CPU频率,其实不行——QueryPerformanceCounter只提供单调递增计数值,其基准由QueryPerformanceFrequency给出,但这个频率是硬件定时器频率(如TSC或HPET),不等于CPU核心当前运行频率。
- 正确做法是调用WMI查询
Win32_Processor类的CurrentClockSpeed属性,它返回的是当前实际运行频率(MHz),注意不是MaxClockSpeed - 必须链接
wbemuuid.lib,初始化COM和WMI服务,否则CoInitializeEx和CoCreateInstance会失败 - 多核情况下,WMI默认返回第一个逻辑处理器的值;要获取每个核心频率,需遍历
CIM_Processor实例并关联ProcessorId,但Windows本身不保证每个核心单独上报实时频率,实际常返回相同值
C++跨平台封装的关键难点在“实时性”和“权限边界”
没有POSIX或C++标准API能直接拿到每个核心的瞬时频率。所有方案本质都是读取OS暴露的统计/控制接口,因此实时性取决于底层实现:
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
- Linux上
scaling_cur_freq是内核通过MSR寄存器(如IA32_APERF/IA32_MPERF)采样后更新的,典型刷新间隔为10–100ms,不能当作微秒级信号源 - Windows WMI的
CurrentClockSpeed通常每秒更新1–2次,且受电源策略影响;设为“高性能”模式才更接近真实负载频率 - 不要尝试用
RDTSC指令自己算——现代CPU的TSC已非恒定速率,且受Turbo Boost、P-state切换干扰,结果偏差可达±30%
简单可行的C++读取示例(Linux)
以下代码只依赖<fstream></fstream>和<string></string>,不引入第三方库:
#include <fstream>
#include <string>
#include <iostream>
int get_cpu_freq_khz(int cpu_id) {
std::string path = "/sys/devices/system/cpu/cpu" + std::to_string(cpu_id) +
"/cpufreq/scaling_cur_freq";
std::ifstream f(path);
if (!f.is_open()) return -1;
int freq;
f >> freq;
return freq; // 单位 kHz
}
</iostream></string></fstream>
调用get_cpu_freq_khz(0)即可获取CPU 0当前频率。若返回-1,说明该接口不可用——此时要么换用/proc/cpuinfo里的cpu MHz字段(它是内核估算均值,非实时),要么放弃采集,因为系统根本不支持细粒度频率监控。
真正麻烦的从来不是怎么写代码,而是确认你的CPU、BIOS、内核模块、电源策略四者是否协同开放了这个能力。缺一不可。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










