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

概要

  • linux2.6/kernel/sched.cにて定義
  • 引数で渡されたタスクに引数で渡されたnice値を設定し、必要であれば再スケジュールを行う

引数

実装

void set_user_nice(task_t *p, long nice) {

	unsigned long flags;
	prio_array_t *array;
	runqueue_t *rq;
  • ランキュー(activeキューとexpiredキューの組。CPUごとに用意される。)
	int old_prio, new_prio, delta;
	if (TASK_NICE(p) == nice || nice < -20 || nice > 19)
		return;
  • 引数で渡されたタスクのnice値が適切でないか、これから設定しようとしているnice値と同じである場合は終了
    • nice値(プロセスの実行優先度)は-20(優先度高)〜19までである
  • タスクpの固定優先度をnice値(プロセスの実行優先度)へ変換し返す
	/*
	 * We have to be careful, if called from sys_setpriority(),
	 * the task might be in the middle of scheduling on another CPU.
	 */
	rq = task_rq_lock(p, &flags);
  • タスクpにマッピングされたCPUのランキューのロックを取得する
	/*
	 * The RT priorities are set via setscheduler(), but we still
	 * allow the 'normal' nice value to be set - but as expected
	 * it wont have any effect on scheduling until the task is
	 * not SCHED_NORMAL:
	 */
	if (rt_task(p)) {
  • リアルタイムタスクか調べる
    • リアルタイムタスクだと1を返す
    • リアルタイムタスクでは無い場合0を返す
    • 詳細はrt_task()/linux2.6を参照
		p->static_prio = NICE_TO_PRIO(nice); 
		goto out_unlock;
	}
	array = p->array;
	if (array)
		dequeue_task(p, array);
	old_prio = p->prio;
	new_prio = NICE_TO_PRIO(nice);
	delta = new_prio - old_prio;
	p->static_prio = NICE_TO_PRIO(nice);
	p->prio += delta;
	if (array) {
		enqueue_task(p, array); 
		/*
		 * If the task increased its priority or is running and
		 * lowered its priority, then reschedule its CPU:
		 */
		if (delta < 0 || (delta > 0 && task_running(rq, p)))
			resched_task(rq->curr);
  • ランキューrqにおいてタスクpが現在実行中であるか調べる
  • ローカルAPICのフラグを調査&設定し、必要であればタスクrq->currのCPUに対してプロセッサ間通信(IPI)を行い再スケジュールを要求する
	}

out_unlock:

	task_rq_unlock(rq, &flags);
  • ランキューrqのロックをアンロックし、可能であればプリエンプションする

}

EXPORT_SYMBOL(set_user_nice);

呼出元


履歴

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

コメント



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