getcpu(2) 呼び出し元スレッドが動作している CPU と NUMA ノードを判定する

書式

#include <linux/getcpu.h>


int getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache);

: このシステムコールには glibc のラッパー関数は存在しない。「注意」の節を参照。

説明

getcpu() システムコールは、呼び出し元のスレッドやプロセスが 現在動作しているプロセッサやノードの情報を特定し、 それぞれ引き数 cpunode が指す整数に書き込む。 プロセッサ情報は CPU を識別するための一意な小さな整数である。 ノード情報は NUMAノードを識別するための一意な小さな整数である。 cpunode のいずれかが NULL であれば、 その引き数に対応する情報の書き込みは行われない。

このシステムコールの 3 番目の引き数は現在は使われておらず、 Linux 2.6.23 以前への移植性が必要な場合以外は NULL を渡すべきである (「注意」を参照)。

cpu に格納された情報が最新だと保証できるのは、システムコールが呼ばれ た時点だけである。sched_setaffinity(2) を使って CPU affinity が固定 されていない限り、カーネルはいつでも CPU を変更してもよい (スケジューラ はキャッシュが有効に働くように CPU の移動を最小限にしようとするので、 通常は CPU が変更されることはないが、起きる可能性はある)。 cpunode で返された情報が呼び出しが返った時点ですでに 最新の状況と異なる可能性があり、呼び出し元はこの可能性を考慮して おかなければならない。

返り値

成功すると、0 を返す。 エラーの場合、-1 を返し、 errno にエラーを示す値を設定する。

エラー

EFAULT
引き数が呼び出したプロセスのアドレス空間外を指している。

バージョン

getcpu() はカーネル 2.6.19 で x86_64 と i386 向けに追加された.

準拠

getcpu() は Linux 固有である。

注意

Linux はこのシステムコールを可能な限り早く実行しようとする。 getcpu() は、CPU 毎のデータに対する最適化や NUMA 環境での最適化を プログラムが行えるようにすることを目的として実装されているからである。

glibc はこのシステムコールに対するラッパー関数を提供していない。 syscall(2) を使って呼び出すか、 代わりに sched_getcpu(3) を使用すること。

tcache 引き数は Linux 2.6.24 以降では使用されない。以前のバージョン のカーネルでは、この引き数が NULL 以外の場合、この引き数には、呼び出し 元が割り当てたスレッド専用の記憶領域 (thread-local storage) 内のバッファ を指すポインタが指定され、このバッファは getcpu() 用のキャッシュ機構 を提供するために利用されていた。非常に低い確率だが古い情報を返してしま うデメリットはあるものの、このキャッシュを使うことで getcpu() システ ムコールを高速化できた。このキャッシュ機構はCPU 間でのスレッドの移動時 に問題になると考えられ、この引き数は今では無視されるようになっている。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。