如何用C++获取macOS活动监视器中CPU、GPU、RAM占用数据?
macOS下C++获取进程硬件资源占用方案
直接调用macOS原生系统API是最优方案,完全避免fork子进程执行shell命令的开销,同时可以覆盖CPU、内存、GPU三类数据的采集,统计结果和活动监视器完全对齐。
前置依赖
需要引入三个系统头文件,编译时链接CoreFoundation、IOKit两个系统框架:
#include <libproc.h> #include <mach/mach.h> #include <IOKit/IOKitLib.h>
各资源采集实现
- CPU使用率采集
使用proc_pidinfo接口获取进程的运行时间统计,两次采样的时间差除以采样间隔即可得到CPU使用率,核心代码示例:
double get_process_cpu(pid_t pid) { struct proc_taskinfo task_info; int ret = proc_pidinfo(pid, PROC_PIDTASKINFO, 0, &task_info, sizeof(task_info)); if (ret <= 0) return 0.0; // 结合两次采样的pti_total_user + pti_total_system时间差计算使用率 static uint64_t last_total_time = 0; static uint64_t last_timestamp = 0; uint64_t now = mach_absolute_time(); uint64_t total_time = task_info.pti_total_user + task_info.pti_total_system; double cpu_usage = 0.0; if (last_timestamp > 0) { uint64_t time_diff = now - last_timestamp; uint64_t cpu_diff = total_time - last_total_time; // 转换为百分比,macOS下CPU使用率单核心满负荷为100%,多核心累加 cpu_usage = (double)cpu_diff / (double)time_diff * 100.0; } last_total_time = total_time; last_timestamp = now; return cpu_usage; }
- RAM内存占用采集
同样使用proc_pidinfo读取pti_resident_size字段,即为进程当前的物理内存占用,单位为字节:
uint64_t get_process_ram(pid_t pid) { struct proc_taskinfo task_info; int ret = proc_pidinfo(pid, PROC_PIDTASKINFO, 0, &task_info, sizeof(task_info)); return ret > 0 ? task_info.pti_resident_size : 0; }
- GPU占用采集
使用IOKit框架读取GPU性能计数器数据,核心逻辑为匹配IOAccelerator服务,读取进程维度的GPU时间占用,采样计算逻辑和CPU类似,编译时需要链接IOKit框架。如果仅需要采集当前应用自身的GPU占用,也可以直接使用Metal框架提供的MTLCommandBuffer性能统计接口,无需操作IOKit。
方案优势
- 性能开销极低:所有接口均为用户态直接调用,无需创建子进程、解析命令输出,采集耗时比shell调用低两个数量级以上
- 数据准确性高:和活动监视器使用相同的底层数据源,统计结果完全对齐
- 兼容性好:所有公开API支持macOS 10.10及以上系统版本,无版本适配问题
内容的提问来源于stack exchange,提问作者ellipticaldoor
相关产品推荐
相关产品推荐

