導入
メインフレームのPL/I開発において、メモリ管理はパフォーマンスと安定性を左右する重要な要素です。特に、データ件数が実行時まで不明な場合、静的な配列定義ではメモリの浪費や領域不足(Storage condition)を招きます。今回解説する「CONTROLLED(CTL)記憶域クラス」は、プログラム実行中に必要な分だけメモリを確保し、不要になれば解放できる、まさに「メモリの柔軟性」を体現する機能です。本稿では、動的配列の効率的な制御方法を解説します。
基礎知識
PL/Iにおける配列の記憶域クラスには、主にAUTO(自動)とCTL(制御)があります。AUTO配列は、プロシージャが呼び出された瞬間にサイズが確定し、プロシージャ終了時に破棄されます。一方、CTL配列はプロシージャの開始に関わらず、ALLOCATE文が実行されたタイミングでメモリが確保されます。これにより、処理の途中で配列サイズを動的に変更したり、計算結果に応じて必要な分だけ領域を確保したりすることが可能になります。
実装/解決策
CTL配列を制御する際は、ALLOCATE文でサイズを指定し、不要になった時点でFREE文を実行します。特に重要なのは、同じ名前のCTL配列に対して再度ALLOCATEを実行した場合の挙動です。これは上書きではなく、古い領域の上に新しい領域が「スタック」される(世代管理される)仕組みです。そのため、メモリリークを防ぐには、ALLOCATEの回数とFREEの回数を論理的に一致させる運用が必須となります。
サンプルプログラム
以下のサンプルは、動的に決定したサイズで配列を確保し、処理後に解放する基本パターンです。
/ 制御付き配列の定義 /
DCL MY_CTL_ARR(1:) FIXED BIN(31) CONTROLLED;
DCL DYNAMIC_SIZE FIXED BIN(31);
/ サイズを動的に決定 /
DYNAMIC_SIZE = 100;
/ メモリを確保 /
ALLOCATE MY_CTL_ARR(1:DYNAMIC_SIZE);
/ 配列への操作 /
MY_CTL_ARR(1) = 10;
MY_CTL_ARR(DYNAMIC_SIZE) = 999;
/ 確保したメモリを解放 /
FREE MY_CTL_ARR;
応用・注意点
現場で最も注意すべきは、「FREEを忘れたままループ内でALLOCATEを繰り返す」という実装ミスです。前述の通り、CTLはメモリ層を積み重ねるため、ループ内でFREEを怠ると、あっという間に領域不足(STORAGE CONDITION)が発生し、ジョブが異常終了します。また、REALLOCATEという概念は存在しないため、サイズを変更したい場合は「現在の配列の内容をコピー」→「現在の配列をFREE」→「新しいサイズでALLOCATE」という手順を踏む必要があります。複雑なデータ構造を扱う際は、スタックの深さを意識した設計を心がけてください。

コメント