CFSスケジューラー素晴らしい - すべてはトレードオフであります

覚えておいてくださいはかつて、「まだ記事CFSを書き込むことができない、」私はただ静かに調和のとれたCFSを楽しみましたが、つかの間の感情の一部が書かれていませんと呼ばれる記事は、実際には、非常に残念だろう書きましたない言及にどのような感情が、何も理解していない、時にはあなたはすぐに書き留めて何が最善かを実現、または他のあなたはそれが難しい理解することがあります長い時間。CFSスケジューラーは、2.6.23カーネルで導入する方法ナイーブと最初に実現する仮想クロックfair_keyキューを表すように設計された、シンプルで、どのような場合には、必ず後から2.6.25に、バージョンCFSを実現しています、 CFSの下で彼らのために容易になり、クロックのない仮想キュー構造、直接赤黒木のフィールドvruntimeスケジューリングエンティティの左下隅にそのコンセプトは、実際には、すべてのスケジューリングエンティティを作ることである(グループスケジューリング状況ではありません互いにvruntimeのキャッチアップのプロセス、プロセスの後に言った)、その後、どこかに同じ値を達成するために、あること、正規化されます。それでは、どのように異なる優先順位を反映していますか?これは、CFSの中で最も素晴らしい場所で、CFSはその仮想クロックのプロセス異なる重みがそのvruntimeの異なる単位で同じ実クロックの異なる通路に行くために、何の優先順位を言うと、統一された重みを名前変更されません具体的に、CFSは経験値を使用して、プロセスの優先順位値を言うことである2.5%が、1だけ増加され、その重量は、参照、容易乗算と除算と一致している、元の2.5%を減少させますそれはまたになった、どのように多くの進歩の変化に、各プロセスの仮想クロックに対して計算CFSにおける動的なタイムスライスと優先順位の間の単純な線形関係を、作る簡単な数式を使用しています次のとおりです。

[いい0は、プロセス1024重み値である、]仮想クロック(vruntime増分)=(実時間)のペース*(いい0は、プロセス/プロセス重量の重量です)

この式は、これはスケジューリングCFSに基づいて公正価値を提供し、スケジューラは常にどのくらいの時間のために実行し、それを実行する最小のプロセスvruntimeを選択し、非常に単純なのですか?これは、CFSの中で最も素晴らしいもので、私は将来のカーネルバージョン2.6.25の実現を意味し、2.6.23私は最終的に、より複雑な計算を使用して、この素晴らしい、早期CFSから見ることができませんどのくらいの時間のために実行?それは公式です:

プロセスの実行時間=(システム・スケジューリング期間)*(この実行キューのこのプロセスの重量/全重量)

