EN JA
MTX_POOL(9)
MTX_POOL(9) FreeBSD Kernel Developer's Manual MTX_POOL(9)

名称

mtx_pool, mtx_pool_alloc, mtx_pool_find, mtx_pool_lock, mtx_pool_lock_spin, mtx_pool_unlock, mtx_pool_unlock_spin, mtx_pool_create, mtx_pool_destroyミューテックスプールルーチン

書式

#include < sys/param.h>
#include < sys/lock.h>
#include < sys/mutex.h>

struct mtx *
mtx_pool_alloc( struct mtx_pool *pool);

struct mtx *
mtx_pool_find( struct mtx_pool *pool, void *ptr);

void
mtx_pool_lock( struct mtx_pool *pool, void *ptr);

void
mtx_pool_lock_spin( struct mtx_pool *pool, void *ptr);

void
mtx_pool_unlock( struct mtx_pool *pool, void *ptr);

void
mtx_pool_unlock_spin( struct mtx_pool *pool, void *ptr);

struct mtx_pool *
mtx_pool_create( const char *mtx_name, int pool_size, int opts);

void
mtx_pool_destroy( struct mtx_pool **poolp);

解説

ミューテックスプールは短期リーフのミューテックスとして使用されるように設計されています。すなわち、最後のミューテックスの一つは mtx_sleep(9) を呼び出す前に取得するかもしれません。それらは、ミューテックスの共有されたプールを使用して動作します。ミューテックスは、有効なものを指すかどうか分からない、供給されたポインタに基づくプールから選ばれるか、または、呼び出し側は、プールから任意の共有されたミューテックスを割り付けて、後の使用のために返されたミューテックスポインタを保存します。

デフォルトで作成される mtxpool_sleep ミューテックスプール中の共有されたミューテックスは、標準で、非再帰的で、ブロック可能なミューテックスで、および適切な状況でのみ使用されるべきです。 mtxpool_lockbuilder ミューテックスプール中のミューテックスは、それらが、より高いレベルロックを構築するために使用することができるように MTX_NOWITNESS フラグで初期化されることを除いて、同様です。他のミューテックスプールは、スピンミューテックスのような異なった特性があるミューテックスを含むように作成されます。

呼び出し側はプールルーチンによって返されたミューテックスをロックして、アンロックすることができますが、ミューテックスが共有されているので、呼び出し側は、それらを破壊するか、またはそれらの特性を変更することを試みるべきではありません。プールミューテックスが通常リーフミューテックス (それを得た後にどのような順序付けられた保証に依存することができないことを意味して) であるのだが、それはまだ慎重に制御された状況の下で他のミューテックスを取得することができます。特に、それがプライベートミューテックス (呼び出し側によって割り付けられ、初期化されたもの) があるなら、それは順序付けられた問題が慎重に説明されるならプールミューテックスを得た後に、それを獲得することができます。これらの場合では、プライベートミューテックスは結局、本当のリーフミューテックスとなります。 wind up = 結局〜する結果となる、結局〜する羽目になる、結局〜の羽目に遭わせる、

プールミューテックスには、次の利点があります:

  1. 構造的なオーバヘッドはありません。すなわち、それらは、過剰に追加することなしに、構造体に関連づけることができます。
  2. ミューテックスは、インタロックデストラクタ操作のためのミューテックスを使用するとき役に立つ、無効のポインタに取得することができます。
  3. 初期化またはデストラクションのオーバヘッドはありません。
  4. mtx_sleep(9) で使用することができます。

そして、次の不利点があります:

  1. 一般的に、リーフミューテックスとしてのみ使用されるべきです。
  2. プール/プール依存順序は保証することができません。
  3. CPU 間の可能な L1 キャッシュマスタ権限競合。

mtx_pool_alloc() は指定されたプールから共有されたミューテックスを取得します。このルーチンは、 mtx_pool サブシステムによって管理された共有されたミューテックスの 1 つを選ぶために簡単なローバ (検索機) を使用します。

mtx_pool_find() は指定されたアドレスに関連している共有されたミューテックスを返します。このルーチンは、それに渡されたポインタのハッシュを作成して、そのハッシュに基づく指定されたプールから共有されたミューテックスを選択します。ポインタはなにか本当のものを指す必要はありません。

mtx_pool_lock(), mtx_pool_lock_spin(), mtx_pool_unlock(), と mtx_pool_unlock_spin() は指定されたアドレスに関連している指定されたプールから共有されたミューテックスをロックして、アンロックします。それらはそれぞれ mtx_pool_find() と mtx_lock(9), mtx_lock_spin(9), mtx_unlock(9)mtx_unlock_spin(9) の組み合わせです。これらのルーチンが最初に操作するミューテックスを見つけなければならないので、それらは、 mtx_pool_find() または mtx_pool_alloc() の以前の呼び出しによって返されたミューテックスポインタを直接使用するより速くありません。

mtx_pool_create() は指定されたサイズの新しいミューテックスプールを割り付けて初期化します。プールサイズは 2 の冪乗でなければなりません。 opts 引数は、プール中の各ミューテックスのためのオプションを設定するために mtx_init(9) に渡されます。

mtx_pool_destroy() は、指定されたプールの各ミューテックスで mtx_destroy(9) を呼び出し、プールに関連づけられたメモリの割り付け解放、およびプールポインタに NULL を代入することを行います。

関連項目

locking(9), mutex(9)

歴史

これらのルーチンは、 FreeBSD 5.0 ではじめて登場しました。
February 6, 2010 FreeBSD