是否可以阻止子级继承父级的CPU /核心亲和力?

时间:2011-01-04 10:26:41

标签: multicore affinity

对于Java程序,我在Linux上做这件事特别有趣。已经有一些问题表明你无法控制Java,而且一些RFE已被Sun / Oracle关闭。

如果您可以访问源代码并使用低级语言,那么您当然可以进行相关的系统调用。然而,沙盒系统 - 可能没有源代码 - 带来了更多的挑战。我原以为设置此进程或内核参数的工具能够从父进程外部控制它。这就是我所追求的。

我了解reason why this is the default。它看起来像某个版本的Windows may allow some control,但大多数都没有。我期待Linux允许控制它,但看起来像it's not an option

2 个答案:

答案 0 :(得分:1)

如果您有足够的权限,您可以在孩子入院前简单地调用setaffinity。换句话说,来自

if (fork() == 0)
        execve("prog", "prog", ...);

转移到使用

/* simple example using taskset rather than setaffinity directly */
if (fork() == 0)
        execve("taskset", "taskset", "-c", "0-999999", ...);

[当然使用999999并不好,但可以用自动确定cpus数量的程序代替,并根据需要重置关联掩码。]

答案 1 :(得分:1)

您还可以做的是在fork()之后更改子级与父级的亲和性。顺便说一下,我假设你在linux上,其中一些东西,比如用sysconf()检索内核的数量,在不同的操作系统和unix风格上会有所不同....这里的例子,获取cpu父进程的一部分,并尝试确保所有子进程按循环方式安排在不同的核心上。

/* get the number of cpu's */
numcpu = sysconf( _SC_NPROCESSORS_ONLN );

/* get our CPU */
CPU_ZERO(&mycpuset);
sched_getaffinity( getpid() , sizeof mycpuset , &mycpuset);

for(i=0 ; i < numcpu ; i++ )
{
    if(CPU_ISSET( i, &mycpuset))
    {
        mycpu = i;
        break;
    }
}

//...

while(1)
{
    //Some other stuff.....

    /* now the fork */    
    if((pid = fork()) == 0)
    {
       //do your child stuff
    }    

   /* Parent... can schedule child. */
   else
   {
   cpu = ++cpu % numcpu;
       if(cpu == mycpu)
           cpu = ++cpu % numcpu;
       CPU_ZERO(&mycpuset);
       CPU_SET(cpu,&mycpuset);
       /*set processor affinity*/
       sched_setaffinity(pid, sizeof mycpuset, &mycpuset );

       //any other father stuff
   }
}