変更の始まり変更の始まり

高速プール・メモリー・マネージャー

高速プール・メモリー・マネージャーは、メモリーを一連のプールに分割します。高速プール・メモリー・マネージャーは、小さな割り振り要求を数多く出すアプリケーションのヒープ・パフォーマンスを改善することを目的としています。高速プール・メモリー・マネージャーが使用可能な場合、指定された範囲内のブロック・サイズに収まる割り振り要求には、プール内でセルが割り当てられます。これらの要求は、この範囲から外れた要求よりも迅速に処理できます。この範囲から外れた割り振り要求は、デフォルト・メモリー・マネージャーと同じ方法で処理されます。

プールは、メモリーのブロック (エクステントと呼ばれます) で構成されます。そのブロックは、事前定義された数のさらに小さな同一サイズのブロック (セルと呼ばれます) に細分化されています。各セルは、メモリーのブロックとして割り振ることができます。各プールはプール番号を使用して識別されます。最初のプールがプール 1 で、2 番目のプールがプール 2 で、3 番目のプールがプール 3 です。それ以降も同様です。最初のプールが最も小さく、その後の各プールのサイズは、前のプールと等しいかそれより大きくなります。

プール数および各プールのセル・サイズは、高速プール・メモリー・マネージャーの初期設定時に決定されます。

割り振り

割り振り要求がプールによって定義されているセル・サイズの範囲内に収まっているときに、プールのいずれかから 1 つのセルが割り振られることになります。それぞれの割り振り要求は、スペースを節約して使うために、選択できる最小のプールからサービスを受けます。

プールに対して最初の要求が発生すると、1 つのエクステントがそのプールについて割り振られ、要求はこのエクステントから満たされます。 そのエクステントがすべて使用されるまで、このプールに対する後続の要求も、そのエクステントによって満たされます。エクステントがいっぱいになると、プールに新しいエクステントが割り振られます。

割り振り解除

free 操作によって割り振り解除されたメモリー・ブロック (セル) は、そのセルを含むプールに関連付けられたフリー・キューに追加されます。各プールには、解放されまだ再割り振りされていないセルを含むフリー・キューがあります。 そのプールからの追加割り振り要求は、フリー・キューからのセルを使用します。

再割り振り

再割り振り済みブロックのサイズが元のブロックと同じプール内に収まっている場合、データ移動を伴わずに、元のブロックが戻されます。そうでない場合、要求されたサイズの新規ブロックが割り振られ、データは元のブロックから新規ブロックに移動され、元のブロックは free 操作によってフリー・キューに戻され、新規ブロックが呼び出し元に戻されます。

高速プール・メモリー・マネージャーの使用可能化

高速プール・メモリー・マネージャーは、デフォルトでは使用可能になりません。高速プール・メモリー・マネージャーは、_C_Quickpool_Init() 関数および _C_Quickpool_Debug() 関数を呼び出すか、または以下の環境変数を設定することによって使用可能になり構成されます。

QIBM_MALLOC_TYPE=QUICKPOOL
QIBM_MALLOC_QUICKPOOL_OPTIONS=options

デフォルトの設定値を使用して高速プール・メモリー・マネージャーを使用可能にする場合、QIBM_MALLOC_QUICKPOOL_OPTIONS 環境変数を指定する必要はありません。この場合は、QIBM_MALLOC_TYPE=QUICKPOOL のみを指定する必要があります。ユーザー指定の構成オプションを使用して高速プール・メモリー・マネージャーを使用可能にするには、QIBM_MALLOC_QUICKPOOL_OPTIONS=options を設定します。ここで、options は、1 つ以上の構成オプションをブランクで区切ったリストです。

QIBM_MALLOC_TYPE=QUICKPOOL 環境変数が指定されているときに _C_Quickpool_Init() 関数が呼び出された場合は、環境変数の設定が _C_Quickpool_Init() 関数より優先され、_C_Quickpool_Init() 関数は、代替ヒープ・マネージャーが既に使用可能にされていることを示す値 -1 を戻します。

QIBM_MALLOC_TYPE=QUICKPOOL 環境変数が指定されているときに、高速プール・メモリー・マネージャー特性を変更するために _C_Quickpool_Debug() 関数が呼び出された場合、_C_Quickpool_Debug() 関数のパラメーターで指定された設定は環境変数の設定をオーバーライドします。

構成オプション

以下の構成オプションを使用できます。

POOLS:(C1 E1)(C2 E2)...(Cn En)

このオプションを使用して、使用するプールの数とともに各プールのセル・サイズおよびエクステント・セル数を指定することができます。添え字値 n は、プールの数を示します。n の最小有効値は 1 です。n の最大有効値は 64 です。

値 C1 はプール 1 のセル・サイズを示し、C2 はプール 2 のセル・サイズを示し、Cn はプール n のセル・サイズを示します。それ以降も同様です。この値は 16 バイトの倍数である必要があります。この値が 16 バイトの倍数でない数に指定された場合、そのセル・サイズは 16 バイトの倍数に一番近い数に切り上げられます。 最小有効値は 16 で最大有効値は 4096 です。

