2013-10-04 28 views
5

カーネルでLinuxカーネルとCFSスケジューラについて読んでいます。私はvruntime(バーチャルランタイム)というCFSスケジューラの背後にあるコアコンセプトです。私は "Linuxカーネル開発"とインターネット上の他のブログからも読んでいますが、vruntimeの背後にある基本的な計算は理解できませんでした。 vruntimeは、特定のプロセスに属しているか、または同じnice値を持つプロセスグループに属していますか?です。 重み付け係数とは何ですか、どのように計算されますか?私はこれらすべてのコンセプトを経験しましたが、理解できませんでした。 vruntimeと* min_vruntime *の違いは何ですか?CFSでのvruntimeの概念

答えて

9

vruntimeはスレッドごとです。これは、task_struct内にネストされたメンバーです。

本質的に、vruntimeはスレッドの「実行時間」の尺度で、プロセッサに費やされた時間です。 CFSの全体像はすべてに公正であることです。そのため、algoの種類は簡単なものになります。(与えられた実行キューのタスクの中で)vruntimeが最も低いタスクが最も実行しなければならないタスクであるため、 'next'として選択します。 (実際の実装は効率のためにrbtreeを使用して行われます)。

vruntimeの計算は、優先度、nice値、cgroupsなどのさまざまな要素を考慮して、単純な増分ほど単純ではありません。私は"Professional Linux Kernel Architecture", Mauerer, Wrox Pressで関連するセクションを読むことをお勧めします - それは非常に詳細に説明されています。

下記を参照して、いくつかを要約してください。

その他のリソース: Documentation/scheduler/sched-design-CFS.txt

クイック概要 - vruntime計算:(__ update_curr:(ブックに基づいて)

  • 作業のほとんどは、カーネル/ sched_fair.cで行われます)

  • アップデート物理と仮想の時間がちょうどすなわち、nice値0、デフォルトの優先度で実行されるタスクのためにプロセッサ上で

  • を「現行」を費やしてきた、使用済み物理および仮想時間は同じである

  • ありません他のプライオリティ(nice)レベルのタスクのために。したがって、vruntimeの計算は、負荷重み係数を使用する電流の優先順位によって影響を受けます。

    delta_exec =(符号なしlong)(現在はcurr-> exec_start); // ... delta_exec_weighted = calc_delta_fair(delta_exec、curr); curr-> vruntime + = delta_exec_weighted;

いくつかの丸めとオーバーフローチェックを無視すると、何calc_delta_fair次式で与えられた値を計算 にある:

delta_exec_weighed = delta_exec * (NICE_0_LOAD/curr->load.weight) 

ことですが、より重要なタスク(下のnice値を持つもの)は、より大きな の重みを持ちます。したがって、上記の式によって、それらに占めるvruntimeはより小さくなります(したがって、それらはrbtreeの左にもっとエンキューされます)!

+0

のですか? – iammurtaza

+0

@iammurtaza:最小のvruntime(私はチューニング可能/ proc/sys/kernel/sched_min_granularity_ns)は通常(最近のUbuntuでは)約2.25msです。これが存在しない場合は、2つのタスクがプロセッサのオンとオフに数マイクロ秒ごとに「ピンポン」する可能性があります。このスラッシングの動作を緩和するには、CPUを使用するための最小限の保証が必要です。 – kaiwan

1

vruntimeは、プロセスが実行された時間を追跡するのに役立つプロセスの仮想ランタイムです。 vruntimeは、include/linux/sched.hに定義されているsched_entity構造体のメンバです。

min_vruntimeは、cfs実行キューの最小vruntimeを表します。これは、そのcfs実行キューでスケジュールされているプロセスのすべてのvruntimeの最小値を表します。 min_vruntimeは、include/linux/sched.hに定義されたcfs_rq構造体のメンバです。

min_vruntimeの目的は、実行するcfs実行キュー内の次のプロセスを選択することです。すべてのプロセスに対して公平であるために、CFSスケジューラは、最初に実行する最小vruntimeのプロセスを選択します。/Linuxの/ sched.hを含むように

リンクはmin_vruntimeの目的は何http://lxr.free-electrons.com/source/include/linux/sched.h