日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
LIBTHR(3) FreeBSD ライブラリ関数マニュアル LIBTHR(3) 名称 libthr -- 1:1 POSIX スレッドライブラリ ライブラリ 1:1 スレッドライブラリ (libthr, -lthr) 書式 #include <pthread.h> 解説 libthr ライブラリは、アプリケーションのスレッドのための pthread(3) ライブ ラリインタフェースの 1:1 実装を提供します。それは、システムスコープスレッ ドセマンティクスを予想するアプリケーションによって使用するために最適化さ れます。 ライブラリは、実行時リンクエディタ ld-elf.so.1(1) と標準 C ライブラリ (libc, -lc) としっかり統合されます。すべての 3 つの構成要素は、同じソース ツリーから構築されなければなりません。FreeBSD の異なるバージョンの libc と libthr のライブラリを混合は、サポートされません。実行時のリンカ ld elf.so.1(1) には、libthr のより古いバージョンとの後方互換性を保証するため のいくつかのコードがあります。 マニュアルページは、libthr の振る舞いと調整変数を文書化しています。 -lpthread でリンクするとき、実行時の依存関係 libthr.so.3 は、生成されたオ ブジェクトに記録されます。 ミューテックの獲得 ロックされたミューテック (pthread_mutex_lock(3) を参照) は、ロックを所有 するスレッドのグローバルなシステム識別子を記録する、タイプ lwpid_t の volatile (揮発性) の変数によって表わされます。libthr は、3 つの段階の競わ れたミューテックの獲得を行ない、その各々は、以前のものより、よりリソース を消費します。最初の 2 つの段階は、PTHREAD_MUTEX_ADAPTIVE_NP タイプと PTHREAD_PRIO_NONE プロトコル (pthread_mutexattr(3) を参照) のミューテック のためにのみ適応されます。 最初に、SMP システムで、スピンループは、ライブラリが、atomic(9) 操作に よってロックを獲得することを試みるところで、行なわれます。ループカウント は、2000 のデフォルト値で、LIBPTHREAD_SPINLOOPS 環境変数によって制御され ます。 スピンループがミューテックを獲得することができなかっなら、イールド (yield) ループは、スピンループとして同じ atomic(9) の獲得の試みを行なっ て、実行されますが、それぞれの試みは、sched_yield(2) システムコールを使用 してスレッドの CPU 時間の産出によって続けられます。デフォルトで、イールド (yield) ループは、実行されません。これは、LIBPTHREAD_YIELDLOOPS 環境変数 によって制御されます。 スピンループとイールド (yield) ループの両方がロックの獲得に失敗したなら、 スレッドは、CPU を切断し、_umtx_op(2) システムコールでカーネルでスリープ させられます。カーネルは、スレッドを起こし、ロックが利用可能になるとき、 起こされたスレッドにロックの所有権を渡します。 スレッドのスタック 各スレッドは、C の実行時に使用されるプライベートのユーザモードのスタック 領域で提供されます。メイン (初期) のスレッドのスタックのサイズは、カーネ ルによって設定され、RLIMIT_STACK プロセスリソースの制限 (getrlimit(2) を 参照) によって制御されます。 デフォルトで、メインのスレッドのスタックサイズは、プロセスのための RLIMIT_STACK の値と等しくなります。LIBPTHREAD_SPLITSTACK_MAIN 環境変数が プロセス環境 (その値は、重要ではありません) に存在するなら、メインのス レッドのスタックは、スレッド化されたライブラリが初期化されるとき、64 ビッ トのアーキテクチャで 4MB、と 32 ビットのアーキテクチャで 2MB まで減らされ ます。最初のプロセスのスタックのためにカーネルによって予約されているアド レス空間の領域の残りは、この場合に最初でないスレッドのスタックのために使 用されます。LIBPTHREAD_BIGSTACK_MAIN 環境変数の存在は、 LIBPTHREAD_SPLITSTACK_MAIN を上書きします。それは、後方互換性のために保持 されています。 pthread_create(3) 呼び出しをで実行時にプロセスによって作成されたスレッド のためのスタックのサイズは、スレッド属性によって制御されます: pthread_attr(3) 特に、pthread_attr_setstacksize(3), pthread_attr_setguardsize(3) と pthread_attr_setstackaddr(3) 関数を参照し てください。スレッドのスタックサイズのための属性が指定されないなら、デ フォルトの最初でないスレッドのスタックサイズは、64 ビットのアーキテクチャ に対して 2MB と 32 ビットのアーキテクチャに対して 1MB です。 実行時の設定 次の環境変数は、libthr によって認識され、実行時にライブラリの操作を調節し ます: LIBPTHREAD_BIGSTACK_MAIN LIBPTHREAD_SPLITSTACK_MAIN によって有効に された最初のスレッドのスタックの減少を無効 にします。 LIBPTHREAD_SPLITSTACK_MAIN セクション「スレッドのスタック」に記述され るように、最初のスレッドのスタックの減少を 引き起こします。これは、FreeBSD 11.0 の前 の libthr のデフォルト振る舞いでした。 LIBPTHREAD_SPINLOOPS 変数の整数値は、ミューテックの獲得の spin loop (スピンループ) の繰り返しのデフォルト のカウントを上書きします。デフォルトのカウ ントは、2000 で、libthr ソースの MUTEX_ADAPTIVE_SPINS 定数によって設定され ます。 LIBPTHREAD_YIELDLOOPS 0 でない整数値は、ミューテックの獲得の過程 で、イールド (yield) ループを有効にしま す。値は、ループ操作のカウントです。 LIBPTHREAD_QUEUE_FIFO 変数の整数値は、ブロックされたスレッドがそ のテール (tail) の代わりに、スリープキュー のヘッド (head) にどれくらい挿入されるかを 指定します。より大きな値は、FIFO 規律の頻 度を縮小します。値は、0 と 255 の間でなけ ればなりません。 次の sysctl MIB は、ライブラリの操作に影響します: kern.ipc.umtx_vnode_persistent デフォルトで、メモリ中のマップされた ファイルによって裏打ちされた共有ロッ クは、POSIX によって許可される、対応 するファイルのページの最後のアンマッ プで自動的に破壊されます。sysctl を 1 に設定することは、そのような共有 ロックオブジェクトを vnode が Vir tual File System によってリサイクル されるまで、持続させます。ファイルが オープンされず、マップされない場合 に、カーネルは、この sysctl を、思っ たより役に立たなくして、今すぐにも、 リサイクルすることに注意してくださ い。 kern.ipc.umtx_max_robust 1 つのスレッドのために許可された強固 な mutex の最大数。カーネルは、指定 されるより多い mutex をアンロックし ません、詳細については、_umtx_op を 参照してください。デフォルト値は、最 も役に立つアプリケーションのために十 分に大きくなっています。 debug.umtx.robust_faults_verbose アンロックされた強固な mutex が、メ モリの破損を防止する手段として、いく らかの矛盾を検出した後に、アボートし たとき、0 の値は、カーネルにいくらか の診断を出力させます、 RLIMIT_UMTXP の制限 (getrlimit(2) を参照) は、与えられたユーザが、どのく らいの共有ロックを同時に作成できるを定義します。 実行時のリンカとの相互作用 ロードにおいて、libthr は、libc によってエクスポートされたフックに干渉す るハンドラをインストールします。干渉者 (interposer) は、libc の単一スレッ ド化されたプロセス、取消しのサポート、とシグナルの操作へのいくつかの修正 のためのスタブの代わりに実際のロックの実装を提供します。 libthr は、アンロードすることができません。dlclose(3) 関数は、libthr のた めのハンドルで呼び出されるとき、あらゆるアクションを行ないません。理由の 1 つは、libc 関数の内部の干渉が未完成とできないことです。 シグナル 実装は、ユーザにインストールされた signal(3) ハンドラに干渉します。この干 渉は、ユーザに提供されるシグナルハンドラの呼び出しが安全でないところで、 (libthrの内部の) クリティカルなセクションに入るスレッドにシグナルの配信を 延期するために行われます。そのような状況の例は、内部のライブラリのロック を所有しています。シグナルが、シグナルが安全に呼ぶ出すことができない間 に、配信されるとき、呼び出しは、クリティカルなセクションから出た後まで、 延期され、実行されます。これは、ktrace(1) ログを解釈するとき、考慮に入れ られるべきです。 プロセスで共有される同期オブジェクト libthr の実装で、すべての同期オブジェクト (例えば、pthread_mutex_t) のた めのユーザに見えるタイプは、内部構造へのポインタで、対応する pthread_<objtype>_init() メソッドの呼び出しによってか、または静的な初期化 子が指定されているとき、最初の使用で暗黙的に割り付けられます。プロセスの プライベートのロックオブジェクトの初期の実装は、内部割り付けでこのモデル が使用され、プロセス共有オブジェクトの追加は、アプリケーションのバイナリ インタフェースを壊さない方法で行われました。 プロセスのプライベートのオブジェクトについて、内部構造は、malloc(3) また は pthread_mutex_init(3) について、libthr に実装された内部メモリアロケー タを使用して割り付けられます。ミューテックスのための内部アロケータは、機 能するためにミューテックスを必要とする多くの malloc(3) の実装で生じるブー トストラップを回避するために使用されます。同じアロケータは、スレッド固有 のデータのために使用され、同じ理由から pthread_setspecific(3) を参照して ください。 プロセス共有オブジェクトについて、内部構造は、最初に _umtx_op(2) 操作 UMTX_OP_SHM を使用して共有メモリセグメントを割り付けし、次に MAP_SHARED フラグをつけた mmap(2) でプロセスのアドレス空間にそれをマッピングすること によって作成されます。POSIX 規格は、次のように要求します: プロセス共有の同期オブジェクト自体のみ同期を行うために使用することが できます。初期化のために使用されるアドレスで参照される必要はありません (すなわち、同じオブジェクトの別のマッピングを使用することができます)。 FreeBSD の実装で、プロセス共有オブジェクトは、それらを使用する各プロセス で初期化を必要とします。特に、利用者が別のプロセスで既に初期化されたプロ セス共有オブジェクトのユーザ部分を含む共有メモリをマップするなら、ロック 関数は、動作しません。 他の壊れた場合は、fork された子が親と共有しているメモリのオブジェクトを作 成し、親から使用することができません。プロセスは、とにかく fork(2) の後 に、非同期シグナルの安全関数を使用すべきではないことに注意してください。 関連項目 ktrace(1), ld-elf.so.1(1), getrlimit(2), errno(2), thr_exit(2), thr_kill(2), thr_kill2(2), thr_new(2), thr_self(2), thr_set_name(2), _umtx_op(2), dlclose(3), dlopen(3), getenv(3), pthread_attr(3), pthread_attr_setstacksize(3), pthread_create(3), signal(3), atomic(9) 歴史 libthr ライブラリは、FreeBSD 5.2 ではじめて登場しました。 作者 libthr ライブラリは、最初に Jeff Roberson <jeff@FreeBSD.org> によって作成 され、Jonathan Mini <mini@FreeBSD.org> と Mike Makonnen <mtm@FreeBSD.org> によって機能強化されました。それは、David Xu <davidxu@FreeBSD.org> によっ て、大幅に書き直されて、最適化されました。 FreeBSD 13.2 October 1, 2021 FreeBSD 13.2