SCHED_SETAFFINITY(2) | Linux Programmer's Manual | SCHED_SETAFFINITY(2) |
名前
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 ,
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) による性能面の劣化を避けることもできる。返り値
成功した場合、 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 集合に対する制限はカーネルにより暗黙のうちに適用される。実際には affinity マスクはスレッド単位の属性で、スレッドグループの各スレッド単位に独立して調整することができる。 gettid(2) コールからの返り値をこのコールの pid 引き数として渡すことができる。 pid に 0 を指定すると呼び出し元のスレッドの属性が設定され、 getpid(2) コールからの返り値を pid に指定するとスレッドグループのメインスレッドの属性が設定される (POSIX スレッド API を使用している場合、 sched_setaffinity() の代わりに pthread_setaffinity_np(3) を使用すること)。
fork(2) 経由で生成された子プロセスは親プロセスの CPU affinity マスクを継承する。 affinity マスクは execve(2) の前後で保存される。
このマニュアルページでは CPU affinity コールの glibc インタフェースを説明している。実際のシステムコール・インタフェースは少し違っており、実際の実装では CPU 集合は簡単なビットマスクであるという実状を反映し、 mask の型が unsigned long * となっている。成功時には、生の sched_getaffinity() システムコール自身は cpumask_t データ型の (バイト単位の) 大きさを返す。 cpumask_t はカーネル内部で CPU 集合のビットマスクを表現するのに使われているデータ型である。
関連項目
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)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2013-02-11 | Linux |