一、代码可行性分析
1、核心逻辑验证
用户代码通过getpid()获取当前进程ID,结合cpu_set_t设置CPU亲和性。关键函数 sched_setaffinity支持为不同进程指定CPU核心。在多进程场景中,若每个进程独立调用此代码(例如父进程创建子进程后,子进程自行设置亲和性),则能实现多进程的核绑定。
2、多进程适配性
独立设置:每个进程的CPU亲和性是独立的。父进程可在fork()子进程后,通过exec系列函数启动子进程并传递不同的g_code_set值,实现差异化核心绑定。
继承性控制:默认情况下,子进程会继承父进程的CPU亲和性。若需覆盖,需在子进程中重新调用sched_setaffinity。
二、代码优化建议
添加错误处理
需检查sched_setaffinity返回值,避免无效CPU编号导致失败:
if (sched_setaffinity(self, sizeof(mask), &mask) == -1) {
perror("sched_setaffinity failed");
exit(EXIT_FAILURE);
}
多进程场景下的实现示例
#include <unistd.h>
#include <sched.h>
#include <vector>
void set_affinity(const std::vector<int>& cores) {
pid_t pid = getpid();
cpu_set_t mask;
CPU_ZERO(&mask);
for (int core : cores) {
CPU_SET(core, &mask);
}
if (sched_setaffinity(pid, sizeof(mask), &mask) == -1) {
perror("sched_setaffinity");
exit(EXIT_FAILURE);
}
}
int main() {
// 父进程绑定核心0-1
set_affinity({0, 1});
pid_t child = fork();
if (child == 0) {
// 子进程绑定核心2-3
set_affinity({2, 3});
execv("./child_program", NULL);
}
// 父进程继续执行其他任务
return 0;
}
三、注意事项
1、权限要求
设置CPU亲和性通常需要root权限,否则可能返回EPERM错误。
核编号有效性
需通过sysconf(_SC_NPROCESSORS_CONF)获取系统实际CPU核心数,避免g_code_set包含无效值。
2、性能权衡
优势:减少进程迁移带来的缓存失效,提升计算密集型任务性能。
风险:过度绑定可能导致负载不均衡,建议结合任务类型(如I/O密集型或计算密集型)动态调整。