日本語 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
SX(9) FreeBSD カーネル開発者マニュアル SX(9) 名称 sx, sx_init, sx_init_flags, sx_destroy, sx_slock, sx_xlock, sx_slock_sig, sx_xlock_sig, sx_try_slock, sx_try_xlock, sx_sunlock, sx_xunlock, sx_unlock, sx_try_upgrade, sx_downgrade, sx_sleep, sx_xholder, sx_xlocked, sx_assert, SX_SYSINIT, SX_SYSINIT_FLAGS -- カーネルの共有/排 他的ロック 書式 #include <sys/param.h> #include <sys/lock.h> #include <sys/sx.h> void sx_init(struct sx *sx, const char *description); void sx_init_flags(struct sx *sx, const char *description, int opts); void sx_destroy(struct sx *sx); void sx_slock(struct sx *sx); void sx_xlock(struct sx *sx); int sx_slock_sig(struct sx *sx); int sx_xlock_sig(struct sx *sx); int sx_try_slock(struct sx *sx); int sx_try_xlock(struct sx *sx); void sx_sunlock(struct sx *sx); void sx_xunlock(struct sx *sx); void sx_unlock(struct sx *sx); int sx_try_upgrade(struct sx *sx); void sx_downgrade(struct sx *sx); int sx_sleep(void *chan, struct sx *sx, int priority, const char *wmesg, int timo); struct thread * sx_xholder(struct sx *sx); int sx_xlocked(const struct sx *sx); options INVARIANTS options INVARIANT_SUPPORT void sx_assert(const struct sx *sx, int what); #include <sys/kernel.h> SX_SYSINIT(name, struct sx *sx, const char *desc); SX_SYSINIT_FLAGS(name, struct sx *sx, const char *desc, int flags); 解説 共有/排他ロックは、それらが書き込まれるよりもずっと頻繁に読み込まれるデー タを保護するために使用されます。共有/排他ロックは、優先権の反転を防ぐため に mutex と読み込み/書き込みロックのような優先権の伝搬を実装しないので、 共有/排他ロックは、用心深く使用されるべきです。 共有/排他ロックは、sx_init() または sx_init_flags() のいずれかで作成さ れ、ここで sx は、struct sx, のための空間へのポインタであり、description は、共有/排他ロックを説明するヌル文字で終了する文字列へのポインタです。 sx_init_flags() への opts 引数は、sx の振る舞いを変更するために 1 組のオ プションのフラグを指定します。それは、1 つ以上の次のフラグを含んでいます: SX_NOADAPTIVE 排他的ロックのホルダが別の CPU で実行されている間に、ロッ ク操作のために、スリープするのではなく、適応スピン (回転) を無効にします。適応スピン (回転) は、カーネルが options NO_ADAPTIVE_SX でコンパイルされないなら、デフォルトです。 SX_DUPOK witness は、獲得される複製されたロックに関するメッセージを ログ記録するべきではありません。 SX_NOWITNESS このロックを無視するために witness(4) に指示します。 SX_NOPROFILE このロックのプロファイルを行いません。 SX_RECURSE スレッドは、sx のために排他ロックを再帰的に獲得することが できます。 SX_QUIET ktr(4) を通してこのロックのための任意の操作をログ記録しま せん。 SX_NEW カーネルが option INVARIANTS でコンパイルされたなら、 sx_init() は、sx が、このオプションが指定されないなら、介 在されている sx_destroy() への呼び出しなしで、何度も初期化 されていないことをアサートします。 共有/排他ロックは、sx_destroy() で破壊されます。ロック sx は、それが破壊 されるとき、どんなスレッドによってもロックされてはいけません。 スレッドは、sx_slock(), sx_slock_sig() または sx_try_slock() と sx_sunlock() または sx_unlock() を呼び出すことによって共有ロックを獲得し て、解放します。スレッドは、sx_xlock(), sx_xlock_sig() または sx_try_xlock() と sx_xunlock() または sx_unlock() を呼び出すことによって 排他ロックを獲得して、解放します。スレッドは、sx_try_upgrade() を呼び出す ことによって、現在保持している共有ロックから排他ロックにアップグレードを 試みることができます。排他ロックがあるスレッドは、sx_downgrade() を呼び出 すことによって、その排他ロックから共有ロックにダウングレードすることがで きます。 sx_try_slock() と sx_try_xlock() は、共有/排他ロックを直ちに獲得できな かったなら、0 を返します。そうでなければ、共有/排他ロックは、獲得され、0 以外の値が返されます。 sx_try_upgrade() は、共有ロックを直ちに排他ロックにアップグレードできない なら、0 を返します。そうでなければ、排他ロックは、獲得され、0 以外の値が 返されます。 sx_slock_sig() と sx_xlock_sig() は、割り込み可能なスリープを実行します が、それらの通常のバージョンと同じように行います。スリープがシグナルまた は割り込みによって割り込まれるなら、0 以外の値を返し、そうでなければ、0 を返します。 スレッドは、sx_sleep() の呼び出しによってイベントを待っている間に、共有/ 排他ロックを不可分に解放できます。この関数へのパラメータに関するより詳し い情報については、sleep(9) を参照してください。 options INVARIANTS と options INVARIANT_SUPPORT, を付けてコンパイルされた とき、sx_assert() 関数は、what で指定されたアサーションのために sx をテス トし、それらが満たさないなら、パニックします。次のアサートの 1 つが指定さ れるべきです: SA_LOCKED 現在のスレッドに、最初の引数によって指される sx ロックに共有 ロックまたは排他的ロックのいずれかがあることを、アサートしま す。 SA_SLOCKED 現在のスレッドに、最初の引数によって指される sx ロックに共有 ロックがあることを、アサートします。 SA_XLOCKED 現在のスレッドに、最初の引数によって指される sx ロックに排他 的ロックがあることを、アサートします。 SA_UNLOCKED 現在のスレッドに、最初の引数によって指される sx ロックにロッ クがないことを、アサートします。 さらに、次の省略可能なアサーションの 1 つは、SA_LOCKED, SA_SLOCKED または SA_XLOCKED アサーションのいずれかに含まれます: SA_RECURSED 現在のスレッドが sx で繰り返えされるロックがあることをア サートします。 SA_NOTRECURSED 現在のスレッドが sx で繰り返えされるロックがないことをア サートします。 sx_xholder() は、現在 sx で排他ロックを保持しているスレッドへのポインタを 返します。スレッドが sx, で排他ロックを保持していないなら、代わりに NULL が返されます。 sx_xlocked() は、現在のスレッドが排他的なロックを保持しているなら、0 以外 を返します。そうでなければ、0 を返します。 プログラミングの容易さについて、sx_unlock() は、それぞれの関数 sx_sunlock() と sx_xunlock() へのマクロのフロントエンドとして提供されてい ます。どの状態のロックを知っているアルゴリズムは、小さな性能の利益のため に 2 つの特定の関数のいずれかを使用するべきです。 SX_SYSINIT() マクロは、与えられた sx ロックを初期化するためにシステムのス タートアップで、sx_sysinit() ルーチンへの呼び出しを生成するために使用され ます。パラメータは、sx_init() と同様ですが、ロックと sysinit ルーチンに関 連した関連する構造体のためのユニークな変数名を生成するために使用される、 追加の引数 name があります。SX_SYSINIT_FLAGS() マクロは、同様に、 sx_init_flags() を使用して、与えられた sx ロックを初期化するために使用す ることができます。 スレッドは、同じロックで共有ロックと排他的ロックの両方を同時に保持しませ ん。そうすることを試みることは、デッドロックの結果となります。 コンテキスト スレッドは、スリープの間に sx ロックで共有ロックまたは排他的ロックを保持 します。結果として、sx ロックは、ミューテックスを保持している間に獲得でき ません。そうでなければ、1 つのスレッドが、ミューテックスを獲得した後に同 じ sx ロックで別のスレッドがブロックされている間に、sx ロックを保持する間 にスリープするなら、2 番目のスレッドは、結果的に許可されていない、ミュー テックスを保持している間に結局スリープします。 関連項目 lock(9), locking(9), mutex(9), panic(9), rwlock(9), sema(9) バグ WITNESS なしのカーネルは、現在のスレッドが、共有ロックを保持するかどうか にかかわらず、アサートすることができません。SA_LOCKED と SA_SLOCKED は、 あらゆるスレッドが共有ロックを保持することだけアサートすることができま す。それらは、現在のスレッドが、共有ロックを保持することを保証することは できません。さらに、SA_UNLOCKED は、現在のスレッドが排他的ロックを保持し ないことだけアサートすることができます。 FreeBSD 11.4 November 11, 2017 FreeBSD 11.4