You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:39:05