このページを編集する際は、編集に関する方針に従ってください。

概要

  • kernel/sched.cにて定義
  • ランキューへタスクを移動し、優先度の再計算をする。
    • タスクのスケジューリングの統計情報を更新する(SLEEP平均計算、優先度修飾子など)

引数

  • p--タスクディスクリプタ
  • rq--タスクの移動先のランキュー(移動元のランキューは現在使用中のCPUのランキュー(this_rqで表現される))
  • local--タスクの移動先と移動元が同じであるか
    • 1だと同じ、0だと異なる

実装

/*

* activate_task - move a task to the runqueue and do priority recalculation
*
* Update all the scheduling statistics stuff. (sleep average
* calculation, priority modifiers, etc.)
*/

static void activate_task(task_t *p, runqueue_t *rq, int local) {

	unsigned long long now;
	now = sched_clock();

#ifdef CONFIG_SMP

	if (!local) {
  • タスクの移動先と移動元が異なる場合
		/* Compensate for drifting sched_clock */
		runqueue_t *this_rq = this_rq();
		now = (now - this_rq->timestamp_last_tick)
			+ rq->timestamp_last_tick;
	}

#endif

	recalc_task_prio(p, now);
	/*
	 * This checks to make sure it's not an uninterruptible task
	 * that is now waking up.
	 */
	if (!p->activated) {
		/*
		 * Tasks which were woken up by interrupts (ie. hw events)
		 * are most likely of interactive nature. So we give them
		 * the credit of extending their sleep time to the period
		 * of time they spend on the runqueue, waiting for execution
		 * on a CPU, first time around:
		 */
		if (in_interrupt())
			p->activated = 2;
  • TASK_INTERRUPTIBLE状態からの起床。割り込み処理が起床要求を出した
		else {
			/*
			 * Normal first-time wakeups get a credit too for
			 * on-runqueue time, but it will be weighted down:
			 */
			p->activated = 1;
  • TASK_INTERRUPTIBLE状態からの起床。プロセスが起床要求を出した
		}
  • in_interrupt() は irq_count() と定義されている
  • ソフトウェア割り込み、またはハードウェア割り込みが禁止された回数を返す
	}
	p->timestamp = now;
	__activate_task(p, rq);

}

呼出元


履歴

  • 作者:ひら
  • 日付:2005/2/24
  • 対象:2.6.10
    更新日更新者更新内容

コメント



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-24 (火) 07:10:51 (3129d)