1.64 ヒープ 2 代替ヒープ実装

ヒープ 2 はコンパクトな実装であり、未使用ブロックの数が増えるに従って malloc() または free() のパフォーマンスコストが対数的に増大します。

割り当て方式には、アドレスによる最初適合方式が使用されます。割り当て可能な最小ブロックは 12 バイトであり、それに加えて 4 バイトのオーバーヘッドがかかります。
ヒープ 2 は、何百という未使用ブロックがあっても処理時間のパフォーマンスをほぼ一定に保つ必要がある場合にお勧めします。この代替標準実装を選択するには、以下のいずれかを使用します。
  • アセンブリ言語からの IMPORT __use_realtime_heap
  • C からの #pragma import(__use_realtime_heap)
ヒープ 2 のリアルタイムヒープ実装では、ヒープ用に確保する最大のアドレス空間をあらかじめ決めておく必要があります。アドレスの範囲が狭くなればなるほど、アルゴリズムの効率性が増します。
デフォルトでは、ヒープ範囲にはそのヒープの開始位置(__rt_initial_stackheap() または __rt_heap_extend() によってヒープマネージャに渡される、最初のメモリチャンクの開始位置として定義されます)から 16MB が割り当てられます。
ヒープの上下限は以下によって指定されます。
struct __heap_extent {     unsigned base, range; }; __value_in_regs struct __heap_extent __user_heap_extent(     unsigned defaultbase, unsigned defaultsize);
__user_heap_extent() の関数プロトタイプは rt_misc.h に収録されています。
(ヒープ 1 のアルゴリズムでは、ヒープ範囲の上下限を指定する必要がないため、この関数は呼び出されません。)
以下の場合は __user_heap_extent() を実装する必要があります。
  • 16MB のアドレス空間を超える範囲のヒープを必要とする場合。
  • 使用するメモリモデルにおいて、最初に提供されるメモリブロックよりも下位アドレスのメモリブロックが提供される可能性がある場合。
ヒープに使用するアドレス空間の範囲が狭いと事前にわかっている場合、__user_heap_extent() を実装する必要はありませんが、再定義するとヒープアルゴリズムの速度を上げることができます。
入力パラメータは、このルーチンが定義されていない場合に使用されるデフォルト値となります。例えば、デフォルトのベース値を変更せずに、サイズだけを調整することも可能です。

返されるサイズフィールドは 2 の累乗でなければなりません。ライブラリではこの確認が行われないため、この要件を満たしていないと、予想外のエラーが発生します。サイズとしてゼロが返されると、ヒープ範囲が 4 GB に設定されます。
関連する概念
1.63 ヒープ 1 標準ヒープ実装
1.65 ベアマシン C からのヒープ実装の使用
関連する参考文書
1.61 ARM で提供されるヒープおよびヒープを使用するライブラリ関数の使用の回避
1.62 メモリ割り当て関数の C ライブラリサポート
4.53 __user_heap_extent()
1.62 メモリ割り当て関数の C ライブラリサポート
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.