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)获取物理页个数