メモリプール
表示
この記事はカテゴライズされていないか、不十分です。 |
メモリプール (Memory pools) は、en:固定サイズブロック割り当てとも呼ばれ、メモリ管理にプールを使用することで、mallocまたはC++のnew演算子に匹敵する動的メモリ確保を可能にするプール。
多くのリアルタイム・オペレーティング・システムは、トランザクション処理機能などのメモリプールを使用する。
解説
[編集]これらの実装ではブロック・サイズが可変であるために断片化が発生するため、パフォーマンスの点から、リアルタイムシステムでの使用は推奨できない。より効率的な解決策はメモリプール(memory pool)と呼ばれる同じサイズの多数のメモリ・ブロックを事前に割り当てることである。アプリケーションは実行時にハンドルで表されるブロックの割り当て、アクセス、および解放ができる。
WebサーバーNginxのような一部のシステムでは、メモリプール という用語は、後で一度に割り当てを解除できる可変サイズの割り当てのグループを指すために使用される。
これはリージョン としても知られており、リージョンベース・メモリ管理を参照されたい。
簡易メモリプール実装
[編集]簡易メモリプール・モジュールは(たとえば)、コンパイル時にモジュールをデプロイするアプリケーションに最適化されたブロック・サイズで3つのプールを割り当てることができる。
アプリケーションは次のインターフェイスを通じてメモリの割り当て、アクセス、解放を行うことができる:
- プールからメモリを割り当てる。この関数は必要なブロックが収まるプールを決定する。そのプールのすべてのブロックがすでに予約されている場合、関数は次に大きいプールでブロックを見つけようとする。割り当てられたメモリ・ブロックはハンドルで表される。
- 割り当てられたメモリへのアクセス・ポインタを取得する。
- 以前に割り当てられていたメモリ・ブロックを解放する。
- ハンドルは(たとえば)、
unsigned int
で実装できる。モジュールはハンドルをプール・インデックス、メモリ・ブロック・インデックス、バージョンに分割することで内部的に解釈できる。プールとメモリ・ブロック・インデックスにより、ハンドルを使用して対応するブロックへの高速アクセスが可能になる一方、新しい割り当てごとにバージョンが増加するため、これによりメモリ・ブロックが既に解放されている(保持期間が長すぎる)ハンドルを検出できる。
mallocとの比較
[編集]利点
- メモリプールを使用すると一定の実行時間でメモリを割り当てることができる。プール内の数千のオブジェクトのメモリ解放はたった1回の操作で済むが、mallocを使用して各オブジェクトにメモリを割り当てている場合は、1回では済まされない。
- メモリプールは階層ツリー構造にグループ化できるため、ループや再帰などの特殊なプログラミング構造に適する。
- 固定サイズブロックのメモリプールは、割り当てられたブロックのサイズなどの特性を記述する割り当てメタデータを割り当てごとに保存する必要がない。特に小規模な割り当ての場合、これによりスペースが大幅に節約が可能になる。
- リアルタイムシステムでの確定的な動作が可能になり、メモリ不足エラーを回避できる。
欠点
- メモリプールは、それらを展開するアプリケーションに合わせて調整する必要がある場合がある。