4

关于 Java 程序,我对在 Linux 上执行此操作特别感兴趣。已经有一些问题表明您无法控制 Java,并且 Sun/Oracle 关闭了一些 RFE。

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

我理解为什么这是默认设置的原因。看起来某些版本的 Windows可能允许对此进行一些控制,但大多数都不允许。我期待 Linux 允许控制它,但似乎它不是一个选项

4

2 回答 2

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
   }
}
于 2011-02-04T11:06:18.187 回答
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 不好,但是可以用一个自动确定 cpu 数量并根据需要重置关联掩码的程序来代替。]

于 2011-01-04T10:51:42.997 回答