O(1) スケジューラの様々なスケジューラ関連メソッドのリファレンス Robert Love , 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 >