[論文レビュー] An Extended Low Fat Allocator API and Applications
本稿では、オブジェクトサイズとベースアドレスをネイティブポインタ内にエンコードする低脂肪ポインタ(low-fat pointers)を活用することで、サイズ、ベース、オフセットの取得といった効率的で低レイテンシの操作を可能にする拡張されたLowFatアロケータAPIを提案する。主な貢献は、ヒープ、スタック、グローバルオブジェクトのすべてにおいて、これらの拡張操作を一貫してサポートすることであり、これによりメモリエラー検出、コンパクトなデータ構造、最小限のパフォーマンスオーバーヘッドで実現可能な型付きポインタといった新規応用が可能になる。
The primary function of memory allocators is to allocate and deallocate chunks of memory primarily through the malloc API. Many memory allocators also implement other API extensions, such as deriving the size of an allocated object from the object's pointer, or calculating the base address of an allocation from an interior pointer. In this paper, we propose a general purpose extended allocator API built around these common extensions. We argue that such extended APIs have many applications and demonstrate several use cases, such as (manual) memory error detection, meta data storage, typed pointers and compact data-structures. Because most existing allocators were not designed for the extended API, traditional implementations are expensive or not possible. Recently, the LowFat allocator for heap and stack objects has been developed. The LowFat allocator is an implementation of the idea of low-fat pointers, where object bounds information (size and base) are encoded into the native machine pointer representation itself. The "killer app" for low-fat pointers is automated bounds check instrumentation for program hardening and bug detection. However, the LowFat allocator can also be used to implement highly optimized version of the extended allocator API, which makes the new applications (listed above) possible. In this paper, we implement and evaluate several applications based efficient memory allocator API extensions using low-fat pointers. We also extend the LowFat allocator to cover global objects for the first time.
研究の動機と目的
- サイズ、ベース、オフセットといった割り当てメタデータを取得するための、従来のmalloc APIに対する標準的で効率的な拡張が不足している問題に対処する。
- 一貫した拡張APIを通じて、ヒープ、スタック、グローバルオブジェクトのすべてを均一に扱えるようにする。
- 低脂肪ポインタエンコードが、パフォーマンスに敏感なアプリケーションにとって重要な、極めて最適化されたインライン操作を可能にすることを示す。
- 従来のアロケータでは高いオーバーヘッドのために実現が困難だった、新しいプログラミングパターンやデータ構造を可能にする。
- LowFatアロケータをグローバルオブジェクトのサポートへ拡張し、C/C++プログラムにおける主なオブジェクトタイプを完全にカバーする。
提案手法
- 64ビットポインタのアライメントと未使用ビットを活用して、ビットフィールドを用いてオブジェクトサイズとベースアドレスをポインタ表現に直接埋め込む。
- 数個のインラインアセンブリ命令にコンパイルされる低脂肪ポインタ操作を用いて拡張APIを実装し、ランタイムコストを最小限に抑える。
- グローバル変数のサポートを拡張するため、メタデータを照会テーブルに格納することで、すべてのオブジェクトタイプで一貫した振る舞いを実現する。
- 境界チェック、隠しメタデータの格納、型付きポインタ、コンパクトなベクタといった応用を、拡張APIを用いて実装する。
- ベクタの構築、アクセス、サイズ計算といった操作におけるマイクロベンチマークを用いて、LowFatと従来のアプローチおよびBoehm GCベースの手法を比較してパフォーマンスを評価する。
- LowFat操作の効率性を活かして、境界チェックのような頻繁なメタデータアクセスを要する、ハーデンティングツールに適した応用をサポートする。
実験結果
リサーチクエスチョン
- RQ1グローバル変数に対しても低脂肪ポインタエンコードを拡張することで、すべてのオブジェクトタイプに均一なメタデータアクセスを提供できるか?
- RQ2従来のアロケータと比較して、低脂肪ポインタを用いた拡張アロケータ操作(サイズ、ベース、オフセット)はどの程度効率的に実装できるか?
- RQ3拡張されたLowFat APIに基づくアプリケーションは、どのような条件下でパフォーマンスオーバーヘッドを負い、どのような状況で有益か?
- RQ4拡張APIは、従来の標準アロケータでは実現が困難だった、型付きポインタやコンパクトなデータ構造といった新しいプログラミングパターンを可能にするか?
- RQ5類似したユースケースにおいて、LowFatベースの実装はBoehmガベージコレクタと比較してどの程度のパフォーマンスを示すか?
主な発見
- 拡張されたLowFat APIでは、サイズ、ベース、オフセットの操作が数個のインライン命令で実行され、平均して10サイクル未満のレイテンシを達成する。
- 低脂肪ベクタは、明示的なlenおよびposフィールドを削除することでメモリオーバーヘッドを低減し、すべてのフィールドが1ワードのサイズの場合、1ベクタあたり3ワードの節約が可能になる。
- 低脂肪ベクタの構築には、サイズアラインメントに応じて1.33倍から2倍のパフォーマンスオーバーヘッドが生じるが、アクセスのオーバーヘッドは約1.2倍程度である。
- 低脂肪タグ付きポインタは、サイズ型ポインタベンチマークにおいて、従来のタグ付きポインタを約20%高速に処理するが、拡張タグ付きポインタは約27%遅延するが、より多くのタグビットをサポートする。
- Boehm GCベースの実装では、ライブラリ呼び出しのオーバーヘッドのため、LowFatの2倍以上遅く、インライン操作の利点が顕著に現れる。
- グローバルオブジェクトへの低脂肪ポインタの拡張により、ヒープ、スタック、グローバルメモリを完全にカバーすることができ、拡張APIがC/C++プログラム全体に普遍的に適用可能になる。
より良い研究を、今すぐ始めましょう
論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。
クレジットカード登録不要
このレビューはAIが作成し、人間の編集者が確認しました。