1 .\" Page by b.hubert - may be freely modified and distributed
3 .\" Niki A. Rahimi (LTC Security Development, narahimi@us.ibm.com)
4 .\" added ERRORS section.
6 .\" Modified 2004-06-17 mtk
7 .\" Modified 2004-10-07 aeb, added FUTEX_REQUEUE, FUTEX_CMP_REQUEUE
9 .\" FIXME See also https://bugzilla.kernel.org/show_bug.cgi?id=14303
10 .\" 2.6.14 adds FUTEX_WAKE_OP
11 .\" 2.6.18 adds (Ingo Molnar) priority inheritance support:
12 .\" FUTEX_LOCK_PI, FUTEX_UNLOCK_PI, and FUTEX_TRYLOCK_PI. These need
13 .\" to be documented in the manual page. Probably there is sufficient
14 .\" material in the kernel source file Documentation/pi-futex.txt.
15 .\" 2.6.25 adds FUTEX_WAKE_BITSET, FUTEX_WAIT_BITSET
17 .\" Japanese Version Copyright(C) 2003 Suzuki Takashi
18 .\" all rights reserved.
19 .\" Translated Fri Oct 24 10:37:10 JST 2003
20 .\" by Suzuki Takashi.
21 .\" Updated & Modified Sat Feb 5 14:28:53 JST 2005
22 .\" by Yuichi SATO <ysato444@yahoo.co.jp>, LDP v2.01
23 .\" Updated & Modified Wed Jan 3 04:51:22 JST 2007 by Yuichi SATO, LDP v2.43
25 .\"WORD: integer int 型変数
30 .TH FUTEX 2 2010-08-29 "Linux" "Linux Programmer's Manual"
32 futex \- 高速ユーザ空間ロック機構のシステムコール
36 .B "#include <linux/futex.h>"
37 .B "#include <sys/time.h>"
39 .BI "int futex(int *" uaddr ", int " op ", int " val \
40 ", const struct timespec *" timeout ,
42 .BI " int *" uaddr2 ", int " val3 );
43 .\" int *? void *? u32 *?
49 指定したアドレスの値が変更されるのをプログラムが待つ手段や
50 特定のアドレスに対して待機中のプロセスを wake (起床) させる手段を提供する
51 (プロセスが異なれば同じメモリに対するアドレスも同じではないかもしれないが、
52 カーネルは異なる位置にマップされた同じメモリを
58 共有メモリ中のロックが競合する場合の処理を実装するのに用いられる。
61 の操作がユーザ空間で競合なく完了しなかった場合、
62 カーネルに仲裁させるためにシステムコールを呼ぶ必要がある。
63 仲裁というのは、呼び出しプロセスを sleep (起床待ち) させたり、反対に
64 待ちプロセスを wake させたりすることを意味する。
68 に記述されているセマンティクスに忠実であることが要求される。
69 このセマンティクスには移植不可能なアセンブリ命令を書くことが含まれる。
70 このことは言い換えると futex のユーザのほとんどは実際はライブラリの作者であり、
71 一般アプリケーションの開発者ではないということである。
75 アラインメントの揃った int 型変数を指している必要がある。
82 現在のところ 5 つの操作が定義されている:
89 がまだ格納されているかどうかを不可分操作で検証し、
96 待ち時間の最大値を表す。NULL の場合は無限大を表す。
105 カウントのデクリメントで負の値 (競合を表す) になった場合に実行され、
111 この操作では指定した futex アドレスに対して待ち状態の
114 中の) 最大 \fIval\fP 個のプロセスを wake させる。
121 \fBfutex\fR(4) に照らし合わせると、
123 カウントのインクリメントで待ちプロセスがあると判明し、
124 futex 値が 1 に設定された (利用可能であることを表す) 場合に実行される。
126 .BR FUTEX_FD " (Linux 2.6.25 以前)"
127 非同期の wake に対応するため、この操作はファイルディスクリプタを futex に
135 で渡されたシグナル番号のシグナルを受信する。
136 呼び出しプロセスは使用後、返されたファイルディスクリプタを
144 競合状態を防止するため、呼び出しプロセスは
147 futex が up されたかどうかを確認しなければならない。
149 .\" FIXME . Check that this flag does eventually get removed.
152 Linux 2.6.26 以降で削除されている。
154 .BR FUTEX_REQUEUE " (Linux 2.5.70 以降)"
157 が使われていて、かつ wake されている全てのプロセスが
158 他の futex を取得する必要がある場合に、
159 「獣の群れの暴走 (thundering herd)」効果を避けるために導入された。
164 で futex を待っている他の全てのプロセスを再度キューにいれる。
171 .BR FUTEX_CMP_REQUEUE " (Linux 2.6.7 以降)"
182 がまだ保持されているかを最初にチェックする。
196 の呼び出しで wake すると 0 を返す。
200 futex が指定された値と等しくない場合、
206 参照) 他の偽の wake があった場合には、エラー
214 futex に関連づけられた新たなファイルディスクリプタを返す。
222 エラーの場合、全ての操作で \-1 が返り、
228 futex メモリに読み込みアクセス権がなかった。
244 操作が定義されていない。またはページ・アラインメントでエラーが発生した。
247 オープンされているファイルの総数がシステムの制限に達した。
254 最初の futex 対応は Linux 2.5.7 で組み込まれたが、
256 4 つの引き数のここに書かれているセマンティクスを持つ
257 システムコールは、Linux 2.5.40 で導入された。
258 Linux 2.5.70 では 1 つの引き数が追加された。
259 Linux 2.6.7 では 6 番目の引き数が追加された。
260 これは汚く、s390 アーキテクチャ上の特別のものである。
262 このシステムコールは Linux 独自である。
265 繰り返すが、裸の futex はエンドユーザが容易に使うことのできる概念として
267 (glibc にはこのシステムコールに対するラッパー関数はない)。
268 実装者は、アセンブリ言語に慣れており、以下に挙げる futex ユーザ空間ライブラリの
272 .\" futex は Hubertus Franke (IBM Thomas J. Watson Research Center),
273 .\" Matthew Kirkwood, Ingo Molnar (Red Hat),
274 .\" Rusty Russell (IBM Linux Technology Center) が設計し、作成した。
275 .\" このページは bert hubert が記した。
279 \fIFuss, Futexes and Furwocks: Fast Userlevel Locking in Linux\fP
280 (proceedings of the Ottawa Linux Symposium 2002), online at
282 http://kernel.org/doc/ols/2002/ols2002-pages-479-495.pdf
284 futex の使用例ライブラリ, futex-*.tar.bz2
286 ftp://ftp.nl.kernel.org/pub/linux/kernel/people/rusty/.