5

Linuxでスレッドが多いプロセスは、スレッドが1つあるプロセスよりもCPU時間が長くなりますか?

Linuxでは、プロセスとスレッドはタスク構造体によって記述され、スケジューリングはタスクに基づいています。私もこれを見つけました:

新しいプロセスが作成されると、do_fork()現在の(親)プロセスとp(子)プロセスの両方のカウンターフィールドが次のように設定されます。

current->counter >>= 1;
p->counter = current->counter;

つまり、親に残されたティック数は、親用と子用の2つに分割されます。これは、次の方法を使用して、ユーザーが無制限のCPU時間を取得できないようにするために行われます。親プロセスは、同じコードを実行する子プロセスを作成してから、それ自体を強制終了します。作成率を適切に調整することにより、子プロセスは、親のクォンタムが期限切れになる前に、常に新しいクォンタムを取得します。カーネルはフォークに報酬を与えないため、このプログラミングトリックは機能しません。同様に、ユーザーは、シェルで多くのバックグラウンドプロセスを開始したり、グラフィカルデスクトップで多くのウィンドウを開いたりすることによって、プロセッサの不公平なシェアを奪うことはできません。より一般的に言えば、プロセスは、複数の子孫をフォークすることによってリソースを占有することはできません(リアルタイムポリシーを与える特権がない限り)。

実際、カーネルソースではそれを見つけられませんでしたが、おそらくそれは私のせいで、間違ったカーネルバージョンを見たのかもしれません。

しかし、後で何が起こるのでしょうか。すべてのスレッドが個別のプロセスのようにスケジューリングに参加するのでしょうか。10スレッドのプロセスは、1スレッドのプロセスよりも10倍多くのティックを取得しますか?この意味でのIOはどうですか?

4

1 に答える 1

11

はい、スレッド数が多いプロセスでは、競合他社よりもCPU時間が長くなります。よく知られているケースはmavenコンパイルで、mavenはCPUを集中的に使用するスレッドを大量に使用し、システムを占有します。

ただし、現在のLinuxスケジューラーは、タスクだけを考慮に入れるのではなく、cpucgroup階層内の制御グループも考慮に入れます。したがって、CPU時間は制御グループ間で分割され、次に各制御グループでCPU時間がタスク間で分割されます。

2.6.38以降、LinuxはセッションIDに基づいてtakを異なるCPUcgroupに自動的に配置します。これは、たとえば、konsole/gnome-terminalの個別のタブが独自のコントロールグループを取得することを意味します。これで、Mavenのコンパイルが適切に分離され、システムを占有することがなくなりました。kernelnewbiesおよびlwn.netの説明を参照してください。

2.6.38がほとんどのシステムにヒットする前に、Lennart Poetteringは、このLKMLメッセージでシェルスクリプトを手動で実行する方法を示しました。

/etc/bashrc 私は実際にEclipseとMavenコンパイルを実行するシステムを持っており、2.6.38より前から2.6.38より前への変更+ Lennartのcgroupバインディング(Eclipseランチャースクリプトに追加)は完璧でした。Mavenはもはやシステムを占有しません(CPU負荷モニターがなければMavenコンパイルが行われていることはわかりません)、そしてEclipseはシステムの残りの部分ではなく、それ自体を占有するだけです(私は解決しますEclipseの場合)。ここで、カーネルをダーティページのライトバックが改善されたものに更新する必要があります。そのシステムは簡単に作業できます。

于 2012-10-03T19:24:29.973 に答える