20msの(プロセスの5以下)で定義されている上記の式では、システム・スケジューリング・サイクルは、通常のデスクトップシステムなど、時間の本当の期間は、一定の期間で、それが何を意味するのでしょうか?衡平な配分NRプロセスは、この20msのこと、どのように公正な法律これは手段?体重によると、以上の5つのプロセス、重みがタイムスライスを割り当てられた人誰、すべてのプロセスが、このシステムに割り当てられた時間の合計がスケジューリング期間でより高い我々は行うことになって?取り扱いが容易で、ライン上のスケジューリング期間に比例した増加に応じて、それは(プロセス/ 5の実際の数)に応じて、この比率が増加することができるされ、これらの言葉は、それぞれ、システム・スケジューリング・サイクルでシステム・スケジューリング・サイクルを有していたことを、意味を示します内部に、あなたは、システムが各プロセスを実行できるようにすることができ、最終的な結果は、システムの終わりにスケジューリング周期ごとに、他の言葉ですべてのプロセスがリターンを得る仮想クロックvruntimeは、vruntimeは、すべてのプロセスが同じであること、および[次へ]を開始することですタイムスライシングサイクルが分割しました。この解き大きな問題は、なぜによって飢餓、タイムスライスの割り当てが固定されているので、最初は、システムプロセスの数によって影響を受け、前のO(1)スケジューラにおける飢餓のプロセスは、プロセスが空腹になるということです優先順位とHZの決定、単語数システムプロセスの多くは、すべての後に、優先度の低いプロセスがキューに対処しなければならなかった、でも、優先度の高いプロセスの飢餓を期限切れに入力するようにつながる場合は、そうでない場合は、優先順位の低いプロセス飢餓、どのジレンマにスケジューラが発生し、次の優先順位は、対話プロセスがキューに入ることができないかを決定するために調整して、対話型のプロセスにあるキューを期限切れ飢餓プロセスにつながるれ、有効期限は、単にLinuxのスケジューラは、飢餓検出メカニズムを紹介これは標準ではなく、現在の問題を解決し、どのような場合には、この解決策は消極的に見えました。実際には、少しは、飢餓が必ずしも真に参加型プロセススケジューリング少数以来、実行キューに間違ったインタラクティブなプロセスのバック、インタラクティブな時間がないあなたは再びすぐに速すぎますと入力しても、ほとんどの時間は、キーボードやマウスを待っていますそれの1/1000のCPUのクロック速度、次のプロセスは、相互作用が、彼らはそれを非難する前に、この点での相互作用のプロセスは非難に検出飢餓を逃れることができますが、正確に再キューイング状況の過程における飢餓の存在であるが、それは非常に怖がっていた場合ので、式の意義、そして私は作者に尋ねるのを恐れている、彼は間違っている誰が、明確な回答をも難しいのですか?Oでの間違ったでは(1)スケジューラの設計は、基本的にO(1)スケジューラのみプロセスの利点に選択口座に、プロセスが増加した後、プロセスの複雑な性質と、すべてがコントロール、選択プロセス、挿入工程、およびプロセス外となりますチームとそうでは、ファーストクラスのデザインです 時間の複雑さはO(1)非常に複雑に縮小されますが、スケジュールはちょうどチーム、チーム、選択しないことを知っている、そして、もう一つは、公平性を確保することである、といえOは(すべてが、トレードオフであります選択中1)スケジューラ、チームは、チームは公正の観点から、それを補うためにバインドされている、素晴らしいを行っている、平等なので、保証メカニズムO(1)スケジューラとその複雑と不和は、完璧なソリューションをCFSこのすべて、CFSは赤黒木の統計的性質の使用、効果は非常に棒であり、それはまた、プロセスが実行されていない考慮して、仮想時間の時間に後方に実行している仮想プロセスと、これらのプロセスは常に前進し、スケジューラの合計、実行されている最も下位のプロセスを選択することがOのチームで、チームの様相(1)ではないが、CFSを行い、バランスされたそれはすべての時間の期間内に、システムのスケジューリングソリューションで起こった、素晴らしいですまあ、しかし全体的に、それは非常に効率的な、非常に調和のとれたです。テキストは不明で表現された場合は、次のチャートを見てみましょう。

実クロックペース

プロセス1(重量1)仮想クロックペース

工程2(2のべき乗)仮想クロックペース

プロセス3(重さ3)仮想クロックペース

1/6

2/6

0

0

2/6

2/6

1/6

0

3/6

2/6

1/6

1/9

4/6

2/6

1/6

2/9(vruntime依然として最小、プロセスはまだ3を実行しています)

5/6

2/6

2/6

2/9

6/6

2/6

2/6

3/9

7/6

4/6

2/6

3/9

8/6

4/6

3/6

3/9

9/6

4/6

3/6

4/9

10/6

4/6

3/6

5/9

11/6

4/6

4/6

5/9

12/6

4/6

4/6

6/9

6分の13

6/6

4/6

6/9

6分の14

6/6

5/6

6/9

6分の15

6/6

5/6

7/9

16/6

6/6

5/6

8/9

6分の17

6/6

6/6

8/9

6分の18

6/6

6/6

9/9

 

チャートは、(太字の走行経路に)テーブルの原理の例を1.cfs

表からわかるように、1の重さ、2,2の処理は、3ので、1つのクロック周期内の実リターン内の仮想クロックは、実行中のプロセスの数とその重みがここに比例することを2セットクロックフォワード処理バーチャルとリアルクロックペースは一貫している、それが基準とプロセス2です。

はい、すべてに完璧なソリューションをCFS、それはどのように眠っているプロセスのCFSを補償するのですか?注、CFSは、もはやこの睡眠を区別しないスケジューリング期間のCFSは、プロセスが常にすべてのプロセスを実行するための時間であるのO(1)スケジューラの下でインタラクティブなプロセスを持っていたことを確認することができますので、IOスリープまたは相互作用の睡眠であります彼らが補償する必要があるので、飢餓の恐れがある、との相互作用が遅いダウンを処理することを餓死手段は、今、あなたはこのすべてを必要としませんが、睡眠を補償するためのプロセスのニーズが行われるように、彼らはより緊急のタスクを持っている可能性があるので興味のは、伝統的ですUNIXスケジューラはそうすることで、より一般的な理由はそれは、一般的な精神を目覚めた後優れている、とする必要がありますいくつかの作業を行うことが多い、LinuxのCFSのコードのための補償のプロセスをウェイクアップすることがあります:

