Skip to content

Sys_Base

SweerItTer edited this page Feb 1, 2026 · 3 revisions

ResourceMonitor API 文档

概述

ResourceMonitor 是 utilsCore Sys 模块的核心基类,提供资源监控的基础框架,支持自动暂停和恢复机制。

职责

  • 提供资源监控的基础框架
  • 自动暂停和恢复监控线程
  • 输出监控数据到文件
  • 线程安全访问

适用场景

  • CPU 监控
  • 内存监控
  • 其他资源监控

依赖关系

  • 依赖: 标准库
  • 被依赖: CpuMonitor, MemoryMonitor 等监控类

类分析

ResourceMonitor 类

职责与用途

ResourceMonitor 是资源监控的基类,提供:

  • 监控线程管理
  • 自动暂停机制
  • 数据输出到文件
  • 线程安全访问

设计模式

  • 模板方法模式: 子类实现 sampleUsage()
  • RAII: 自动管理线程生命周期

保护成员

sampleUsage() - 采样函数

virtual bool sampleUsage(float& usage) = 0;

参数说明:

  • usage (输出): 采样到的使用率

返回值:

  • true: 采样成功
  • false: 采样失败

所有权归属:

  • 无所有权转移

注意事项:

  1. 纯虚函数,子类必须实现
  2. 在监控线程中调用
  3. 使用率范围由子类定义

公共 API 方法

构造函数

ResourceMonitor(int sleeptime, const std::string& output_file);

参数说明:

  • sleeptime (输入): 轮询间隔(毫秒)
  • output_file (输入): 输出文件路径

返回值: 无

所有权归属:

  • ResourceMonitor 拥有内部资源的所有权

注意事项:

  1. 构造时启动监控线程
  2. sleeptime 控制采样频率
  3. output_file 指定数据输出路径

使用例程:

// 创建监控器(每 1000ms 采样一次,输出到 /tmp/cpu_usage)
ResourceMonitor monitor(1000, "/tmp/cpu_usage");

析构函数

virtual ~ResourceMonitor();

参数说明: 无

返回值: 无

所有权归属:

  • 释放所有资源

注意事项:

  1. 停止监控线程
  2. 等待线程退出
  3. 自动清理资源

getUsage() - 获取使用率

float getUsage();

参数说明: 无

返回值: 当前使用率

所有权归属:

  • 只读访问

注意事项:

  1. 线程安全操作
  2. 自动更新 last_access_ 时间
  3. 如果线程已暂停,自动唤醒
  4. 使用率范围由子类定义

使用例程:

float usage = monitor.getUsage();
printf("Usage: %.1f%%\n", usage);

内部实现

成员变量

std::atomic<float> usage_{0.0f};           // 最新负载
std::atomic<bool> running_{true};          // 线程运行标志
std::atomic<bool> pause_{false};          // 暂停标志
std::mutex mutex_;                          // 互斥锁
std::condition_variable cv_;                // 条件变量
std::atomic<std::chrono::steady_clock::time_point> last_access_;  // 最后访问时间
std::thread monitor_thread_;                // 监控线程
int sleeptime_;                             // 轮询间隔(毫秒)
std::string output_file_;                   // 输出文件

monitorLoop() - 监控循环

void monitorLoop();

行为:

  1. 检查是否需要暂停(30 秒无访问)
  2. 如果暂停,等待条件变量
  3. 调用 sampleUsage() 采样
  4. 更新 usage_
  5. 写入输出文件
  6. 休眠 sleeptime_ 毫秒

自动暂停机制

const std::chrono::seconds pause_timeout{30};

if (now - last_access_.load() > pause_timeout && !pause_) {
    pause_ = true;
    std::cerr << "Pausing monitor thread for " << output_file_ << "\n";
}

说明:

  • 30 秒无访问自动暂停
  • 暂停后输出警告信息
  • 调用 getUsage() 时自动唤醒

线程安全说明

同步机制

  • usage_: 原子变量,线程安全
  • running_: 原子变量,线程安全
  • pause_: 原子变量,线程安全
  • mutex_: 保护 last_access_ 和条件变量
  • cv_: 条件变量,用于暂停/唤醒

线程安全建议

  • getUsage() 是线程安全的
  • sampleUsage() 在监控线程中调用
  • 子类实现 sampleUsage() 时注意线程安全

典型使用场景

场景 1: 派生类实现

class CpuMonitor : public ResourceMonitor {
public:
    CpuMonitor() : ResourceMonitor(1000, "/tmp/cpu_usage") {}

protected:
    bool sampleUsage(float& usage) override {
        // 采样 CPU 使用率
        usage = get_cpu_usage();
        return true;
    }
};

// 使用
CpuMonitor monitor;
float usage = monitor.getUsage();

场景 2: 自动暂停和恢复

CpuMonitor monitor;

// 获取使用率(30 秒内有访问)
float usage1 = monitor.getUsage();

// 等待 30 秒
std::this_thread::sleep_for(std::chrono::seconds(30));

// 再次获取使用率(线程会自动恢复)
float usage2 = monitor.getUsage();

场景 3: 输出到文件

// 创建监控器,输出到 /tmp/cpu_usage
CpuMonitor monitor;

// 数据会自动写入到文件
// 每行一个值,格式: 12.5

场景 4: 自定义轮询间隔

// 每 500ms 采样一次
class FastMonitor : public ResourceMonitor {
public:
    FastMonitor() : ResourceMonitor(500, "/tmp/fast_usage") {}

protected:
    bool sampleUsage(float& usage) override {
        // 采样逻辑
        return true;
    }
};

场景 5: 资源监控循环

CpuMonitor monitor;

while (running) {
    float usage = monitor.getUsage();
    printf("CPU Usage: %.1f%%\n", usage);
    
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

注意事项

  1. 派生类: 必须实现 sampleUsage() 纯虚函数
  2. 自动暂停: 30 秒无访问自动暂停监控线程
  3. 自动恢复: 调用 getUsage() 时自动恢复
  4. 线程安全: getUsage() 是线程安全的
  5. 输出文件: 数据会自动写入到输出文件
  6. 轮询间隔: 构造时指定轮询间隔
  7. 使用率范围: 使用率范围由子类定义
  8. 析构顺序: 先停止线程,再等待线程退出

相关文档


参考资料

主页

API 文档

DMA 模块

DRM 模块

NET 模块

V4L2 模块

V4L2Param 模块

RGA 模块

MPP 模块

Sys 模块

Mouse 模块

Utils 模块

Clone this wiki locally