多进程下设置CPU亲核性

一、代码可行性分析
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密集型或计算密集型)动态调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小新阿呆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值