31

このSOの質問を読んだ後、私はいくつかの疑問を抱きました。理解にご協力ください。

スケジューリングには、プロセスを実行するタイミングと時間の量を決定することが含まれます。

  1. Linuxカーネルはスレッドまたはプロセスをスケジュールしますか?プロセスとスレッドはカーネル内で区別されていないので、スケジューラーはそれらをどのように処理しますか?

  2. 各スレッドのクォンタムはどのように決定されますか?a。プロセスに時間の量(たとえば100us)が決定された場合、それはプロセスのすべてのスレッド間で共有されることですか?またはb。各スレッドのクォンタムはスケジューラーによって決定されますか?

注:質問1と2は関連していて、同じように見えるかもしれませんが、物事がどのように機能しているかを明確にしたかっただけで、両方をここに投稿しました。

4

2 に答える 2

47

Linuxスケジューラー(最近のLinuxカーネル、少なくとも3.0など)は、スケジュール可能なタスクまたは単にタスクをスケジュールしています。

タスクは次のようになります:

  • シングルスレッドプロセス(forkスレッドライブラリなしで作成されたものなど)
  • マルチスレッドプロセス内の任意のスレッド(メインスレッドを含む)、特にPosixスレッド(pthreads)
  • カーネル内で開始され、カーネルランドにとどまるカーネルタスク(例kworker、、、、nfsiodなど)kjournaldkauditdkswapd

つまり、マルチスレッドプロセス内のスレッドは、非スレッドプロセス、つまりシングルスレッドプロセスのようにスケジュールされます。

低レベルのclone(2) syscallは、ユーザーランドでスケジュール可能なタスクを作成します(fork-edプロセスの作成、またはpthreadなどのスレッドライブラリの実装の両方に使用できます)。clone低レベルのスレッドライブラリの実装者でない限り、直接使用することは望ましくありません。

AFAIK、マルチスレッドプロセスの場合、カーネルは(ほとんど)プロセスをスケジュールしていませんが、内部の個々のスレッド(メインスレッドを含む)をスケジュールしています。

実際、スケジューリングにはスレッドグループとアフィニティの概念がいくつかありますが、私はそれらをよく知りません

最近では、プロセッサには一般に複数のコアがあり、各コアは(特定の瞬間に)タスクを実行しているため、複数のタスクを並行して実行しています。

CPUクォンタム時間は、プロセスではなくタスクに与えられます

于 2013-03-24T16:52:23.550 に答える
7

POSIXスレッド仕様のNPTL実装では、スレッドはカーネル内の異なるプロセスと見なされ、一意task_structであるため(したがってpid、各スレッドも)、前述のようにそれ自体でスケジュール可能です。したがって、各スレッドは独自のタイムスライスを取得し、上記のプロセスと同じようにスケジュールされます。

さらに、現在Linuxスケジューラーは、単一のタスク(単純なプロセス)だけでなく、プロセスのグループまたはユーザー(すべてのプロセス、ユーザーに属する)全体をスケジュールすることもできます。これにより、グループスケジューリングの実装が可能になります。この場合、CPU時間は最初にプロセスグループ間で分割され、次にそれらのグループ内でシングルスレッドに分散されます。

Linuxスレッドは、プロセスまたはスレッドを直接操作しませんが、スケジュール可能なエンティティで動作します。で表されstruct sched_entityます。すべてのプロセス/スレッドはであると言っても過言ではsched_entityありませんが、その逆は当てはまらない可能性があります。

詳細なプロセススケジューリングについては、こちらを参照してください

于 2016-08-14T16:50:52.150 に答える