mallocルーチンはシステム・ルーチン LIB$VM_MALLOC を呼び出します。 LIB$VM_MALLOC はメモリを割り当てるための汎用ルーチンとして設計されており,幅広いシナリオでブロックの割り当てと再割り当てを効率的に行う目的に呼び出されます。最も一般的な用途は,比較的小さなメモリ・ブロックの管理ですが,これらの状況でのメモリ割り当ての最も重要な側面は効率性です。
LIB$VM_MALLOC は,大きなブロックの分割と隣接するブロックのマージのためにヒープ・ストレージが使い尽くされた場合には,独自の空きスペースを使って要求の処理を行います。メモリはフラグメント化され,未使用ブロックが残ることがあります。ヒープ・ストレージが使い尽くされると,LIB$VM_MALLOC は要求を満たすために独自の空きスペースとマージ済みブロックを管理しますが,さまざまなサイズのメモリ割り当てが行われると,どうしても未使用のブロックが生じます。
LIB$VM_MALLOC はすべての状況で最適な対応を行えるわけではないので,メモリ使用上の特殊なニーズがある場合には,プログラマは独自のメモリ管理を行うようにしてください。これにより,個々のアプリケーションでメモリを最適に使用することができます。
『OpenVMS Programming Concepts Manual』は,使用可能ないくつかのメモリ割り当てルーチンについて解説しています。これらは 3 つの階層レベルにグループ化されています。
- 一番上のレベルには, RTL ヒープ管理ルーチンの LIB$GET_VM と LIB$FREE_VM があります。これらは,任意のサイズのメモリ・ブロックの割り当てと解放を行うメカニズムを提供しています。またこのレベルには,LIB$CREATE_VM_ZONE などのように,ゾーンの概念に基づくルーチンがあります。
- 次のレベルには, RTL ページ管理ルーチンの LIB$GET_VM_PAGE と LIB$FREE_VM_PAGE があります。これらは,指定された数の連続したページを割り当てます。
- 一番下のレベルには, $CRETVA や $EXPREG などのメモリ管理システム・サービスがあります。これらを使用すると,アドレス空間の割り当てを細かく制御することができます。ただしこのレベルでは,プログラマが割り当てを正確に管理する必要があります。