无法避免子进程继承父进程的cpu相关性

无法避免子进程继承父进程的cpu相关性,c,linux,parallel-processing,fork,affinity,C,Linux,Parallel Processing,Fork,Affinity,我想将父进程亲合到特定的核心。在下面的代码中,变量core是用户提供的参数。接下来,我想创建NUM_CHILDREN进程,并以循环方式将它们中的每一个亲合到一个核心。子进程打破循环,做更多的工作(代码中未显示) int child\u core=0; CPU_零(和掩码); CPU_设置(内核和掩码); if(sched_setaffinity(0、len和mask)

我想将父进程亲合到特定的核心。在下面的代码中,变量core是用户提供的参数。接下来,我想创建NUM_CHILDREN进程,并以循环方式将它们中的每一个亲合到一个核心。子进程打破循环,做更多的工作(代码中未显示)

int child\u core=0;
CPU_零(和掩码);
CPU_设置(内核和掩码);
if(sched_setaffinity(0、len和mask)<0)
{
perror(“sched_setaffinity”);
}
对于(int i=0 i
我面临的问题是,运行sar-pall1100表明,只有一个内核(父级与之有亲缘关系的内核)被使用。我试图遵循这里提到的解决方案:


有人能告诉我如何使子进程与适当的核心密切相关。

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

试试这个:

/* 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;

}
/*您的呼叫参数和返回类型可能会有所不同,这只是一个示例*/
无效剂量设置()
{
int child_core=0;
对于(int i=0 i
下面还有一些例子和讨论


希望这有帮助。

我不想移动父进程。我希望它在整个执行过程中都绑定到一个特定的核心。您能指出我的代码中可能存在的问题吗?根据sched_setaffinity的手册页,“通过fork(2)创建的子级继承其父级的CPU关联掩码。关联掩码在execve(2)中保留”我认为这意味着在进行子作业时,必须将核心作业移到父作业上。然后,在分配所有子项后,父项将保留其分配。如果其他用户指出不正确的原因,我将接受更正。您能否解释一下/*所有进程*/将如何执行sched_setaffinity调用。子进程立即退出循环,因此它们永远不会到达关联。很好,抱歉。编辑它。
/* 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;

}