プリエンプティブスケジューリングプリエンプティブスケジューリングのlinux

Linuxのプリエンプティブスケジューリング

なぜスケジューリングが起こるのだろうか?
 
CPUが限られており、オペレーティングシステム上のプロセスの多くので、オペレーティングシステムは、各プロセスの実行中の時間のバランスを取る必要があります
例えば、いくつか実行している時間が長いプロセスであった、と長い時間のためにCPUを占有しており、この時のオペレーティングシステムでは、公平であるために
実行する必要があるプロセスに置き換えられます。
 
例えば
 
同社は一つだけ、多くの人が並んであり、誰かが水のガラスを引き継ぐ飲料水へのアクセスに使用されると離れて水のガラス、水のグラスの接続は、同社の担当者が来て、この時間の多くは、この男を取りました
人はその後、水を取り替えたが、今回はボスが水を取りに来て、次の人を選ぶために、この時間があるため何の、水の所有者ではなく、人々のキューのバックですか?彼は、とてもタフなボスであるため、
 
これは、ディスペンサーの内部にあるCPUであります
人事のオペレーティングシステムであり、
水や他の従業員を取ることはプロセスであり、
 
リアルタイムプロセスにおける対応するオペレーティングシステムのボス
オペレーティングシステムの通常のプロセスに対応する通常の従業員
 
通常のプロセスよりも高い優先度である優先順位リアルタイムのプロセス・オペレーティング・システム、
だから、次の選択プロセスにおけるオペレーティングシステムは、プロセス内でリアルタイムプロセスキューを優先させて頂きます
リアルタイムプロセスには、プロセスが存在しない場合を除き、この時間は、通常のプロセスを歩ん
 
 
人事のようなオペレーティングシステム、資源の公平なスケジューリングと割り当てを必要とし、当然のことながら、多くの会社のボス、ああ、ああ、リーダーシップああのゼネラルマネージャーであります
これらの人々は、すべての割り当てられたリソースは、これらのボスの指導者を優先する権限を持っている、これは正常です、それは他の人を聞かせてボスであります
 
 
 
ここでは何プリエンプティブスケジューリング
 
それは何が起こるかの状況下ではプリエンプティブスケジューリング?
最も一般的な現象は、あなたがあまりにも長いプロセスを実行することで、他のプロセスに切り替えることであるとき、
 
しかし、オペレーティングシステムがどのようにそれを実行している時間をカウントするには?
 
コンピュータのクロックの概念、時間の期間にわたって、それぞれ、コンピュータはオペレーティングシステムに通知されます、オペレーティングシステムに指示する、いくつかの時間は、現在の時間を実行しているプロセスを実行すると、長すぎるではない、あなたが行くと見、今回のオペレーティングシステムに合格しましたこのプロセスに従事します。
 
オペレーティングシステムでは、各プロセスのための可変の理想的な実行時間を有し、仮想ランタイムと実際の実行時間と重み(優先度)に存在相当します。
 
これらの3つはそれを行う必要がありますか?
 
仮想ランタイムvruntime + =実際の走行時間delta_exec * NICE_0_LOAD /重量(優先順位)
 
あなたはあまり考えられている仮想ランタイム優先度の低いプロセスに、より少ないと考えられている仮想ランタイム優先度の高いプロセスのうち、この式で見ますが、オペレーティングシステムは、次の処理を選択した場合、または仮想ランタイムを選択するときにすることができます最小限の処理は、その優先順位に存在現れます。
 
プロセスが実行されている場合、このプロセスの仮想実行時間は、プロセスが実行されていない場合、仮想時間が増加しない、増加します
実際には、これはコンセプトスケジューラを伴います。
 
ここでは、単に一般的な戦略のために絶対に公平なスケジューリングプロセスを言います
 
