【base库学习】进程绑定cpu方法

本文介绍了如何通过设置进程的CPU亲和性来优化多核环境下的任务调度,通过`affinity.h`和`affinity.cc`文件实现将进程绑定到特定的CPU核心上运行,从而提升程序执行效率。使用`sysconf`函数获取CPU数量,结合`splitString`函数解析用户指定的CPU ID,并通过`sched_setaffinity`函数将进程绑定到指定核心。适用于寻求提高程序并发性能和资源利用效率的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

affinity.h
#ifndef BASE_AFFINITY_H_
#define BASE_AFFINITY_H_
namespace base {
  void ApplyAffinitySetting();
}  // namespace base

#endif  // BASE_AFFINITY_H_

affinity.cc

#include "base/affinity.h"

#include <unistd.h>  // gcc 4.7 is needed
#include <sys/sysinfo.h>
#include <sched.h>
#include <string>
#include <vector>

#include "base/flags.h"
#include "base/string_util.h"

DEFINE_string(
    affinity_setting,
    "",
    "Affinity setting: specify the cpu ids, seperated by comma.E.g.: '0,1'");

namespace base {
  void ApplyAffinitySetting() {
    if (FLAGS_affinity_setting.empty()) {
      return;
    }
    std::vector<std::string> results;
    SplitString(FLAGS_affinity_setting, ',', &results);
    int cpu_num = sysconf(_SC_NPROCESSORS_CONF);

    cpu_set_t mask;
    CPU_ZERO(&mask);
    for (int i = 0; i < results.size(); i++) {
      int cpu_id = StringToInt(results[i]);
      CHECK_LT(cpu_id, cpu_num);
      CPU_SET(cpu_id, &mask);
    }
    LOG(INFO) << "Set CPU affinity " << FLAGS_affinity_setting;
    if (sched_setaffinity(0, sizeof(mask), &mask)) {
      LOG(WARNING) << "Could not set CPU affinity " << FLAGS_affinity_setting;
    }
  }
}  // namespace base

该方法主要用于实现将当前进程绑定到指定的CPU上面执行。

主要实现方法ApplyAffinitySetting()

sysconf是<sys/sysinfo.h>中的方法,主要获取选项的当前值。

sysconf(_SC_NPROCESSORS_CONF)获取cpu个数

sysconf(_SC_PAGESIZE)获取系统页面大小

sysconf (_SC_PHYS_PAGES)获取物理页个数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值