4

Java プログラムに関しては、Linux でこれを行うことに特に興味があります。Java からは制御できないという質問がいくつかあり、Sun/Oracle によってクローズされた RFE もあります。

ソース コードにアクセスでき、低水準言語を使用している場合は、関連するシステム コールを確実に行うことができます。ただし、サンドボックス化されたシステム (ソース コードがない可能性がある) は、より多くの課題を提示します。このプロセスごとまたはカーネルパラメーターを設定するツールは、親プロセスの外部からこれを制御できると考えていました。これは本当に私が求めているものです。

これがデフォルトである理由がわかりました。一部のバージョンの Windows では、これをある程度制御できるように見えますが、ほとんどの場合は制御できません。Linux で制御できると思っていましたが、オプションではないようです。

4

2 に答える 2

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 に答える
1

fork() の後で、子のアフィニティを親から変更することもできます。ところで、私はあなたが Linux を使用していると仮定しています。sysconf() を使用してコア数を取得するなど、いくつかのことは、OS や 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 に答える