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

概要


名前説明
MAX_RT_PRIO100Real Time 最大優先度
MAX_USER_RT_PRIO100ユーザ Real Time 最大優先度
MAX_PRIO140最大優先度
USER_PRIO(p)((p)-MAX_RT_PRIO)ユーザ優先度
MAX_USER_PRIO40最大ユーザ優先度
PRIO_BONUS_RATIO25優先度ボーナス
MAX_BONUS10最大ボーナス
DEF_TIMESLICE100デフォルトタイムスライス
MAX_SLEEP_AVG1000最大スリープの平均時間
NS_MAX_SLEEP_AVG(JIFFIES_TO_NS(MAX_SLEEP_AVG))最大スリープの平均時間(jiffies)

  • USER_PRIO
    • ユーザ優先度:0〜39
  • nice
    • プロセスの実行優先度): -20(優先度高)〜19
  • MAX_PRIO: 0〜139
    • リアルタイム:0〜99、その他:100〜139
    • システムの最大プライオリティで、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
    • それぞれ、プロセスの最小もしくは最大のタイムスライス (クォンタム) です。

引数

  • p--
  • now--

実装

static void recalc_task_prio(task_t *p, unsigned long long now) {

	unsigned long long __sleep_time = now - p->timestamp;
  • スリープしていた時間を算出
	unsigned long sleep_time;
	if (__sleep_time > NS_MAX_SLEEP_AVG)
		sleep_time = NS_MAX_SLEEP_AVG;
	else
		sleep_time = (unsigned long)__sleep_time;
  • (now - p->timestamp)とNS_MAX_SLEEP_AVGの小さい方をsleep_time設定する
	if (likely(sleep_time > 0)) {
		/*
		 * User tasks that sleep a long time are categorised as
		 * idle and will get just interactive status to stay active &
		 * prevent them suddenly becoming cpu hogs and starving
		 * other processes.
		 */
		if (p->mm && p->activated != -1 &&
			sleep_time > INTERACTIVE_SLEEP(p)) {
				p->sleep_avg = JIFFIES_TO_NS(MAX_SLEEP_AVG -
						DEF_TIMESLICE);
  • カーネルスレッドは固有のメモリ空間を持たないので常にp->mm==NULLとなる
  • (p->activated != -1)はTASK_UNINTERRUPTIBLE状態からのタスクpが起床したわけではないことを意味する
  • 詳細はINTERACTIVE_SLEEP()/linux2.6を参照
  • 引数の値をナノ秒に変換する
				if (!HIGH_CREDIT(p))
					p->interactive_credit++;
		} else {
			/*
			 * The lower the sleep avg a task has the more
			 * rapidly it will rise with sleep time.
			 */
			sleep_time *= (MAX_BONUS - CURRENT_BONUS(p)) ? : 1;
			/*
			 * Tasks with low interactive_credit are limited to
			 * one timeslice worth of sleep avg bonus.
			 */
			if (LOW_CREDIT(p) &&
			    sleep_time > JIFFIES_TO_NS(task_timeslice(p)))
				sleep_time = JIFFIES_TO_NS(task_timeslice(p));
			/*
			 * Non high_credit tasks waking from uninterruptible
			 * sleep are limited in their sleep_avg rise as they
			 * are likely to be cpu hogs waiting on I/O
			 */
			if (p->activated == -1 && !HIGH_CREDIT(p) && p->mm) {
				if (p->sleep_avg >= INTERACTIVE_SLEEP(p))
					sleep_time = 0;
				else if (p->sleep_avg + sleep_time >=
						INTERACTIVE_SLEEP(p)) {
					p->sleep_avg = INTERACTIVE_SLEEP(p);
					sleep_time = 0;
				}
			}
			/*
			 * This code gives a bonus to interactive tasks.
			 *
			 * The boost works by updating the 'average sleep time'
			 * value here, based on ->timestamp. The more time a
			 * task spends sleeping, the higher the average gets -
			 * and the higher the priority boost gets as well.
			 */
			p->sleep_avg += sleep_time;
			if (p->sleep_avg > NS_MAX_SLEEP_AVG) {
  • タスクのsleep_avg(スリープしていた時間)が最大スリープ時間より大きい場合
				p->sleep_avg = NS_MAX_SLEEP_AVG;
				if (!HIGH_CREDIT(p))
					p->interactive_credit++;
  • 対話クレジット値がリミットを越えているか調べる
			}
		}
	}
	p->prio = effective_prio(p);

}

呼出元


履歴

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

コメント



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