gpt4 book ai didi

c - 无法避免子进程继承父进程的 cpu 亲和性

转载 作者:太空狗 更新时间:2023-10-29 12:31:56 25 4
gpt4 key购买 nike

我想将父进程关联到一个特定的核心。在下面的代码中,变量 core 是用户提供的参数。之后,我想创建 NUM_CHILDREN 个进程,并且每个进程都以循环方式关联到其中一个核心。子进程跳出循环并执行更多工作(代码中未显示)。

int child_core = 0;
CPU_ZERO(&mask);
CPU_SET(core,&mask);

if (sched_setaffinity(0, len, &mask) < 0)
{
perror("sched_setaffinity");
}

for(int i = 0 i < NUM_CHILDREN; i++)
{
pID = fork();
if (pID == 0)
{
/* child */
CPU_ZERO(&mask);
CPU_SET(child_core,&mask);
len = sizeof(mask);

if (sched_setaffinity(0, len, &mask) < 0)
{
perror("sched_setaffinity");
}

break;
}

/*parent does some work*/
child_core = (child_core+1)%6
}

我面临的问题是,运行 sar -P ALL 1 100 显示仅使用了一个核心(父级关联的核心)。我正在尝试遵循此处提到的解决方案:Cpu affinity inherited by child process

谁能告诉我如何让子进程关联到正确的核心。

最佳答案

我认为你的方法需要让父进程增加计数器子进程,并且您的关联代码需要为所有进程执行。

试试这个:

/* your call args and return type  may vary, just an illustration */
void doSetup()
{

int child_core = 0;

for(int i = 0 i < NUM_CHILDREN; i++)
{
pid_t pID = fork();
if (pID == 0)
{
/* child */
break;
}
else
{
/* parent only */
child_core = (child_core+1)%6
}
}



/* all processes */

cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(child_core,&mask);
size_t len = sizeof(mask);

if (sched_setaffinity(0, len, &mask) < 0)
{
perror("sched_setaffinity");
}
else
{
/* child process tasks calls here */
}

return;

}

this link at IBM DeveloperWorks 上有更多示例和讨论。

希望这对您有所帮助。

关于c - 无法避免子进程继承父进程的 cpu 亲和性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24109547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com