Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxプロセススケジューリングにおけるキューの使用

Linuxプロセススケジューリングにおけるキューの使用

  
Linuxカーネルは、プロセススケジューリングにおけるいくつかのアプリケーションを示すためだけに、多数のキューを使用します。 Linuxカーネルのキューは二重リンクリストの形式で接続されていますinclude /linux /list.hはキューを定義し、いくつかのインターフェースを提供します詳細については、 [1]
の付録を参照してください。

Linuxの過程で、以下の主な状態があります。

プロセスステータス


説明


TASK_RUNNING

プロセスは実行中または実行予定です。

TASK_INTERRUPTIBLE

プロセスはスリープ状態です。条件の完了を待っています。

TASK_UNINTERRUPTIBLE

ディープスリープ、シグナルに邪魔されません。

TASK_STOPPED

実行中のプロセスが停止しました。

TASK_TRACED

プロセスはデバッガによって停止され、別のプロセスによって追跡されます。

二つの追加の状態がEXIT_ZOMBIEとEXIT_DEADあり、それは死んだ状態や死の本当の進歩を表しています。デッド状態にあるプロセスは、その親プロセスの採用を待ち(そうでなければinitプロセスによって採用されます)、実際にデッド状態にあるプロセスは直接削除されます。
ログイン状態TASK_RUNNINGプロセスが実行キュー(実行キュー)内に配置され、これはtask_structによるものである(で定義されているが/リナックス/sched.hを含む)run_listメンバーリンクへ。ただし、カーネルがその都度最適な優先順位プロセスを選択するために、Linuxは優先順位ごとにキューを作成します。;でbitmap_size] unsigned long型のビットマップを
;
ログイン構造体prio_array {
INT nr_active:これは、以下のように構造体、カーネル/sched.cで定義さprio_array、構造体prio_arrayによって達成されます。 >構造体LIST_HEADキュー[MAX_PRIO];
};
ログインキューはキュー部材アレイ。各CPUには独自のランキューがあり、各ランキューには2つのprio_arraysがあります。1つはアクティブキュー用、もう1つは時間が枯渇したキュー用です。実行キューが空になると、カーネルは2つのキューのポインタを交換し、元の排気キューが新しいアクティブキューになります。これとprio_array内のビットマップは、スケジューリングアルゴリズムをO(1)として決定するための鍵です。
ステータスプロセスTASK_STOPPED、EXIT_ZOMBIEまたはEXIT_DEAD
特別なキューに置かれていない、彼らは直接PIDまたは親プロセスキューの子を介してアクセスされています。 TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE状態を
し、待ちキューに配置されます
プロセス。違いは、各待機イベントに待機キューがあることです。キュー内のプロセスは、同じイベントの完了を待機します。 (イベント - 動的なプロセスです。特定の構造体を通して「イベント」を定義するのは簡単ではありません。ここでイベントを待つことは、フラグ変数が真であるかどうかなど、条件が真であるかどうかを確認することです。)wait_queue_head_t wait_queue_head_t;で
のtypedef構造体_ _wait_queue_head {;
構造体LIST_HEAD task_list
ログインspinlock_tロック}次のように/のlinux /wait.hを含んで定義されます次のようにwait_queue_t定義:
ログインのtypedef構造体_ _wait_queue {
unsigned int型フラグ、
構造体task_struct *タスク;
wait_queue_func_t FUNC;
構造体LIST_HEAD task_list;
} wait_queue_t。

インタフェースの待機状態に2つのタイプがあります。
ログインprepare_to_wait *()/finish_wait()
wait_event *()

事実wait_event *()呼び出しの内部でPrepare_to_wait *()、ループに入れるそしてwait_event *()はイベントが完了すると自動的にfinish_wait()を呼び出します。状況に応じてどちらを使用するかを決定してください。 (sleep_on *()は放棄されたインタフェースで、これもサポートされていますが、使用されなくなりました。)キュー内で待機しているプロセスには、排他的プロセスと非排他的プロセスの2種類があります。いわゆる排他的とは、ウェイクアッププロセスを待機しているリソースが相互に排他的であり、一度に1つだけウェイクアップすることを意味します(ウェイクアップの倍数。ただし最後には1つだけウェイクアップされ、残りは再び待機キューに追加されます)。大割引)。一般に、wait関数はプロセスを非排他的かつ割り込み不可に設定し、 "interruptible"は特に割り込み可能として状態を指定し、 "timeout"は'を指定してschedule_timeout();を呼び出すため、タイムアウト後に終了します。 Exclusive'はプロセスをExclusiveに設定します。のみWAKE_UP *()、しかし、それはまた、いくつかの内部に分かれているが、インターフェースの

ウェイク、。 「割り込み可能」のウェイクアップ関数は、TASK_INTERRUPTIBLEとTASK_UNINTERRUPTIBLEをウェイクアップするプロセスなしで、状態がTASK_INTERRUPTIBLEであるプロセスのみをウェイクアップします;すべてのウェイクアップ関数は、同じイベントを待っているすべての非排他プロセスをウェイクアップしますプロセスは起動し、 "nr"を指定すると指定された数の排他プロセスを起動し、 "all"を指定するとすべての排他プロセスを起動します。 「同期」は優先度のチェックを無視するため、優先度の高いプロセスが遅れることがあります。最後に、スピンロックを保持しているときにはwait_up_locked()のみを呼び出すことができます。

Linuxカーネルのプロセス管理が最も重要な部分であり、その性能はほとんど直接で、デザインと非常に複雑なアルゴリズムを使用することのいくつかを、カーネルの品質を決定します。これは単にその中でキューを使用することを紹介するためのものであり、さらなる調査はまだ検討中です。

Copyright © Windowsの知識 All Rights Reserved