新しいスレッドを作成したときに発生する「ペナルティ」について知りたいです。
clone(2)、NPTL(New POSIX Threading Library)、CFS(Completely Fair Scheduler)について私が理解したところによると、NPTLは1:1スレッドモデルを使用するため、新しいスレッドが生成されると新しいプロセスとして処理されます。
私が得たものから読むスケジューラに関して、新しいプロセスが実行キューに追加されると、fair_clock
変数は壁時計の一部だけ増加します。
pthread_create(3) 探索意識を使用すると、最終的には fork(2) と同様にレプリカが呼び出されます。
これで、プロセスには1:1モデルがあり、スレッドには1:1モデルがあります。それでは、スレッドもこれによって困難を経験しますか?同じ運命しかも?明らかに、スレッドはどんな形でも不利益を受けなければなりません。そうしないと、マルチスレッドプロセスがCFSで使用されるラウンドロビン(RR)システムを満たして、CPU時間の大部分を占める可能性があります。
この場合はいはい、それでフォークよりもスレッドを使用すると、どのような利点がありますか? shm_open(2) を使用する代わりに自動的にヒープスペースを共有しますか?
ベストアンサー1
Completely Fair Schedulerに私が提供したリンクから、カーネル2.6.24にいわゆるグループスケジューリングがあることがわかります。
Chandandeep Singh Pablaの言葉を引用するには:
たとえば、システムに合計25の実行可能プロセスがあるとします。 CFSはCPUの4%をすべての人に公平に割り当てようとします。ただし、これら25のプロセスのうち、20はユーザーAに属し、5つはユーザーBに属しているとします。ユーザーBは、AがBよりもCPU性能が高いため、本質的に不利な立場にあります。グループ予約はこの問題を解決しようとします。まず、グループに公平に試み、次にそのグループ内の個々のタスクに公平に試みます。したがって、グループスケジューリングが有効になっているCFSは、各ユーザーAとBにCPUの50%を割り当てます。 Aの50%クォータはAの20タスクに割り当てられ、残りの50%のCPU時間はBの5タスクのうちの1つに公平に割り当てられます。
これは、プロセスが新しいスレッドを作成するとそのプロセス予約グループに属するため、上記の質問に適用されます。これにより、1000個のスレッドを生成するプログラムがすべてのCPU時間を占めることを防ぐことができます。これは、特定のプロセスグループの実行時間(1000スレッド+元のプログラム)の1/1001のみを取得するためです。
これにより、システム全体と比較してスレッドのタイミングが遅くなり、スレッドアプリケーションに適切に不利益があります。