メインフレームの守護神PL/I:STORAGE条件でメモリ枯渇を華麗にハンドリングする
こんにちは!レガシーシステムの荒波を渡り歩くシステムアーキテクトです。
JavaやCOBOLの経験がある皆さんにとって、PL/I(ピーエル・アイ)という言語は、どこか古めかしくて少し近寄りがたい存在に見えるかもしれませんね。でも安心してください。PL/Iは「科学技術計算」から「事務処理」までこなす、極めて柔軟で懐の深い言語なんです。
今回は、そんなPL/Iの現場で時折遭遇する、ちょっと肝が冷えるトラブル「メモリ枯渇(STORAGE条件)」への対処法について、現場の知恵を交えてお話しします。
—
1. なぜPL/Iで「STORAGE」が問題になるのか?
Javaを使っていると、`new`したオブジェクトはガベージコレクション(GC)が勝手に掃除してくれますよね。でも、メインフレームのPL/Iの世界では、メモリの確保(`ALLOCATE`)と解放(`FREE`)は、基本的に「プログラマの意志」で行うのが基本です。
もし、巨大な配列やリストを確保しすぎて、OSから「もうこれ以上、メモリは渡せないよ!」と言われたらどうなるでしょうか。システムは異常終了(ABEND)してしまいます。これを防ぐための安全装置が、STORAGE条件のハンドリングです。
—
2. STORAGE条件のONユニット:転ばぬ先の杖
PL/Iには、エラーが発生した際に特定の処理を割り込ませる「ONユニット」という仕組みがあります。これを使うと、メモリ確保に失敗した瞬間に、パニックを起こす前に「安全な着地」をさせることができるんです。
実践的なコード例
では、実際にメモリを確保しようとして失敗した場合のリカバリコードを見てみましょう。
1
/ メインプログラムの定義 /
TEST_PROG: PROCEDURE OPTIONS(MAIN);
/ メモリ確保に失敗したときに呼ばれる「お守り」の定義 /
ON STORAGE BEGIN;
PUT SKIP LIST(‘警告: メモリ領域が枯渇しました。安全に処理を終了します。’);
/ ここでログ出力や、一時ファイルのクローズ処理などを行う /
CALL EMERGENCY_CLEANUP;
STOP; / プログラムを正常に終わらせる /
END;
/ 動的メモリ確保の例 /
BEGIN;
DECLARE POINTER_VAR POINTER;
DECLARE 1 MY_DATA BASED(POINTER_VAR),
2 ITEM_COUNT FIXED BIN(31),
2 BUFFER CHAR(1000000); / とてつもなく大きな領域を要求 /
/ 実際にメモリを確保する命令 /
ALLOCATE MY_DATA;
PUT SKIP LIST(‘メモリ確保成功!処理を続行します。’);
/ … ここで何らかの複雑な処理を行う … /
FREE MY_DATA;
END;
END TEST_PROG;
—
3. 初学者がつまずきやすい「PL/I特有のルール」
コードを見て「`BASED`って何?」「`POINTER`ってポインタ?」と戸惑ったかもしれませんね。PL/Iのデータ宣言には、少し独特なルールがあります。
- BASED属性: 「ここには実体がないけれど、この形の箱が欲しいよ」という宣言です。`ALLOCATE`命令が実行されるまで、メモリ上のどこを指しているのか未定の状態です。
- POINTER型: メモリ上の「住所」を保持する変数です。`ALLOCATE`すると、PL/Iが空いている住所を探してきて、その番号をこの変数に入れてくれます。
- STORAGE条件の捕捉範囲: `ON`ユニットは、書かれた場所からそのプログラム(またはブロック)が終了するまで有効です。もしプログラムの冒頭に書いておけば、どこでメモリ不足が起きても必ずキャッチしてくれます。
—
4. 現場のアドバイス:リカバリの極意
このSTORAGE条件を実装する際、現場のシニアエンジニアとして一つだけアドバイスがあります。
「リカバリ処理の中で、さらにメモリを確保しないこと」
もし、メモリが枯渇してパニック状態になっているのに、その中でさらに大きな領域を確保しようとすると、プログラムは再びSTORAGE条件に陥り、無限ループや二重の異常終了を引き起こします。
- ログ出力は最小限に:複雑な構造体の文字列変換などは控えましょう。
- フラグ管理を徹底:処理がどこまで進んでいたかをフラグで管理し、再実行時に「どこから再開すればいいか」が分かるようにしておくのがベストです。
—
最後に:怖がる必要はありません
PL/Iのメモリ管理は、一見すると「自分で管理しなきゃいけないから大変」に見えるかもしれません。ですが、これは「コンピュータの資源を限界まで使い倒すための、エンジニアへの信頼」の証でもあります。
STORAGE条件を適切にハンドリングできるようになれば、あなたはもうPL/I初級者の壁を一つ突破したと言っていいでしょう。次に基幹システムのソースコードを開くときは、ぜひ`ON STORAGE`の記述があるか探してみてください。先人たちの知恵が、そこに隠されているはずですよ。
また次回の記事でお会いしましょう!質問があればいつでもコメントくださいね。
