メインフレームの「動的メモリ管理」を制する:CONTROLLED属性の正しい作法
現場で長年メインフレームを触っていると、「なぜか突発的なS0C4アベンドが止まらない」「オンライン処理のメモリ使用量が右肩上がりだ」という相談をよく受ける。大抵の原因は、静的領域やスタックへの過度な依存、あるいは`CONTROLLED`属性の管理不備にある。
今日は、PL/Iにおける`CONTROLLED`変数、いわゆる「手動メモリ管理」の深淵に触れていこう。これは、バッチ処理の性能を極限まで引き出し、かつ巨大なVSAMレコードをスマートに扱うための強力な武器だ。
—
1. なぜCONTROLLED属性を使うのか?
メインフレーム開発において、`STATIC`(静的)なデータエリアは扱いやすいが、再入可能性(Re-entrancy)を損なうし、何よりメモリの無駄遣いになりがちだ。特に、最大サイズを想定して配列を定義すると、実際のレコード数が少ないバッチジョブでもメモリを占有してしまう。
`CONTROLLED`属性を使えば、必要なタイミングで`ALLOCATE`し、不要になれば`FREE`する。この「プログラマによる能動的なメモリのライフサイクル管理」こそが、堅牢なシステムを作るための第一歩だ。
2. 実践:CONTROLLED変数の管理パターン
以下のコード例を見てほしい。VSAMから読み込んだデータを動的に確保し、処理後に解放する基本形だ。
/i
/ メインプロシージャ:動的メモリ管理の基本 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ 構造体をCONTROLLED属性で宣言 /
DCL 1 WORK_REC BASED(P_WORK_REC),
2 ID CHAR(5),
2 DATA_BODY CHAR(100);
DCL P_WORK_REC POINTER;
DCL WORK_REC_CTRL CHAR(105) CONTROLLED;
/ 制御フロー:ONユニットによる異常系ハンドリング /
ON STORAGE BEGIN;
PUT SKIP LIST(‘ 致命的エラー:メモリ不足が発生しました ‘);
SIGNAL FINISH;
END;
/ メモリ確保:必要なサイズをその都度計算して確保する /
ALLOCATE WORK_REC_CTRL;
/
ここにVSAM読み込み処理が入ると想定
READ FILE(VSAM_FILE) INTO(WORK_REC_CTRL);
/
/ 処理が終わったら即座に解放 /
FREE WORK_REC_CTRL;
END MAIN_PROC;
3. メモリリークを回避するための「鉄則」
現場で最も恐ろしいのは、ループ内で`ALLOCATE`し、`FREE`を忘れて「メモリの肥大化」を招くケースだ。これを防ぐための、ベテランからのアドバイスを3つ贈る。
- 「対」の原則を徹底せよ:`ALLOCATE`を書いたら、その場でコメントアウトしてでも`FREE`を先に書く。あるいは、処理の終了地点に必ず`FREE`が通るよう、`ON ERROR`や`SIGNAL`の制御フローを意識すること。
- スタックサイズへの過信を捨てる:`CONTROLLED`はスタックを消費しない(ヒープメモリ領域を使用する)。スタックオーバーフローで落ちるようなプログラムは、構造を見直して`CONTROLLED`へ移行すべきサインだ。
- ALLOCATION関数を活用する:現在、その変数が何回確保されているかを調べるには、組み込み関数`ALLOCATION(変数名)`が使える。デバッグ時、特定の処理前後でこの値を確認すれば、リークの有無は一目瞭然だ。
4. 現場の教訓:なぜONユニットと組み合わせるのか
メインフレームのバッチ処理は、予期せぬデータ不整合でアベンドすることがある。もしメモリを確保した直後にシステム例外が発生したらどうなるか?
`ON FINISH`や`ON ERROR`ユニットを適切に配置し、異常終了時に確保済みのメモリを確実に`FREE`できるような「クリーンアップ・ルーチン」を設計に組み込んでおくべきだ。これが、長時間稼働するオンラインプログラムや、巨大なソート・マージを行うバッチにおける「プロの仕事」の境界線となる。
最後に
PL/Iの`CONTROLLED`は、現代の言語における`malloc/free`や`new/delete`の先祖にあたる。古い言語だと軽視するなかれ。IBMメインフレームという極めて制約の厳しい環境下で、メモリというリソースを指先で操る快感と、それを完璧に制御しきった時の安定感。これこそが、アーキテクトが味わうべき醍醐味だ。
今日から、静的に定義された無駄な配列を眺めるのはやめよう。必要な時に、必要な分だけ。その意識が、君の書くコードをより堅牢で、より「メインフレームらしい」傑作へと昇華させるはずだ。
何か実装上のハマりどころや、マイグレーション時の挙動で疑問があれば、いつでも聞いてくれ。現場の知見を総動員して回答しよう。
