Provided by: manpages-ja_0.5.0.0.20221215+dfsg-1_all 

名前
futex - 高速ユーザー空間ロック機構
書式
#include <linux/futex.h>
説明
Linux カーネルは、ユーザー空間で高速なロック機構やセマフォを使用するための 基礎的要素として futex ("Fast user-space mutexes"; 高速ユーザー空間 mutex) を 提供している。 futex は非常に基本的なもので、より高位な ロック機構の概念 (mutex、状態変数 (condition variables)、読み書きロック、セマフォなど) を構築するのに利用 されている。 実際のところ、多くのプログラマーは futex を直接使うことはなく、 Native POSIX スレッドライブラリ (NPTL; pthreads(7) 参照) などの futex を使って作られたシステムライブラリを使うことだろう。 futex はプロセス間やスレッド間で共有することのできるメモリー片で識別される。 これらの異なるプロセス で、futext が同じアドレスである必要はない。 裸の姿では futex のセマンティクスはセマフォと同じである。 futex は不可分操作で (atomically) インクリメントしたりデクリメントしたりできる カウンターで、プロセスは値 が正になるのを待つことができる。 futex の操作は、競合がない場合には完全にユーザー空間で行なわれる。 カーネルは競合が起こった場合の仲裁に関 与するだけである。 良識ある設計では競合が起こらないよう努力するが、 futex も競合状態に関して最適化されて いる。 裸の姿では、 futex は不可分なアセンブリ命令でのみ操作される アラインメントの揃った整数である。この整数の 大きさはすべてのプラットフォームで 4 バイトである。複数のプロセスはこの int 型変数を、 mmap(2) を用いる か、 共有メモリーセグメントを介するか、 メモリー空間を共有する (この場合、 アプリケーションは一般的にマル チスレッドであると呼ばれる) か方法で共有する。 セマンティクス futex の操作はすべてユーザー空間から始まるが、必要に応じて futex(2) システムコールを用いてカーネルと通信 する。 futex を "up" するには、 ホスト CPU に対し int 型変数を不可分操作でインクリメントするような、 適切なアセ ンブリ命令を実行する。 そのあと、実際に 0 から 1 に変化したかどうかをチェックし、 変化していれば待ちプロ セス (waiter) はないということであり、操作は完了する。 これは競合のない場合であり、高速でよく起こるはずで ある。 競合がある場合、不可分操作のインクリメントでカウンターは -1 (または他の負の数) から変化する。これが検出さ れると、待ちプロセスがあるということである。 ユーザー空間ではカウンターを 1 に設定し、 FUTEX_WAKE を用い てカーネルに待ちプロセスを wake (起床) させるよう指示する。 futex の獲得を待つ、すなわち futex を "down" するには反対の操作を行なう。 不可分操作でカウンターをデクリ メントし、カウンターが 0 に変化したかどうかを チェックする。変化していれば操作は完了し futex は競合してい ないということである。 0 にならなかった場合、プロセスはカウンターを -1 に設定し、 他のプロセスがその futex を up するのを待つようカーネルに要求しなければならない。 これは FUTEX_WAIT を行なうことで実現され る。 futex(2) システムコールには、省略可能な引数としてタイムアウトを渡すことができ、 カーネルはその futex が up されるのをどれくらいの期間待つべきかを 指定することができる。この場合、セマンティクスはもっと複雑にな るため、 より詳細な情報を得るにはプログラマは futex(2) を参照すること。 同じページに非同期の futex 待ち についても記されている。
バージョン
最初の futex 対応は Linux 2.5.7 で組み込まれたが、 上記のセマンティクスとは異なる。 現在のセマンティクス は Linux 2.5.40 以降で利用可能である。
注意
再び繰り返しておくが、裸の futex はエンドユーザーが容易に使える概念として 意図されたものではない。 実装者 は、アセンブリ言語に慣れており、以下に挙げる futex ユーザー空間ライブラリの ソースを読み終えていることが 要求される。 このマニュアルページには futex(2) プリミティブの最も一般的な使用法が 記されている。これは決して唯一の使 用法ではない。
関連項目
clone(2), futex(2), get_robust_list(2), set_robust_list(2), set_tid_address(2), pthreads(7) Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux (proceedings of the Ottawa Linux Symposium 2002), futex の使用例ライブラリ, futex-*.tar.bz2 ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/.
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告 に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。 Linux 2017-09-15 FUTEX(7)