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

概要

  • linux2.6/kernel/sched.cにて定義
  • 引数で渡されたプロセスIDに対応するタスクを、引数で渡されたCPUマスクに基づき特定のCPUへくくりつける(特定のCPUのスケジューラ構造体へ移動させる)
    • 正常に処理が行われた場合は0を返す

引数

  • pid--プロセスID
  • new_mask--CPUマスク(くくりつけたいCPU情報を保持)

実装

long sched_setaffinity(pid_t pid, cpumask_t new_mask) {

	task_t *p;
	int retval;
	lock_cpu_hotplug();
	read_lock(&tasklist_lock);
  • プリエンプティブを不可にし、読み込み用ロックtasklist_lockの取得を試みる
    • ロックの取得に失敗した場合は待ち状態に入る
    • 詳細はread_lock()/linux2.6を参照
	p = find_process_by_pid(pid);
  • プロセスID pidに対応するタスクを返す
    • プロセスIDがNULLならカレントプロセスを返す
    • タスクが見つからない場合はNULLを返す
    • 詳細はfind_process_by_pid()/linux2.6を参照
	if (!p) {
		read_unlock(&tasklist_lock);
  • 読み込みロックtasklist_lockを解放した後、プリエンプション機能を有効にし可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する
		unlock_cpu_hotplug();
		return -ESRCH;
	}
	/*
	 * It is not safe to call set_cpus_allowed with the
	 * tasklist_lock held.  We will bump the task_struct's
	 * usage count and then drop tasklist_lock.
	 */
	get_task_struct(p);
	read_unlock(&tasklist_lock);
  • 読み込みロックtasklist_lockを解放した後、プリエンプション機能を有効にし可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する
	retval = -EPERM;
	if ((current->euid != p->euid) && (current->euid != p->uid) &&
			!capable(CAP_SYS_NICE))
		goto out_unlock;
  • ケーパビリティCAP_SYS_NICEがカレントタスクで設定されている場合は1を返す
  • CAP_SYS_NICEはnice()とsetpriority()システムコール利用制限を外す。またリアルタイムプロセスの生成を可能を意味する
	retval = set_cpus_allowed(p, new_mask);
  • タスクpをCPUマスクnew_maskに基づき特定のCPUへ移動させる

out_unlock:

	put_task_struct(p);
  • タスクpが使用されているか調べ、使用されていない場合は、そのタスクに通知を行い、通知が失敗した場合はそのタスクを解放する
	unlock_cpu_hotplug();
	return retval;

}

呼出元


履歴

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

コメント/タグ?



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