FUTEX(2) | Linux Programmer's Manual | FUTEX(2) |
futex - 高速ユーザー空間ロック
#include <linux/futex.h> #include <sys/time.h> int futex(int *uaddr, int op, int val, const struct timespec *timeout,
int *uaddr2, int val3);
注: このシステムコールには glibc のラッパー関数は存在しない。「注意」の節を参照。
futex() システムコールは、 指定したアドレスの値が変更されるのをプログラムが待つ手段や 特定のアドレスに対して待機中のプロセスを wake (起床) させる手段を提供する (プロセスが異なれば同じメモリーに対するアドレスも同じではないかもしれないが、 カーネルは異なる位置にマップされた同じメモリーを futex() で使えるよう内部でマップする)。 通常は、このシステムコールは futex(7) に書かれているように、 共有メモリー中のロックが競合する場合の処理を実装するのに用いられる。
futex(7) の操作がユーザー空間で競合なく完了しなかった場合、 カーネルに仲裁させるためにシステムコールを呼ぶ必要がある。 仲裁というのは、呼び出しプロセスを sleep (起床待ち) させたり、反対に 待ちプロセスを wake させたりすることを意味する。
この関数を呼び出すプロセスは futex(7) に記述されているセマンティクスに忠実であることが要求される。 このセマンティクスには移植不可能なアセンブリ命令を書くことが含まれる。 このことは言い換えると futex のユーザーのほとんどは実際はライブラリの作者であり、 一般アプリケーションの開発者ではないということである。
uaddr 引き数は、カウンターを格納する、 アラインメントの揃った int 型変数を指している必要がある。 実行する操作は op 引き数を介して、値 val とともに渡される。
現在のところ 5 つの操作が定義されている:
futex(7) に照らし合わせると、この呼び出しは カウントのデクリメントで負の値 (競合を表す) になった場合に実行され、 別のプロセスがその futex を解放し FUTEX_WAKE の操作を実行するまで sleep する。
futex(4) に照らし合わせると、 この操作は カウントのインクリメントで待ちプロセスがあると判明し、 futex 値が 1 に設定された (利用可能であることを表す) 場合に実行される。
競合状態を防止するため、呼び出しプロセスは FUTEX_FD が返ったあと futex が up されたかどうかを確認しなければならない。
FUTEX_FD はもともと競合が起きやすかったため、 Linux 2.6.26 以降で削除されている。
エラーの場合、全ての操作で -1 が返り、 errno がエラーの内容を示す値に設定される。成功時の返り値は操作によって異なり、以下のリストに書かれている通りである。
最初の futex 対応は Linux 2.5.7 で組み込まれたが、 上記のセマンティクスとは異なる。 4 つの引き数のここに書かれているセマンティクスを持つ システムコールは、Linux 2.5.40 で導入された。 Linux 2.5.70 では 1 つの引き数が追加された。 Linux 2.6.7 では 6 番目の引き数が追加された。 これは汚く、s390 アーキテクチャー上の特別のものである。
このシステムコールは Linux 固有である。
繰り返すが、裸の futex はエンドユーザーが容易に使うことのできる概念として 意図されたものではない (glibc にはこのシステムコールに対するラッパー関数はない)。 実装者は、アセンブリ言語に慣れており、以下に挙げる futex ユーザー空間ライブラリの ソースを読み終えていることが要求される。
Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux
(proceedings of the Ottawa Linux Symposium 2002), online at
http://kernel.org/doc/ols/2002/ols2002-pages-479-495.pdf
futex
の使用例ライブラリ,
futex-*.tar.bz2
ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2014-05-21 | Linux |