Linuxスケジューラのタイムスライスを知るには?

特定のプロセスに割り当てられるクォンタムは異なる場合があります:

これは、デフォルトの Linux スケジューラである Completely Fair Scheduler が、固定のタイムスライスではなく、ある割合のプロセッサをプロセスに割り当てるためです。つまり、各プロセスのタイムスライスは現在の負荷に比例し、プロセスの優先度値によって重み付けされます。

SCHED_RR を使用する特殊な目的のリアルタイム プロセスの場合、デフォルトのタイムスライスは Linux カーネルで RR_TIMESLICE として定義されています。 include/linux/sched/rt.h にあります。

/*
 * default timeslice is 100 msecs (used only for SCHED_RR tasks).
 * Timeslices get refilled after they expire.
 */
#define RR_TIMESLICE            (100 * HZ / 1000)

sched_rr_get_interval() を使用できます 特定の SCHED_RR プロセスの SCHED_RR 間隔を取得します。


CFS (プロセスのデフォルトのスケジューラ) には固定のタイムスライスがなく、ターゲットのレイテンシ (sysctl_sched_latency) に応じて実行時に計算されます。 ) および実行中のプロセスの数。タイムスライスが最小粒度 (sysctl_sched_min_granularity) より小さくなることはありません ).

タイムスライスは常に sysctl_sched_min_granularity の間になります および sysctl_sched_latency 、デフォルトはそれぞれ 0.75 ミリ秒と 6 ミリ秒で、kernel/sched/fair.c で定義されています。

ただし、実際のタイムスライスはユーザー空間にエクスポートされません。


SCHED_OTHER の間で受け入れられた回答には混乱があります プロセス (つまり、(デフォルトの) 非リアルタイム ラウンドロビン タイムシェアリング ポリシーの下で動作するプロセス) および SCHED_RR

sched_latency_nssched_min_granularity_ns ファイル (デバッグ用で、カーネルが CONFIG_SCHED_DEBUG で構成されている場合にのみ表示されます) ) SCHED_OTHER のスケジューリングに影響を与える プロセス。 Alexey Shmalko の回答に記載されているように、CFS でのタイム スライスは固定されておらず (ユーザー空間にエクスポートされていません)、カーネル パラメーターやプロセスのナイス値などの要因に依存します。

sched_rr_get_interval() は、SCHED_RR のクォンタムである固定値を返します。 プロセスは、プリエンプトまたはブロックされない限り、確実に取得されます。従来の Linux では、SCHED_RR 量子は 0.1 秒です。 Linux 3.9 以降、制限は /proc/sys/kernel/sched_rr_timeslice_ms で調整できます このファイルでは、クォンタムがミリ秒値として表され、デフォルトは 100 です。