EN JA
CPUSET(2)
CPUSET(2) FreeBSD System Calls Manual CPUSET(2)

名称

cpuset, cpuset_getid, cpuset_setidCPU 類似性セットを管理する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/param.h>
#include < sys/cpuset.h>

int
cpuset( cpusetid_t *setid);

int
cpuset_setid( cpuwhich_t which, id_t id, cpusetid_t setid);

int
cpuset_getid( cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid);

解説

cpuset システムコールファミリによって、アプリケーションは、プロセッサのセットを制御して、これらのセットにプロセスとスレッドを割り当てることができます。プロセッサのセットは、メンバが実行する CPU のリストを含み、単にあるプロセスがセットのメンバである限り、存在しています。システムのすべてのプロセスには、割り当てられたセットがあります。システムのすべてのプロセスに設定されたデフォルトは、1 に番号付けれらたセットです。スレッドは、それらを含むプロセスとして同じセットに属しますが、それらは、スレッド毎のマスクを匿名でそれらのセットをさらに制限します。

セットは多くのタイプ cpuset_id_t によって参照されます。各スレッドには、ルートのセット、割り当てられたセット、と匿名のマスクがあります。ルートと割り当てられたセットだけが番号付です。ルートのセットは、システム、またはスレッドが実行しているシステムパーティションで利用可能なすべての CPU のセットです。割り当てられたセットは、ルートのセットの部分集合であり、プロセスベース毎で管理上の割り当て可能です。多くのプロセスとスレッドは、番号付のセットのメンバです。

匿名のセットは、割り当てられたセットでさらにスレッド特有の改良点です。アプリケーション開発者が、 cpuset_setaffinity(2) を使用して匿名のセットを操作している間、管理者は、 cpuset(1) を使用して番号付されたセットを操作することを対象としています。

正しいセットを選択するために、タイプ cpulevel_t の値が使用されます。 level のための次の値が、サポートされています:

CPU_LEVEL_ROOT ルートのセット
CPU_LEVEL_CPUSET 割り当てられたセット
CPU_LEVEL_WHICH which 引数によって指定されたセット

which 引数は、 id の値がどのように解釈されて、タイプ cpuwhich_t であるかを決定します。 which 引数には、次の値があります:

CPU_WHICH_TID id は lwpid_t (スレッド id) です
CPU_WHICH_PID id は pid_t (プロセス id) です
CPU_WHICH_CPUSET id は cpusetid_t (cpuset id) です
CPU_WHICH_IRQ id は irq 番号です

'-1' の id は、現在のスレッド、プロセス、または現在のスレッドの cpuset を意味する、 CPU_WHICH_TID, CPU_WHICH_PID または CPU_WHICH_CPUSETwhich で使用されます。すべての cpuset のシステムコールで、この使用法が可能です。

CPU_WHICH_CPUSET 以外の which 引数に結合された CPU_LEVEL_WHICHlevel 引数は、オブジェクトの匿名のマスクを参照します。このマスクは、id を持たないで、 cpuset_setaffinity(2) で操作されるだけです。

cpuset() は、現在のプロセスのルートのセットとして同じ CPU を含む新しいセットを作成して setid によって提供された空間に id を保存します。成功して終了すれば、呼び出しプロセスは、セットに結合して、唯一のメンバです。子供は、 fork(2) への呼び出しの後にこのセットを継承します。

cpuset_setid() は、 which 引数によって指定されたオブジェクトの ID をセットしようと試みます。現在の、 CPU_WHICH_PID は、それらのプロセスと異なった ID がないスレッドとして唯一の受け付け可能な値で、API は既存のセットの ID を変更することを許可しません。成功して終了したときに、ターゲットプロセスのすべてのスレッドは、セットによって許可された CPU で実行されます。

cpuset_getid() は、 which によって示されたオブジェクトから set id を検索して、 setid によって指された空間にそれを格納します。検索された ID は、ルートまたは、 level の値に依存する割り当てられたセットのいずれかです。 level は、 id 引数によって指定されたプロセスまたはスレッドから set id を取得するために CPU_LEVEL_CPUSET または CPU_LEVEL_ROOT であるべきです。プロセスまたはスレッドで CPU_LEVEL_WHICH を指定することは、これが無数の匿名のマスクを参照するので、サポートされていません。

セットの実際の内容は、 cpuset_getaffinity(2)cpuset_setaffinity(2) を使用して検索されるか、または操作されます。さらに詳しくは、それらのマニュアルページを参照してください。

戻り値

Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

次のエラーコードが、 errno に設定されるかもしれません:
[ EINVAL]
which または level 引数が有効な値ではありませんでした。
[ EDEADLK]
cpuset_setid() 呼び出しは、セットがスレッドの匿名のマスクに重ならないので、実行している有効な CPU なしでスレッドを残すでしょう。
[ EFAULT]
setid ポインタが、 cpuset_getid() に渡されたか、または cpuset() が、無効でした。
[ ESRCH]
idwhich 引数で指定されたオブジェクトを見つけることができませんでした。
[ EPERM]
呼び出しプロセスが、操作を完了するために必要とされる資格証明がありませんでした。
[ ENFILE]
割り付けのための空いている cpusetid_t がありませんでした。

歴史

cpuset システムコールファミリは、 FreeBSD 7.1 ではじめて登場しました。

作者

Jeffrey Roberson <jeff@FreeBSD.org>
January 8, 2010 FreeBSD