Linuxでスレッドが多いプロセスは、スレッドが1つあるプロセスよりもCPU時間が長くなりますか?
Linuxでは、プロセスとスレッドはタスク構造体によって記述され、スケジューリングはタスクに基づいています。私もこれを見つけました:
新しいプロセスが作成されると、
do_fork()
現在の(親)プロセスとp(子)プロセスの両方のカウンターフィールドが次のように設定されます。current->counter >>= 1; p->counter = current->counter;
つまり、親に残されたティック数は、親用と子用の2つに分割されます。これは、次の方法を使用して、ユーザーが無制限のCPU時間を取得できないようにするために行われます。親プロセスは、同じコードを実行する子プロセスを作成してから、それ自体を強制終了します。作成率を適切に調整することにより、子プロセスは、親のクォンタムが期限切れになる前に、常に新しいクォンタムを取得します。カーネルはフォークに報酬を与えないため、このプログラミングトリックは機能しません。同様に、ユーザーは、シェルで多くのバックグラウンドプロセスを開始したり、グラフィカルデスクトップで多くのウィンドウを開いたりすることによって、プロセッサの不公平なシェアを奪うことはできません。より一般的に言えば、プロセスは、複数の子孫をフォークすることによってリソースを占有することはできません(リアルタイムポリシーを与える特権がない限り)。
実際、カーネルソースではそれを見つけられませんでしたが、おそらくそれは私のせいで、間違ったカーネルバージョンを見たのかもしれません。
しかし、後で何が起こるのでしょうか。すべてのスレッドが個別のプロセスのようにスケジューリングに参加するのでしょうか。10スレッドのプロセスは、1スレッドのプロセスよりも10倍多くのティックを取得しますか?この意味でのIOはどうですか?