次のプロセスを選択するこの戦略は、それを選択する方法ですか?
彼は、少なくともあなたがそう公正であるために、CPU時間で撮影しているので、私たちはあなたのCPU上で実行されているこのプロセスを選択する必要があり、これは十分に理解されるべきで、少なくとも時間を実行して、現在のプロセスのすべての通常のプロセスを選択することです。
 
それは赤黒木吊り多くのプロセス上にある、赤黒木は平衡二分木である、赤黒木にオペレーティング・システムを維持し、処理は左端実行最小の時間経過である、すべてのオペレーティングシステム、次を選択一番左の赤黒木のプロセスを選択しますプロセス。
 
静的な無効
check_preempt_tick(構造体cfs_rq * cfs_rq、構造体sched_entityの*のCURR)
{
unsigned long型ideal_runtime、delta_exec。
構造体sched_entity * SE。
S64参加。
 
 
ideal_runtime = sched_slice(cfs_rq、CURR)。
delta_exec = curr-> sum_exec_runtime - curr-> prev_sum_exec_runtime。
IF(delta_exec> ideal_runtime){
resched_curr(rq_of(cfs_rq))。
返します。
}
......
SE = __pick_first_entity(cfs_rq)。
デルタ= curr-> vruntime - SE-> vruntime。
(デルタ<0)の場合
返します。
もし(デルタ> ideal_runtime)
resched_curr(rq_of(cfs_rq))。
}
 
上記のコードはLinuxのソースコードです
 
オペレーティングシステムにおける時間の概念があり、あること、スケジューリング期間における実際の時間は、このプロセスは、(ideal_runtime)実行する必要があります
実際の時間sum_exec_runtimeは、プロセスが既に占有予定されている前回の実際の時間を指しprev_sum_exec_runtime、全体の実装のプロセスを意味します。
 
そのSE-> prev_sum_exec_runtime = SE-> sum_exec_runtimeを置く新しいプロセスをスケジュールするたびに、そのsum_exec_runtime-prev_sum_exec_runtime
スケジュールは、実際の時間で占められています。この時間はideal_runtimeよりも大きい場合は、それが押収されなければなりません。
 
この条件に加えても_pick_first_entityを通じて最小過程で赤黒木を取り除きます。vruntime現在のプロセス(仮想ランタイム)は赤黒木vruntime最小のプロセスよりも大きく、その差がideal_timeより大きい場合、それは必要がある場合
彼が押収されました
 
彼らは、このプロセスは、直接ではなく、彼にTixia屈原を押収したが、このプロセスのラベルTIF_NEED_RESCHEDを演奏しなければならない見つけた場合、このプロセスはつかむにマークすることができます
 
起こる可能性のプリエンプションのシナリオは、プロセスが休眠覚醒されるべきときであることもあります
これは、現在実行中のプロセスよりも高い優先度ウェイクアップ・プロセスの場合、この時間は、あなたはまた、現在実行中のプロセスにラベルTIF_NEED_RESCHEDを再生している、押収されなければなりません
 
チャンスをつかみます
 
1.利用者の状態がチャンスをつかむにします
ときにシステムコールは、タグ、プリエンプションがTIF_NEED_RESCHED場合、プロセスは判断した場合、モードをカーネルにユーザモードから処理を戻します。
 
2.機会カーネルモードをつかみます
カーネルモードで実行、一般差し替えタイミングで()preempt_enable起こります。
preempt_disable()閉じるプリエンプション
開いたときに、カーネルモードの実装では、いくつかの操作は(常に最初の呼び出しのpreempt_disable、すべてのこれらの操作を行う前に、中断することはできません)をつかむ閉じて、再び、とき)(preempt_enable呼びかけています
カーネルモードのコードをつかむための機会です。
 
割り込みリターンは、リターンはまだコアな態度であるとき、カーネルモードの場合は、中断が発生します。また、これは実行する機会をつかむための時間です。
 
私たちは理解して、この絵を見ることができます

おすすめ

転載: www.cnblogs.com/Leo_wl/p/10993731.html