デフォルト・メモリー・マネージャー

デフォルト・メモリー・マネージャーは、パフォーマンスとメモリー所要量のバランスを取ることを試行する汎用のメモリー・マネージャーです。デフォルト・メモリー・マネージャーは、大部分のアプリケーションに対して適切なパフォーマンスを提供しながら必要な追加メモリー量を最小化しようとします。

メモリー・マネージャーは、カルテシアン・バイナリー・サーチ・ツリー内のノードとしてヒープ内のフリー・スペースを維持します。このデータ構造では、ツリーによってサポートされるブロック・サイズ数に制限はなく、考えられる広い範囲のブロック・サイズを使用することができます。

割り振り

各割り振り要求には、少量の追加メモリーが必要です。この追加メモリーは、各割り振り上のヘッダーの必要性、および各メモリー・ブロックの位置合わせの必要性によるものです。各割り振りのヘッダー・サイズは、16 バイトです。各ブロックは、16 バイト境界に位置合わせされている必要があります。したがって、サイズ n の割り振りに必要なメモリーの総量は次のようになります。
size = ROUND (n+16, 16)

例えば、サイズ 37 を割り振ると、ROUND(37+16, 16) のサイズ、すなわち 64 バイトが必要になります。

必要なサイズ以上のツリー・ノードは、ツリーから除去されます。検出されたブロックが必要なサイズを超えている場合、そのブロックは、2 つのブロック、すなわち必要なサイズのブロックと残りのブロックに分割されます。2 番目のブロックは、フリー・ツリーに戻されて将来の割り振りに使用されます。最初のブロックは呼び出し元に戻されます。

フリー・ツリー内で十分なサイズのブロックが検出されない場合、次の処理が発生します。

割り振り解除

free 操作によって割り振り解除されたメモリー・ブロックは、ツリーのルートに戻されます。新規ノードの挿入ポイントまでのパスに沿った各ノードが検査されて、挿入されるノードに隣接していないかどうかが調べられます。隣接している場合は、2 つのノードはマージされ、新たにマージされたノードはツリー内に再配置されます。隣接ブロックが見付からない場合は、ノードは、ツリー内の適切な場所に挿入されます。隣接ブロックをマージすると、ヒープのフラグメント化を減らすことができます。

再割り振り

再割り振り済みブロックのサイズが元のブロックのサイズより大きく、元のブロックは新規サイズ (例えば、位置合わせ要求のための) に対応するための十分なスペースを既に持っている場合、データ移動を伴わずに、元のブロックが戻されます。再割り振り済みブロックのサイズが元のブロックのサイズより大きい場合は、以下の処理が発生します。
  • 要求されたサイズの新規ブロックが割り振られます。
  • データが元のブロックから新しいブロックに移動されます。
  • 元のブロックが free 操作によってフリー・ツリーに戻されます。
  • 新しいブロックが呼び出し元に戻されます。

再割り振り済みブロックのサイズが元のブロックのサイズより小さいときに、サイズの差異が少ない場合、元のブロックが戻されます。そうでない場合、再割り振り済みブロックのサイズが元のブロックのサイズより小さいならば、ブロックは分割されて、残りの部分がフリー・ツリーに戻されます。

デフォルト・メモリー・マネージャーの使用可能化

デフォルト・メモリー・マネージャーは、デフォルトで使用可能になり、以下の環境変数を設定することによって構成されます。
QIBM_MALLOC_TYPE=DEFAULT
QIBM_MALLOC_DEFAULT_OPTIONS=options

デフォルト・メモリー・マネージャーにユーザー指定の構成オプションを指定するには、QIBM_MALLOC_DEFAULT_OPTIONS=options を設定します。ここで、options は、1 つ以上の構成オプションをブランクで区切ったリストです。

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

構成オプション

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

MALLOC_INIT:N

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

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

FREE_INIT:N

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

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

変更の始まりCHUNK_REUSE_MAXSZ:N変更の終わり

変更の始まりこのオプションを使用して、再使用可能なチャンクの最大サイズ (バイト) を指定できます。値 N は 0 より大きい整数を表します。変更の終わり

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

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

変更の始まり
ADDENVVAR ENVVAR(QIBM_MALLOC_DEFAULT_OPTIONS) LEVEL(*JOB) REPLACE(*YES) VALUE('')

ADDENVVAR ENVVAR(QIBM_MALLOC_DEFAULT_OPTIONS) LEVEL(*JOB) REPLACE(*YES) 
VALUE('MALLOC_INIT:255 FREE_INIT:0 CHUNK_REUSE_MAXSZ:5242880') 

ADDENVVAR ENVVAR(QIBM_MALLOC_DEFAULT_OPTIONS) LEVEL(*JOB) REPLACE(*YES) 
VALUE('CHUNK_REUSE_MAXSZ:5242880')
変更の終わり

変更の始まり1 番目の例は、デフォルトの構成値を示します。2 番目の例は、指定されているすべてのオプションを示します。3 番目の例は、5 MB (5242880 バイト) 以上の空のチャンクはシステムに即時に返されることを示します。変更の終わり

関連機能

デフォルト・メモリー・マネージャー用の構成オプションを有効にするために、または指定するために使用可能な関数はありません。環境変数サポートを使用する必要があります。

関連情報