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

名前

       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)