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
主要实现方法ApplyAffinitySetting()
sysconf是<sys/sysinfo.h>中的方法,主要获取选项的当前值。
sysconf(_SC_NPROCESSORS_CONF)获取cpu个数
sysconf(_SC_PAGESIZE)获取系统页面大小
sysconf (_SC_PHYS_PAGES)获取物理页个数