IF(sched_feat(NEW_FAIR_SLEEPERS)){

符号なしlong脱穀= sysctl_sched_latency; //これは、スケジューリング期間であります

もし(sched_feat(NORMALIZED_SLEEPER))

THRESH = calc_delta_fair(THRESH、SE); //この補償は、時間保証公平性によって比例的に減少

vruntime - =脱穀; //プロセス補償

}

vruntime = max_vruntime(SE-> vruntime、vruntime); //仮想クロックは戻っていないだろうことを確認

上記のコメントは、それが何であるかを、公正を確保することを意図していますか?それはいくらその重量が補償ランの同じ数が、それだけでは、マルチ実行をn回を保証しなければならないプロセスに目が覚めたことを確認するためにことを確実にするためであり、nは、スケジューリング期間内で実行されている1024の素敵な0プロセスの重みを表し、番号。理由だけではなく、とにかくそれを補うために、プロセスvruntimeを調整目覚め?しないでください!それがある場合、最良の方法は、寝る前にvruntimeにそれを保持することである、長い時間のための睡眠を補うためには、これははるかに少ないvruntime vruntimeその他の特定の現在の実行キュー・プロセスよりも、このプロセスの結果は、ちょうど追いつくために必死に目が覚めました最終結果は公平であるために、CFS、それを待っているすべてのプロセスである、それは他のプロセスにつながる飢餓の長期占領をCPU、物事は睡眠以来、あまりにも絶対にできませんし、補償はありますが、罰がなければなりません、それは元の罰を奪われていますいくつかのvruntimeは、フロントにそれを指示、しかし、すべて奪われていない、それはまだ多くのことを行う必要があり、それはそれは三回までに行い、他のプロセスを飢え、実行回数の増加に対応し、これは、トレードオフ、妥協、飢餓と報酬のトレードオフ。

あなたは理論を見れば、それは簡単です、それはすべてを理解しますが、赤黒木の挿入方法を見出しキーが使用されていないコードvruntimeプロセスを見たときに、しかし、SE-> vruntime必要があります - cfs_rq-> min_vruntime 、どのようにそれを説明するには?私たちは、プロセスが仮想時間増分価値があるので、それは否定できませんのでvruntimeタイプは、、、long型をusigned、その後、long型署名されているキーのタイプを見ているように見えますが、それはそのを持っています上限はこぼした場合は、それがそうならば、何が起こる、ロールバックに0からスタートします、unsigned long型表現できる最大のですか?その結果、このような問題はunsigned charを説明するため、以下の例のように前にカートを置くことになる非常に深刻なああ、次のとおりです。

unsigned char型のA = 251、B = 254。

B + = 5。

//これは、aとbの大きさが決定され

上記の例を見ては、bがbよりはるかに大きく、その結果、ロールバック、実際には、結果が実際の結果をどうやったのか、大きな8よりリアルBすべきですか?次のように置き換え:

unsigned char型のA = 251、B = 254。

B + = 5。

signed char型C = A - 250、D = B - 250。

このサイズ// c、およびdの分析

結果は正しく、この効果を持っているが、長い符号なしオーバーフローの対処ではないかvruntimeのプロセスは、それをタイプ?このアクションのvruntime仮想クロック、およびなしその他の利用を促進することであるので、それは気にしないかもしれないが、それは本当にオーバーフローの問題に対処する、しかし、キーを計算するときのように、赤黒木ケアすることはできませんマイナス最小vruntimeすべての最小vruntimeを取り巻く主要なプロセスのそんなに簡単に追跡するため。Min_vruntimeの役割が実行キューのオーバーフローの問題に対処することで、その主な機能は、赤黒木は、任意の時点で、ほとんどのプロセスの左下に記載されています追跡することです。ケースを発生し、新しいプロセスINSERT見て今、簡単に言えば、それは全体のCFSの進行を遅らせることがあるが加盟のプロセスので、キューを実行し、このプロセスの未来はそれに参加するために適用されるどこ?それがキーに赤黒木でなければならないことは、どのくらいですか?作るためには、新しいプロセスが左下の位置に追加されるべきではなく、場所のほとんどの左下隅になることができますか?高速に実行しますか が実行されているプロセスのほとんどの位置をつかむために同等の根拠がなく、赤黒木vruntime値の現在の最小値をmin_vruntime値は、プロセスを実行して、次の最も価値が与えられているが、生きているようになし、その可能性がありますvruntime現在実行中のプロセスがmin_vruntimeは、それをどのような値、新しいプロセスとして価値vruntimeを追加することで、問題の解決策をmin_vruntimeに基づいており、ありますか?これは、ことは明らかです。

