5

そのsched_fair.c中には:

unsigned int sysctl_sched_latency = 5000000ULL //5m 

unsigned int sysctl_sched_min_granularity = 1000000ULL //1ms

Linux の公正なタイムスライスは、nr_running とこの公正なタスクの相対的な重みによって異なることは理解していますが、コードを研究することで、タイムスライスを 1 ~ 5 ミリ秒に保つことが主なアイデアであることがわかりました。理解が間違っていたら訂正してください。私はここで間違っているに違いありませんが、方法がわかりません!

また、HZ、または 1 秒あたりのシステム ティック数、または 1 秒あたりのタイマー割り込み数は、通常、アーム マシン (およびほとんどの非デスクトップ マシンも) で 200 または 100 であり、5 ~ 10 ミリ秒のティックが得られます。レート。

set_next_entity()タイムスライスは、公平なタスクの実行がスケジュールされるたびに rq->hrtick_timer を開始しresched_task()、タイムアウト コールバック関数を呼び出すことによって動作しますhrtick()。このタイマーは、ティックごとにタイマー irq ハンドラーによって処理されるキューに入れられたタイマーの 1 つtimer_tick()ですrun_local_timer()。他に隠された秘密はないようです。

では、5 ミリ秒よりも短いタイムスライスを取得するにはどうすればよいでしょうか? これを理解するのを手伝ってください。どうもありがとうございました!

4

1 に答える 1

2

Robert Love の Linux Kernel Development で述べられているように、タイムスライスを短くする唯一の方法は、実行中のプロセス (または他のプロセスより優先度の低いプロセス) の数を増やすことです。

実行中のプロセスの数が増えると、適切なターゲット レイテンシを保証するためにタイムスライスを短縮する必要が生じます (ただし、タイムスライスは最小粒度で下限が設定されます)。ただし、特定のタイムスライスでプロセスがプリエンプトされるという保証はありません。これは、タイム アカウンティングがタイマー割り込みによって駆動されるためです。

HZ の値を大きくすると、タイマー割り込みがより頻繁に発生し、タイム アカウンティングがより貴重になるため、再スケジュールがより頻繁に発生する可能性があります。


このvruntime変数は、プロセスの仮想ランタイムを格納します。これは、実行可能なプロセスの数によって正規化された実際のランタイムです。理想的なマルチタスキング システムでは、すべてのプロセスの vruntime が同じになります。つまり、すべてのタスクがプロセッサを均等かつ公平に分配します。

通常、タイムスライスはターゲット レイテンシを実行中のプロセス数で割ったものです。しかし、実行中のプロセスの数が無限大に近づくと、タイムスライスは 0 に近づきます。これにより、最終的に許容できないスイッチング コストが発生するため、CFS は各プロセスに割り当てられたタイムスライスにフロアを課します。このフロアは最小粒度 と呼ばれます。したがって、タイムスライスは と の間の値sysctl_sched_latencyですsysctl_sched_granularity。( を参照sched_timeslice())

vruntime変数は によって管理されupdate_curr()ます。update_curr()システムタイマーによって定期的に呼び出され、プロセスが実行可能またはブロックされて実行不能になるたびに呼び出されます。

タスク間でプリエンプションを実行するには、各タイマー割り込みで を呼び出し、次に を呼び出しhrtick()ます。を呼び出してプロセスを更新し、次に を呼び出します。現在のランタイムが理想的なランタイム (タイムスライス) よりも大きいかどうかをチェックし、そうであれば、フラグを設定するを呼び出します。task_tick_fair()entity_tick()entity_tick()update_curr()vruntimecheck_preempt_tick()check_preempt_tick()resched_task()TIF_NEED_RESCHED

TIF_NEED_RESCHEDが設定されている場合schedule()、最も近い機会に呼び出されます。

そのため、 の値が大きくなるとHZ、タイマー割り込みがより頻繁に発生し、より貴重な時間アカウンティングが発生し、スケジューラがタスクをより頻繁に再スケジュールできるようになります。

于 2013-07-01T12:39:50.163 に答える