読んだ後 this SO質問いくつか疑問がありました。理解にご協力ください。
スケジューリングには、プロセスを実行するタイミングと時間の量を決定することが含まれます。
Linuxカーネルはスレッドまたはプロセスをスケジュールしますか?プロセスとスレッドはカーネル内で区別されていないので、スケジューラーはそれらをどのように処理しますか?
各スレッドのクォンタムはどのように決定されますか? a。プロセスに時間の量(たとえば100us)が決定された場合、それはプロセスのすべてのスレッド間で共有されることですか?またはb。各スレッドのクォンタムはスケジューラーによって決定されますか?
注:質問1と2は関連していて、同じように見えるかもしれませんが、物事がどのように機能しているかを明確にしたかっただけで、両方をここに投稿しました。
Linuxスケジューラー(最近のLinuxカーネルでは、少なくとも3.0など)は、スケジュール可能なタスクまたは単にタスク。
タスクは次のようになります。
fork
によって作成された)kworker
、nfsiod
、kjournald
、kauditd
、kswapd
などなど...)言い換えると、マルチスレッドプロセス内のスレッドは、非スレッドのようにスケジュールされます。シングルスレッドプロセス。
低レベル clone(2) syscallは、ユーザーランドでスケジュール可能なタスクを作成します(また、fork
- edプロセスの作成、またはpthread)。低レベルのスレッドライブラリの実装者でない限り、clone
を直接使用することは望ましくありません。
AFAIK、マルチスレッドプロセスの場合、カーネルは(ほとんど)プロセスをスケジュールしていませんが、内部の個々のスレッド(メインスレッドを含む)をスケジュールしています。
実際、スケジューリングにはスレッドグループと アフィニティ の概念がいくつかありますが、私はそれらをよく知りません
最近では、プロセッサには一般に複数のコアがあり、各コアは(特定の瞬間に)タスクを実行しているため、複数のタスクを並行して実行しています。
CPU量子時間は、プロセスではなくタスクに与えられます
POSIXスレッド仕様のNPTL実装は、スレッドをカーネル内の異なるプロセスと見なし、一意のtask_struct
(したがって、pid
も)を持つため、前述のように各スレッドはそれ自体でスケジュール可能です。したがって、各スレッドは独自のタイムスライスを取得し、上記のプロセスと同じようにスケジュールされます。
さらに、現在Linuxスケジューラーは、単一のタスク(単純なプロセス)だけでなく、プロセスのグループまたはユーザー(すべてのプロセス、ユーザーに属する)全体をスケジュールすることもできます。これにより、CPU時間が最初にプロセスグループ間で分割され、次にそれらのグループ内でシングルスレッドに分散されるグループスケジューリングの実装が可能になります。
Linuxスレッドは、プロセスやスレッドを直接操作しませんが、スケジュール可能なエンティティで動作します。 struct sched_entity
で表されます。すべてのプロセス/スレッドはsched_entity
であると言っても過言ではありませんが、その逆は当てはまらない可能性があります。
詳細なプロセススケジューリングについては、 ここ を参照してください。