对于Java程序,我在Linux上做这件事特别有趣。已经有一些问题表明你无法控制Java,而且一些RFE已被Sun / Oracle关闭。
如果您可以访问源代码并使用低级语言,那么您当然可以进行相关的系统调用。然而,沙盒系统 - 可能没有源代码 - 带来了更多的挑战。我原以为设置此进程或内核参数的工具能够从父进程外部控制它。这就是我所追求的。
我了解reason why this is the default。它看起来像某个版本的Windows may allow some control,但大多数都没有。我期待Linux允许控制它,但看起来像it's not an option。
答案 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
}
}