Malloc マルチヒープ

デフォルトでは、malloc サブシステムは単一ヒープ、またはフリー・メモリー・プールを使用しますが、

オプションで、フリー・メモリーのヒープを 1 つだけでなく複数使用することを可能にするマルチヒープ機能も提供しています。

malloc サブシステムにおいて複数のヒープ機能を提供する目的は、マルチプロセッサー・システムで実行されるスレッド化されたアプリケーションのパフォーマンスを向上させることです。 malloc サブシステムが単一のヒープを使用するように制限されている場合に、別個のプロセッサーで実行中の複数のスレッドから同時にメモリー割り当て要求を受け取ると、それらをシリアライズします。 したがって、malloc サブシステムは一時点で 1 つのスレッドしかサービスできず、マルチプロセッサー・システムのパフォーマンスに深刻な影響を及ぼします。

malloc マルチヒープ機能が使用可能な場合、malloc サブシステムは使用に合わせて定まった個数のヒープを作成し、 2 番目のスレッドが開始された後で複数のヒープの使用が始まります (プロセスはマルチスレッドになります)。 各メモリー割り当て要求は、使用可能なヒープのいずれかを使用してサービスを受けることになります。 そして、malloc サブシステムは、同時にサービスを要求するスレッドの数がヒープの数以下である限り、 メモリー割り当て要求を並列に処理することができます。

同時にサービスを要求するスレッドの数がヒープの数を上回ると、それ以降に加わる同時の要求はシリアライズされることになります。 実行中にこれが発生しない限り、マルチプロセッサー環境で複数のスレッドが malloc サブルーチンを呼び出している場合には、malloc サブシステムのパフォーマンスは顕著に改善されるはずです。

malloc マルチヒープの使用可能化

malloc マルチヒープは、デフォルトでは使用できません。 MALLOCOPTIONS 環境変数を設定することによって使用可能となり構成されます。 malloc マルチヒープを デフォルトの設定で使用可能にするには、プロセスを始動する前に MALLOCOPTIONS=multiheap を設定します。 この方法で MALLOCOPTIONS を設定すると、malloc マルチヒープをデフォルト構成 (32 ヒープ、高速ヒープ選択アルゴリズム) で使用することができるようになります。

malloc マルチヒープ・オプション

Malloc マルチヒープのオプションは、次のとおりです。

  • multiheap:n
  • considersize

これらのオプションのそれぞれについては、本書において後で詳細に説明します。

これらのオプションを設定するには、以下の構文を使用します。

MALLOCOPTIONS=[multiheap:n] | [considersize]

1 つまたは両方のオプションを、コンマで区切りさえすれば任意の順序で指定することができます。 下記の例のとおりです。

MALLOCOPTIONS=multiheap:3,considersize

上記の例では、malloc マルチヒープは、3 つのヒープで、プロセス・サイズを最小にしようとする何らかの低速ヒープ選択アルゴリズムを用いて、使用できるようになります。

各構成オプションは、MALLOCOPTIONS の設定時に 1 回だけ指定します。 1 つの設定に対して構成オプションが複数回指定された場合は、最後のインスタンスのみが適用されることになります。

Malloc マルチヒープのオプションについて、以下で説明します。

multiheap:n
デフォルトでは、malloc マルチヒープで使用できるヒープの最大数は、32 です。 multiheap:n オプション (n はヒープの数) を使用して、ヒープの最大数を 1 から 32 までの任意の値に変更することができます。 n が所定の範囲外に設定されている場合は、デフォルト値である 32 が使用されます。 プロセスの要求に応じて必要な数のヒープだけを使用可能にするようにします。 不必要にヒープを使用可能にすると、フラグメントと無駄な量が増加します。
considersize
デフォルトでは、malloc マルチヒープは使用可能な次のヒープを選択します。 considersize オプションが指定されている場合は、malloc マルチヒープは代替ヒープ選択アルゴリズムを使用します。このアルゴリズムでは、その要求を処理するために十分なフリー・スペースを持っている使用可能なヒープを選択しようとします。 これにより sbrk サブルーチン呼び出しの数が削減され、プロセスの作業セット・サイズを最小化することができます。 ただし追加の処理が必要となるため、considersize ヒープ選択アルゴリズムは、デフォルトのヒープ選択アルゴリズムと比べるとやや低速になります。

ヒープがスペースを割り当てられない場合、 malloc サブルーチンは NULL を戻し、errno を ENOMEM に設定します。 現在のヒープ内に使用可能メモリーがない場合、malloc サブシステムは他のヒープに使用可能スペースがないか検査します。