値 E1 はプール 1 のエクステント・セル数を示し、E2 はプール 2 のエクステント・セル数を示し、En はプール n のエクステント・セル数を示します。それ以降も同様です。値は、単一エクステント内のセル数を指定します。値には任意の非負数を指定できますが、アーキテクチャーによる制約のためにエクステントの合計サイズは制限される場合があります。値ゼロは、実装で大きな値を選択できることを示します。

このオプションのデフォルト値は、"POOLS:(16 4096) (32 4096) (64 1024) (128 1024) (256 512) (512 512) (1024 256) (2048 256) (4096 256)" です。デフォルトは、サイズが 16、32、64、128、256、512、1024、2048、および 4096 バイトのセルを持つ、9 個のプールを表します。それぞれのエクステント内のセル数は、4096、4096、1024、1024、512、512、256、256、および 256 です。

MALLOC_INIT:N

このオプションを使用して、割り振られたメモリーの各バイトを指定値に初期化することを指定できます。値 N は、0 から 255 までの範囲の整数を表します。

このオプションは、デフォルトでは使用可能になりません。

FREE_INIT:N

このオプションを使用して、解放されたメモリーの各バイトを指定値に初期化することを指定できます。値 N は、0 から 255 までの範囲の整数を表します。

このオプションは、デフォルトでは使用可能になりません。

COLLECT_STATS

このオプションを使用することにより、高速プール・メモリー・マネージャーが、統計を収集してアプリケーションの終了時にその統計を報告するように指定することができます。高速プール・メモリー・マネージャーは、このオプションが指定されているときに、atexit(_C_Quickpool_Report) を呼び出すことによって統計を収集します。その報告書内に含まれる情報についての詳細は、_C_Quickpool_Report() の説明に記載されています。

このオプションは、デフォルトでは使用可能になりません。

任意の数のオプションを任意の順序で指定することができます。ブランクが、構成オプションを区切るために有効な唯一の区切り文字です。各構成オプションは、1 回だけ指定するようにしてください。1 つの構成オプションが複数回指定された場合は、最後のインスタンスのみが適用されることになります。構成オプションが無効な値で指定された場合、その構成オプションは無視されます。

ADDENVVAR ENVVAR(QIBM_MALLOC_QUICKPOOL_OPTIONS) LEVEL(*JOB) REPLACE(*YES) 
VALUE('POOLS:(16 4096) (32 4096) (64 1024) (128 1024) (256 512) (512 512) (1024 256) 
(2048 256) (4096 256)')

ADDENVVAR ENVVAR(QIBM_MALLOC_QUICKPOOL_OPTIONS) LEVEL(*JOB) REPLACE(*YES)
VALUE('POOLS:(16 1000) MALLOC_INIT:255 FREE_INIT:0 COLLECT_STATS')

1 番目の例は、デフォルトの構成値を示します。2 番目の例は、指定されているすべてのオプションを示します。

関連機能

_C_Quickpool_Init() 関数は、高速プール・メモリー・マネージャーを使用可能にすることができます。また、_C_Quickpool_Init() 関数は、使用するプールの数、各プールのセル・サイズおよびエクステント・セル数を指定します。

_C_Quickpool_Debug() 関数は、その他の構成オプションを使用可能にします。

_C_Quickpool_Report() 関数が使用されるのは、メモリー統計を報告するためです。

注:
  1. 高速プール・メモリー・マネージャーのデフォルト構成は、小さな割り振り要求を数多く出す多くのアプリケーションにおいて、パフォーマンスの改善を実現します。ただし、デフォルト構成を変更することにより、さらに高い効果を得ることができる場合があります。デフォルト構成を変更する前に、アプリケーションのメモリー所要量および使用方法に精通する必要があります。高速プール・メモリー・マネージャー構成の細かな調整を行う COLLECT_STATS オプションを指定して、高速プール・メモリー・マネージャーを使用可能にすることができます。
  2. メモリー所要量および使用方法はさまざまであるため、アプリケーションによっては、高速プール・メモリー・マネージャーが使用しているメモリー割り振り方式の利点を得ることができない場合があります。したがって、高速プール・メモリー・マネージャーをシステム全体で使用可能にするのは望ましくありません。最良のパフォーマンスを得るには、高速プール・メモリー・マネージャーをアプリケーションごとに使用可能にして構成します。
  3. 同サイズのセルを持つ複数のプールを作成することができます。これは、同じようなサイズの割り振りを数多く実行する、マルチスレッド・アプリケーションの場合に役立つことがあります。競合がまったく発生していない場合、要求されたサイズの最初のプールが使用されます。最初のプールで競合が発生した場合、高速プール・メモリー・マネージャーは、競合を最小化するために、他の同サイズのプールからセルを割り振ります。

関連情報

変更の終わり変更の終わり

[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]