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

概要

  • linux2.6/kernel/sys.cにて定義
  • 引数で渡されたプロセスIDに対応するプロセスの引数で渡された対象の優先度へ値を設定する

引数

  • which--優先度を設定する対象
    対象説明
    PRIO_PROCESS0プロセスの優先度
    PRIO_PGRP1プロセス・グループの優先度
    PRIO_USER2ユーザの優先度
  • who--対象となるプロセスID
  • niceval--設定するnice値

実装

asmlinkage long sys_setpriority(int which, int who, int niceval) {

	struct task_struct *g, *p;
	struct user_struct *user;
	int error = -EINVAL;
	if (which > 2 || which < 0)
		goto out;
	/* normalize: avoid signed division (rounding problems) */
	error = -ESRCH;
	if (niceval < -20)
		niceval = -20;
	if (niceval > 19)
		niceval = 19;
	read_lock(&tasklist_lock);
  • プリエンプティブを不可にし、読み込み用ロックtasklist_lockの取得を試みる
    • ロックの取得に失敗した場合は待ち状態に入る
    • 詳細はread_lock()/linux2.6を参照
	switch (which) {
		case PRIO_PROCESS:
  • プロセスの優先度を設定する:
			if (!who)
				who = current->pid;
			p = find_task_by_pid(who);
  • プロセスID whoに対応するタスクを返す
			if (p)
				error = set_one_prio(p, niceval, error);
			break;
		case PRIO_PGRP:
  • プロセスグループの優先度を設定する:
			if (!who)
				who = process_group(current);
			do_each_task_pid(who, PIDTYPE_PGID, p) {
				error = set_one_prio(p, niceval, error);
			} while_each_task_pid(who, PIDTYPE_PGID, p);
			break;
		case PRIO_USER:
  • ユーザの優先度を設定する:
			user = current->user;
			if (!who)
				who = current->uid;
			else
				if ((who != current->uid) && !(user = find_user(who)))
					goto out_unlock;	/* No processes for this user */
  • whoから対応するユーザ管理オブジェクトを見つけて返す
			do_each_thread(g, p)
				if (p->uid == who)
					error = set_one_prio(p, niceval, error);
  • タスクリストを走査する
    • 2つのタスクディスクリプタgとpにカレントエントリが設定される
    • 詳細はdo_each_thread()/linux2.6を参照
  • pタスクにnice値nicevalを設定する
			while_each_thread(g, p);
  • 2つのタスクgとpにより、タスクリストが変更された場合はタスクリストの走査を終了する
			if (who != current->uid)
				free_uid(user);		/* For find_user() */
			break;
	}

out_unlock:

	read_unlock(&tasklist_lock);
  • 読み込みロックtasklist_lockを解放した後、プリエンプション機能を有効にし可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する

out:

	return error;

}

呼出元


履歴

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

コメント/タグ?



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-06 (土) 13:41:25 (416d)