静的U64 sched_vslice(構造体cfs_rq * cfs_rq、構造体sched_entity * SE)

{

戻りcalc_delta_fair(sched_slice(cfs_rq、SE)、SE)。

}

sched_sliceプロセスはSE実クロックを促進すべきであるが、calc_delta_fair仮想クロックを促進すべきである、2の数字を処理するたびに計算し、最終結果は1/6から3工程であり、結果は1/9であり、その手段、これまでに次のものが何であるかを競争する新しいプロセス、から始まり、仮想クロック事前償却、次の仮想クロックは、現在実行中のプロセスがこの時間後に完了しており、競争に参加するための新しいプロセスは、それがありますそう。それ以来、すべてのエンロン。どのように各プロセスでvruntime更新vruntimeで__update_currを見て、実際のクロックコールcalc_delta_fair間隔を使用することで、ここではそれは言うことですsched_slice(cfs_rq、SE)の呼び出しであり、その新しいプロセススケジューラのCFS sched_slice(cfs_rq、SE)が、sched_slice(cfs_rq、SE)を実行してきたが、この新しいプロセスの各ランのための理想的な時間である、いわゆるプレランコミットメントは、プロセス実行sched_slice、後で秤量赤黒木にプラグインできるようになります、すべてのプロセスが、公平になるように、一貫した仮想クロックされているプロセスは不公平sched_slice後に実行を生産する場合にのみ、不公平が実際にのみ発生したことを意味し、CFSスケジューラーは、これを補うために、補償されるべき最も補償に行きます考え、物事は実際に、スケジューリング後sched_sliceを実行するプロセスの正常な動作が発生する、起こり、その後、スケジュールの前に、チームのプロセスに現在のプロセスであるpick_next_task、そのキーの値によってput_prev_taskスケジュールが存在します不公平なトレードオフの後で定義するmin_vruntime差vruntimeとcfs_rq、秤量される前に、あるスケジューリング対象の前工程で言って、それがチームの中になければなりません、新しいプロセスが挿入される前に、チームへの事前のコミットメント、後に部屋への唯一のチームは、スケジューラが実行されているのプロセスを考えることを約束したCFS 、どのくらいの実行?現在、それはsched_sliceで、スケジューラは、CFSを比較検討することを可能にするのに十分な時間を実行しています

飢餓の問題でCFSの外観キー値として直接使用vruntime、CFSの理論は何の飢餓が発生していないことを確認することができますが、キーは2つの等しく増分の値との差を計算する場合、どのようにそれは素晴らしい一度そのキープロセスを保証することができますし、 vruntime時間が比較的大きいが、プロセスの2つの値の間の比較的小さな違いは、キューをジャンプしますか?同じmin_vruntimeを使用して、挿入プロセス時に、覚えて、このすべてを停止するだけで、このmin_vruntimeタイムリーな更新および正規化プロセスであるので、同じ値を減算することによって発見され、同じ大きさの関係、および最終的にこれは、次のスニペットでは、飢餓につながることはありません。

一方、(*リンク){

親= *リンク。

エントリ= rb_entry(親、構造体sched_entity、run_node)。

IF(キー<entity_key(cfs_rq、エントリ)){

...

}

システムスケジューリングサイクルCFSスケジューラは、デスクトップシステム用に構成することができ、20msのですが、その、最も重要なのではなく、性能よりも応答があり、そのため非常に少ないスケジューリング期間は、に対応できるサーバーの、最大のディスパッチ1秒までの期間。

公開された158元の記事 ウォンの賞賛115 ビュー370 000 +

おすすめ

転載: blog.csdn.net/yiyeguzhou100/article/details/103935947