Linux Kernel 2.6 Documentation:
/usr/src/linux/Documentation/scheduler/sched-coding.txt
scheduler/sched-coding.txt
O(1) スケジューラの様々なスケジューラ関連メソッドのリファレンス
[プレインテキスト版]
- 原著作者: Robert Love <rml@tech9.net>, MontaVista Software
- 翻訳者: 川崎 貴彦 <takahiko(a)hakubi.co.jp>
- バージョン: 2.6.3
- 翻訳日時: 2004/01/29
O(1) スケジューラの様々なスケジューラ関連メソッドのリファレンス
Robert Love <rml@tech9.net>, MontaVista Software
設計により、これらのメソッドのほとんどは kernel/sched.c 内でローカルとなって
いますので注意してください。スケジューラは自己完結型で、切り離されているもの
なのです。このドキュメントの第一目的はスケジューラを理解することであり、スケ
ジューラへのインターフェースを紹介することではありません。とは言うものの、説明
しているインターフェースのうちの幾つかは、汎用的なプロセス/スケジューリング・
メソッドです。大抵のメソッドは include/linux/sched.h で定義されています。
主要なスケジューリングメソッド
------------------------------
void load_balance(runqueue_t *this_rq, int idle)
CPU 使用量を均衡化させるため、必要があれば、タスク群を一つの CPU から
他の CPU へ移動させようと試みます。このメソッドは、runqueue が不均衡に
なっている場合に、もしくはタイマティックによって定期的に、明示的に呼び
出されます。呼出しに先立って、現在の runqueue をロックし、割込みを
無効にする必要があります。
void schedule()
メインのスケジューリング関数です。関数から戻るとき、最も優先度の高い
プロセスがアクティブになります。
ロック
------
各 runqueue はそれぞれのロックを rq->lock に保持しています。複数の runqueue を
ロックする必要がある場合は、&runqueue 値の昇順でロックを獲得していかなければ
なりません。
特定の runqueue のロックは
task_rq_lock(task_t pid, unsigned long *flags)
でおこないます。この関数は、プリエンプションと割込みを無効にし、pid が動作
している runqueue をロックします。同様に、
task_rq_unlock(task_t pid, unsigned long *flags)
は pid が動作している runqueue のロックを解除し、割込みを以前の状態に戻し、
プリエンプションを再度有効にします。
関数
double_rq_lock(runqueue_t *rq1, runqueue_t *rq2)
と関数
double_rq_unlock(runqueue_t *rq1, runqueue_t *rq2)
はそれぞれ、指定された二つの runqueue を安全にロック及びロック解除します。
しかしながら、これらのルーチンでは割込みの無効化や復元をおこないません。
これらのルーチンの使用前と使用後にユーザが手作業でおこなう必要があります。
値
--
MAX_PRIO
システムの最大プライオリティで、task->prio としてタスクに格納されて
います。プライオリティが低いものほど値が大きくなります。通常の (リアル
タイムではない) プライオリティの範囲は MAX_RT_PRIO から (MAX_PRIO - 1)
までです。
MAX_RT_PRIO
システムの最大リアルタイム・プライオリティ値です。有効なリアルタイム・
プライオリティの範囲は 0 から (MAX_RT_PRIO - 1) までです。
MAX_USER_RT_PRIO
ユーザ空間にエクスポートされる最大リアルタイム・プライオリティです。
常に MAX_RT_PRIO 以下でなければなりません。値を MAX_RT_PRIO よりも
小さく設定すれば、ユーザ空間のどのタスクよりもプライオリティの高い
カーネルスレッドを作ることが可能となります。
MIN_TIMESLICE
MAX_TIMESLICE
それぞれ、プロセスの最小もしくは最大のタイムスライス (クアンタ) です。
データ
------
struct runqueue
CPU 毎のメインの runqueue データ構造体です。
struct task_struct
プロセス毎のメインのデータ構造体です。
汎用メソッド
------------
cpu_rq(cpu)
指定された CPU の runqueue を返します。
this_rq()
現在の CPU の runqueue を返します。
task_rq(pid)
指定された pid を保持する runqueue を返します。
cpu_curr(cpu)
指定された CPU 上で現在動作中のタスクを返します。
rt_task(pid)
pid がリアルタイムならば真を、そうでなければ偽を返します。
プロセス制御メソッド
--------------------
void set_user_nice(task_t *p, long nice)
タスク p の nice 値を指定された値にセットします。
int setscheduler(pid_t pid, int policy, struct sched_param *param)
指定された pid のスケジューリング・ポリシーとスケジューリング・
パラメータをセットします。
int set_cpus_allowed(task_t *p, unsigned long new_mask)
指定されたタスクの CPU affinity (親和度) をセットし、適切な CPU へと
移行させます。呼出し元は、タスクへの有効な参照を保持し、そのタスクが
途中で exit しないことを保証しておかなければなりません。呼出しのあいだ、
ロックを保持することはできません。
set_task_state(tsk, state_value)
タスクの状態を指定された値にセットします。
set_current_state(state_value)
現在のタスクの状態を指定された値にセットします。
void set_tsk_need_resched(struct task_struct *tsk)
指定されたタスクの need_resched をセットします。
void clear_tsk_need_resched(struct task_struct *tsk)
指定されたタスクの need_resched をクリアします。
void set_need_resched()
現在のタスクの need_resched をセットします。
void clear_need_resched()
現在のタスクの need_resched をクリアします。
int need_resched()
現在のタスクの need_resched がセットされていれば真を、そうでなければ
偽を返します。
yield()
現在のプロセスを runqueue の末尾に置き、schedule を呼出します。
------------------------------------------------------------
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳者: 川崎 貴彦 < takahiko(a)hakubi.co.jp >
翻訳日: 2004/01/29
校正者: 小林 雅典 < zap03216(a)nifty.ne.jp >
Linux カーネル 2.6 付属文書一覧へ戻る