日本語 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.3-RELEASE-K, 13.0-RELEASE-K から 13.2-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
RMLOCK(9) FreeBSD カーネル開発者マニュアル RMLOCK(9) 名称 rmlock, rm_init, rm_init_flags, rm_destroy, rm_rlock, rm_try_rlock, rm_wlock, rm_runlock, rm_wunlock, rm_wowned, rm_sleep, rm_assert, RM_SYSINIT, RM_SYSINIT_FLAGS -- ほとんどの読み込みアクセスパターンのため に最適化されたカーネル読み込み側/書き込み側 (reader/writer) ロック 書式 #include <sys/param.h> #include <sys/lock.h> #include <sys/rmlock.h> void rm_init(struct rmlock *rm, const char *name); void rm_init_flags(struct rmlock *rm, const char *name, int opts); void rm_destroy(struct rmlock *rm); void rm_rlock(struct rmlock *rm, struct rm_priotracker* tracker); int rm_try_rlock(struct rmlock *rm, struct rm_priotracker* tracker); void rm_wlock(struct rmlock *rm); void rm_runlock(struct rmlock *rm, struct rm_priotracker* tracker); void rm_wunlock(struct rmlock *rm); int rm_wowned(const struct rmlock *rm); int rm_sleep(void *wchan, struct rmlock *rm, int priority, const char *wmesg, int timo); options INVARIANTS options INVARIANT_SUPPORT void rm_assert(struct rmlock *rm, int what); #include <sys/kernel.h> RM_SYSINIT(name, struct rmlock *rm, const char *desc); RM_SYSINIT_FLAGS(name, struct rmlock *rm, const char *desc, int flags); 解説 ほとんどの読み込みロックによって、複数のスレッドによって保護されたデータ への共有アクセスができるか、または単一のスレッドによって排他的なアクセス ができます。共有アクセスがあるスレッドは、それらが保護されたデータを読み 込めるだけであるので、reader として知られています。排他的なアクセスがある スレッドは、保護されたデータを変更することができるので、writer として知ら れています。 ほとんどの読み込みロックは、読み込み側ロックとして使用されるほとんどの排 他的ロックのために効率的になるように設計されていて、そのようなものとし て、めったに変化しないデータを保護するために使用されるべきです。共用アク セスのためにロックされた後に排他的なロックを獲得することは、高価な操作で す。 通常、ほとんどの読み込みロックは、rwlock(9) ロックに似ていて、rwlock(9) ロックとして同じロック順序規則に従います。ほとんどの読み込みロックには、 ミューテックス (mutex) のような十分な優先権伝播があります。rwlock(9) と異 なり、ほとんどの読み込みロックは、読み込み側と書き込み側の両方に優先権を 伝播します。これは、rm_rlock() と rm_runlock() に供給される rm_priotracker 構造体の引数によって実装されます。読み込み側は、ロックが RM_RECURSE オプションで初期化されるなら、繰り返すことができます。しかしな がら、書き込み側は、決して繰り返すことはできません。 スリープ可能なほとんどの読み込みロックは、rm_init_flags(). に RM_SLEEPABLE を渡すことによって作成されます。通常のほんどの読み込みロック と異なり、スリープ可能なほとんどの読み込みロックは、sx(9) ロックとして同 じロックの順序規則に従います。スリープ可能なほとんどの読み込みロックは、 書き込み側に優先権を伝播しませんが、それらは、読み込み側に優先権を伝播し ます。書き込み側は、ほとんどの読み込みロックを保持する間にスリープするこ とが許されますが、読み込み側は、そうではありません。sx(9) ロックのよう な、他のスリープ可能なロックと異なり、読み込み側は、スリープを回避するた めに他のスリープ可能なロックで試みの操作を使用しなければなりません。 マクロと関数 rm_init(struct rmlock *rm, const char *name) ほとんどの読み込みロック rm 初期化します。name 記述は、単にデバッ グ目的のために使用されます。この関数は、ロックにおいて任意の他の 操作の前に呼び出されなければなりません。 rm_init_flags(struct rmlock *rm, const char *name, int opts) rm_init() に似て、1 組のオプションのフラグを付けて、ほとんどの読 み込みロック rm を初期化します。opts 引数は、次の 1 つ以上のフラ グを含んでいます: RM_NOWITNESS このロックを無視するよう witness(4) に指示します。 RM_RECURSE スレッドは、rm のための共有ロックを再帰的に獲得する ことができます。 RM_SLEEPABLE スリープ可能なほとんどの読み込みロックを作成しま す。 RM_NEW カーネルが option INVARIANTS でコンパイルされたな ら、rm_init_flags() は、rm が、このオプションが指定 されないなら、介在されている rm_destroy() への呼び 出しなしで、何度も初期化されていないことをアサート します。 rm_rlock(struct rmlock *rm, struct rm_priotracker* tracker) 優先権の伝播のためのロックの読み込み所有者を追跡するために tracker を使用して、読み込み側 (reader) として rm をロックしま す。このデータ構造は、rmlock によって内部的に使用されるだけであ り、rm_runlock() が呼び出されるまで、存続しなければなりません。読 み込み側がスリープできないので、このデータ構造をスタックに割り付 けることができます。任意のスレッドが排他的に、このロックを保持し ているなら、現在のスレッドは、ブロックし、優先権は、排他的な所有 者へ伝播されます。ロックが RM_RECURSE オプションで初期化されたな ら、現在のスレッドに rm で既に獲得された読み込み側のアクセスがあ るとき、rm_rlock() 関数を呼び出すことができます。 rm_try_rlock(struct rmlock *rm, struct rm_priotracker* tracker) 読み込み側 (reader) として rm のロックを試みます。rm_try_rlock() は、ロックが直ちに獲得できないなら、0 を返します。そうでなけれ ば、ロックが獲得され、0 以外の値を返します。ロックが現在書き込み 側 (writer) によって保持されていない間でさえ、rm_try_rlock() が失 敗するかもしれないことに注意してください。ロックが RM_RECURSE オ プションで初期化されたなら、rm_try_rlock() は、現在のスレッドに既 に獲得された読み込み側のアクセスがあるなら、成功します。 rm_wlock(struct rmlock *rm) 書き込み側 (writer) として rm をロックします。ロックを共有する複 数の所有者がいるなら、現在のスレッドは、ブロックします。 rm_wlock() 関数を再帰的に呼び出すことはできません。 rm_runlock(struct rmlock *rm, struct rm_priotracker* tracker) この関数は、以前に rm_rlock() によって獲得された共有されたロック を解放します。tracker 引数は、共有されたロックを獲得するために使 用される tracker 引数とマッチしなければなりません。 rm_wunlock(struct rmlock *rm) この関数は、以前に rm_wlock() によって獲得された排他的なロックを 解放します。 rm_destroy(struct rmlock *rm) この関数は、以前に rm_init() で初期化されたロックを破壊します。rm ロックは、アンロックされていなければなりません。 rm_wowned(const struct rmlock *rm) この関数は、現在のスレッドが rm で排他的なロックを所有しているな ら、0 以外を返します。 rm_sleep(void *wchan, struct rmlock *rm, int priority, const char *wmesg, int timo) この関数は、イベントを待つ間に、不可分に rm を解放します。rm ロッ クは、排他的にロックされなければなりません。この関数へのパラメー タのより詳しい情報については、sleep(9) を参照してください。 rm_assert(struct rmlock *rm, int what) この関数は、rm ロックが what によって指定された状態であることをア サートします。アサーションが真でなく、カーネルが options INVARIANTS と options INVARIANT_SUPPORT でコンパイルされているな ら、カーネルは、パニックします。現在、次の基本的なアサーションが サポートされています: RA_LOCKED 現在のスレッドが rm の共有または排他的なロックのいず れかを保持しているかをアサートします。 RA_RLOCKED 現在のスレッドが rm の共有されるロックを保持している かをアサートします。 RA_WLOCKED 現在のスレッドが rm の排他的ロックを保持しているかを アサートします。 RA_UNLOCKED 現在のスレッドが rm の共有されるか、または排他的ロッ クのいずれかを保持しているかをアサートします。 さらに、次のオプションのフラグの 1 つは、RA_LOCKED, RA_RLOCKED ま たは RA_WLOCKED で指定されます: RA_RECURSED 現在のスレッドが rm の再帰的なロックを保持してい るかをアサートします。 RA_NOTRECURSED 現在のスレッドが rm の再帰的なロックを保持しない かをアサートします。 関連項目 locking(9), mutex(9), panic(9), rwlock(9), sema(9), sleep(9), sx(9) 歴史 これらの関数は、FreeBSD 7.0 で登場しました。 作者 rmlock 機能は、Stephan Uphoff によって書かれました。このマニュアルページ は、rwlock に関して Gleb Smirnoff によって書かれ、Stephan Uphoff によって rmlock に反映するように変更されました。 バグ rmlock 実装は、現在、単一のプロセッサシステムのために最適化されません。 rm_try_rlock() は、書き込み側がないときでさえ、一時的に失敗するかもしれま せんが、別の読み込み側は、ローカル CPU で状態を更新します。 rmlock 実装は、システムのすべての rmlocks によって共有された CPU リストご とに 1 つを使用します。rmlocks が一般的になるなら、CPU キューごとの複数の ハッシュが、書き込み側ロックプロセスを早くするために必要であるかもしれま せん。 FreeBSD 11.2 November 11, 2017 FreeBSD 11.2