スレッド設定戦略とそれを実行するときにその戦略に従う方法についていくつかの質問があります。 Pthreadを使用すると、スレッドのスケジューリングポリシーを設定できますSCHED_FIFO/SCHED_RR/SCHED_OTHER
。 LinuxカーネルがデフォルトのCFS
スケジューラポリシーとして使用されるため、このユーザー設定ポリシーがどのように機能するかを理解したいと思います。CFS
実行時にユーザー設定ポリシーを上書きしますか?それでは、pthreadスケジューリング戦略の用途は何ですか?
答え1
A/基本理論3:CFSはデフォルトではありません「スケジューリング戦略」Linuxで。 CFSはLinuxのデフォルトスケジューラです。
スケジューラは、既存のすべてのスレッドの中からCPU時間を付与する必要があるスレッドを選択します。
この選択は、状況によって異なると考えられるさまざまなパラメータによって制御されます。スケジュール戦略敗北。
すべてのスレッドはスケジュール戦略。
基本スケジュール戦略CFSは以下のように呼ばれます。SCHED_OTHER時にはSCHED_NORMALと表示されることもあります。
このポリシーは実際にスケジューラに次のことを指示します。お金の価値このポリシーに従って実行されるすべてのスレッド間の公平性を考慮し保証します。
B/実行時間: 各1個ダニ(またはすべての専用割り込み)スケジューラはリスト(a待ち行列)関連するスケジューリングポリシーとそのポリシーに依存する他のパラメータに基づいて実行可能なスレッド。並べ替えが完了すると、キューの上部にあるスレッドが選択されます。
「テーマ」に属します。リアルタイム「実行可能なケースにポリシー(SCHED_RR / SCHED_FIFO)がある場合は、常にリストの一番上に表示されます。ポリシー内の順序はリアルタイム優先順位設定によって制御されます。
C:あなたの質問:この場合、特定のスレッドの予約ポリシーを変更する場合(より正確には、実行中のスレッドが予約ポリシーへの変更を要求するシステムコールを実行している場合2 )、その権限を取得する限り、スケジューラは次のことを行います。それに応じてキューを並べ替えます。
たとえば、SCHED_OTHERスレッドがSCHED_RRに変更されると、リストの一番上に移動し、スケジューラはその値を無視し、指定されたリアルタイム優先順位に従って他のSCHED_RRスレッドと並べ替えます。
しかし、これがあなたの質問の一部である場合:
- スケジューラはスレッドの予約ポリシーを決定/強制しません。
- スケジューラはスケジューリングポリシーによって変更されません。起動時にCFSを選択すると、CFSは常にスケジューラになります。いつでも別のスケジューラを選択できます。一部はCFSパッチに含まれており、他のものは最初から作成されており、それぞれはより少ないオーバーヘッドを必要とし、/より良い値をよりよく処理し、/SCHED_RRスケジューリングポリシーをより効率的に処理/MAX_CORES <= 4の場合はより効率的ですです。実行に使用するスケジューラは、終了するまで唯一のプログラムスケジューラスレッドのままです。
- いずれにせよ、スケジューラは、親スレッド(まれにそれ自体)がスレッドに提供したスケジューリングポリシー(ほとんどの場合)に従って動作を調整します。
1:これはシングルコア環境で考慮する必要があります。
すべてのSMP / SMP + HT環境に拡張できますが、コア間でキューを共有(または共有しない)することができ、スレッドが利用可能なコアの完全/一部の特定のセットで実行できるようにするため、理解するのがより複雑になります。
2:使用する一連のシステムコールは、使用されるAPIによって異なります。
sched_setscheduler()標準的な方法で、pthread_setschedparam()POSIX APIを使用している場合。 (関数名は異なりますが、結果は同じです(CFSに与える影響))
3:利用可能な各予約ポリシーの詳細については、以下を参照してください。sched(7) Linux のマニュアルページ(男のスケジュール.7)、私はこれがあなたが探している最も信頼性が高く評判の良いソースであることを疑いません。