名 前
sched_setaffinity, sched_getaffinity − ス レ ッ ド の CPU affinity マ ス ク を 設 定 ・ 取 得 す る
書 式
#define
_GNU_SOURCE /* feature_test_macros(7) 参 照
*/
#include <sched.h>
int
sched_setaffinity(pid_t pid, size_t
cpusetsize,
const cpu_set_t *mask);
int
sched_getaffinity(pid_t pid, size_t
cpusetsize,
cpu_set_t *mask);
説 明
ス レ ッ ド の CPU affinity (親 和 度 ) マ ス ク は 、 そ の ス レ ッ ド が 実 行 を 許 可 さ れ て い る CPU の 集 合 を 決 定 す る 。 マ ル チ プ ロ セ ッ サ シ ス テ ム で は 、 CPU affinity マ ス ク を 設 定 す る こ と で 性 能 上 の メ リ ッ ト を 得 ら れ る 可 能 性 が あ る 。 例 え ば 、 特 定 の ス レ ッ ド を 一 つ の CPU に 括 り 付 け (す な わ ち 、 そ の ス レ ッ ド の affinity マ ス ク を 一 つ の CPU に 設 定 し )、 他 の 全 て の ス レ ッ ド の affinity マ ス ク か ら そ の CPU を 除 外 す る こ と で 、 確 実 に そ の ス レ ッ ド の 実 行 速 度 を 最 大 に す る こ と が で き る 。 ま た 、 あ る ス レ ッ ド の 実 行 を 一 つ の CPU に 限 定 す る こ と で 、 一 つ の CPU で の 実 行 を 停 止 し て か ら 別 の CPU で 実 行 を 再 開 す る と き に 発 生 す る キ ャ ッ シ ュ 無 効 化 (cache invalidation) に よ る 性 能 面 の 劣 化 を 避 け る こ と も で き る 。
CPU affinity マ ス ク は 「 CPU の 集 合 」 を 表 す cpu_set_t 構 造 体 で 表 現 さ れ 、 cpu_set_t へ の ポ イ ン タ ー mask で 指 定 さ れ る 。 CPU 集 合 を 操 作 す る た め の マ ク ロ 群 に つ い て は CPU_SET(3) で 記 載 さ れ て い る 。
sched_setaffinity() は 、 ス レ ッ ド ID が pid の ス レ ッ ド の CPU affinity マ ス ク を mask で 指 定 さ れ た 値 に 設 定 す る 。 pid が 0 の 場 合 、 呼 び 出 し 元 ス レ ッ ド が 使 わ れ る 。 cpusetsize 引 き 数 に は mask が 指 す デ ー タ の 長 さ (バ イ ト 単 位 ) で あ る 。 通 常 は 、 こ の 引 き 数 に は sizeof(cpu_set_t) を 指 定 す れ ば よ い 。
pid で 指 定 さ れ た ス レ ッ ド が mask で 指 定 さ れ た CPU の い ず れ か で 現 在 実 行 さ れ て い な い 場 合 、 そ の ス レ ッ ド は mask で 指 定 さ れ た CPU の い ず れ か に 移 動 さ れ る 。
sched_getaffinity() は 、 ス レ ッ ド ID が pid の ス レ ッ ド の affinity マ ス ク を mask が 指 す cpu_set_t 構 造 体 に 書 き 込 む 。 cpusetsize 引 き 数 に は mask の (バ イ ト 単 位 の ) 大 き さ を 指 定 す る 。
返 り 値
成 功 し た 場 合 、 sched_setaffinity() と sched_getaffinity() は 0 を 返 す 。 エ ラ ー の 場 合 は −1 を 返 し 、 errno を 適 切 に 設 定 す る 。
エ ラ ー
EFAULT 指 定 さ れ た メ モ リ ー 番 地 が 不 正 で あ る 。 |
||
EINVAL シ ス テ ム 上 に 現 在 実 際 に 存 在 し 、 か つ |
"cpuset" 機 構 が 課 す 制 限 に お い |
て そ の ス レ ッ ド に 対 し て 許 可 さ れ て い る プ ロ セ ッ サ が 、 affinity ビ ッ ト マ ス ク mask に 含 ま れ て い な い 。 "cpuset" 機 構 に つ い て は cpuset(7) を 参 照 。
EINVAL |
(sched_getaffinity() と 、 カ ー ネ ル 2.6.9 以 前 の sched_setaffinity()) cpusetsize が カ ー ネ ル で 使 わ れ て い る affinity マ ス ク の サ イ ズ よ り 小 さ い 。 | ||
EPERM |
(sched_setaffinity()) 呼 び 出 し 元 の ス レ ッ ド に 適 切 な 特 権 が な か っ た 。 呼 び 出 し 元 は 、 実 効 ユ ー ザ ー ID が pid で 識 別 さ れ る ス レ ッ ド の 実 ユ ー ザ ー ID ま た は 実 効 ユ ー ザ ー ID と 同 じ で あ る か 、 CAP_SYS_NICE ケ ー パ ビ リ テ ィ (capability) を 持 た な け れ ば な ら な い 。 | ||
ESRCH |
ID が pid の ス レ ッ ド が 見 つ か ら な か っ た 。 |
バ ー ジ ョ ン
CPU affinity シ ス テ ム コ ー ル は Linux kernel 2.5.8 で 導 入 さ れ た 。 こ れ ら の シ ス テ ム コ ー ル の ラ ッ パ ー 関 数 は glibc 2.3 で 導 入 さ れ た 。 最 初 は 、 glibc の イ ン タ ー フ ェ ー ス に は unsigned int 型 の cpusetsize 引 き 数 が 入 っ て い た 。 glibc 2.3.3 で は cpusetsize 引 き 数 が 削 除 さ れ た が 、 glibc 2.3.4 で size_t 型 で 復 活 し た 。
準 拠
こ れ ら の シ ス テ ム コ ー ル は Linux 固 有 で あ る 。
注 意
sched_setaffinity() を 呼 び 出 し た 後 は 、 ス レ ッ ド が 実 際 に 実 行 さ れ る CPU の 集 合 は 、 mask 引 き 数 で 指 定 さ れ た 集 合 と 、 シ ス テ ム 上 に 実 際 に 存 在 す る CPU の 集 合 の 共 通 集 合 (AND) と な る 。 "cpuset" 機 構 が 使 用 さ れ て い る 場 合 に は 、 ス レ ッ ド が 動 作 す る CPU 集 合 に 対 し て シ ス テ ム は さ ら に 制 限 を 加 え る か も し れ な い ("cpuset" 機 構 に つ い て は cpuset(7) を 参 照 )。 ス レ ッ ド が 動 作 す る 実 際 の CPU 集 合 に 対 す る 制 限 は カ ー ネ ル に よ り 暗 黙 の う ち に 適 用 さ れ る 。 シ ス テ ム で 利 用 可 能 な CPU 数 を 判 定 す る 方 法 は い く つ か あ る 。 /proc/cpuinfo の 内 容 を 調 べ る 、 sysconf(3) を 使 っ て _SC_NPROCESSORS_CONF と _SC_NPROCESSORS_ONLN の 値 を 取 得 す る 、 /sys/devices/system/cpu/ の CPU デ ィ レ ク ト リ の 一 覧 を 調 べ る 、 な ど が あ る 。
sched(7) に Linux の ス ケ ジ ュ ー リ ン グ 方 式 に つ い て の 説 明 が あ る 。
affinity マ ス ク は ス レ ッ ド 単 位 の 属 性 で 、 ス レ ッ ド グ ル ー プ の 各 ス レ ッ ド 単 位 に 独 立 し て 調 整 す る こ と が で き る 。 gettid(2) コ ー ル か ら の 返 り 値 を こ の コ ー ル の pid 引 き 数 と し て 渡 す こ と が で き る 。 pid に 0 を 指 定 す る と 呼 び 出 し 元 の ス レ ッ ド の 属 性 が 設 定 さ れ 、 getpid(2) コ ー ル か ら の 返 り 値 を pid に 指 定 す る と ス レ ッ ド グ ル ー プ の メ イ ン ス レ ッ ド の 属 性 が 設 定 さ れ る (POSIX ス レ ッ ド API を 使 用 し て い る 場 合 、 sched_setaffinity() の 代 わ り に pthread_setaffinity_np(3) を 使 用 す る こ と )。
fork(2) 経 由 で 生 成 さ れ た 子 プ ロ セ ス は 親 プ ロ セ ス の CPU affinity マ ス ク を 継 承 す る 。 affinity マ ス ク は execve(2) の 前 後 で 保 存 さ れ る 。
C ラ イ ブ ラ リ と カ ー ネ ル ABI の 違 い こ の マ ニ ュ ア ル ペ ー ジ で は CPU affinity コ ー ル の glibc イ ン タ ー フ ェ ー ス を 説 明 し て い る 。 実 際 の シ ス テ ム コ ー ル イ ン タ ー フ ェ ー ス は 少 し 違 っ て お り 、 実 際 の 実 装 で は CPU 集 合 は 簡 単 な ビ ッ ト マ ス ク で あ る と い う 実 状 を 反 映 し 、 mask の 型 が unsigned long * と な っ て い る 。 成 功 時 に は 、 生 の sched_getaffinity() シ ス テ ム コ ー ル 自 身 は cpumask_t デ ー タ 型 の (バ イ ト 単 位 の ) 大 き さ を 返 す 。 cpumask_t は カ ー ネ ル 内 部 で CPU 集 合 の ビ ッ ト マ ス ク を 表 現 す る の に 使 わ れ て い る デ ー タ 型 で あ る 。
関 連 項 目
lscpu(1), nproc(1), taskset(1), clone(2), getcpu(2), getpriority(2), gettid(2), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getscheduler(2), sched_setscheduler(2), setpriority(2), CPU_SET(3), pthread_setaffinity_np(3), sched_getcpu(3), capabilities(7), cpuset(7), sched(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。