JF Linux Kernel 3.x/2.6 Documentation: /usr/src/linux/Documentation/scheduler/sched-coding.txt

scheduler/sched-coding.txt

O(1) スケジューラの様々なスケジューラ関連メソッドのリファレンス [プレインテキスト版]


        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 カーネル 3.x/2.6 付属文書一覧へ戻る