WindowsとTCP/IPでどんなに仕事が楽になったことか…

By kamii - Last updated: 日曜日, 10月 26, 2008

私は1980年代後半からメインフレームのシステム系パッケージソフトを扱う仕事をしてきました。
当時担当してた製品はトラブルが多く毎日のようにいろんなユーザーから「また落ちたぞ、ダンプ出てるから取りにきて!」って言う嬉しくないコールがバンバン入る。ダンプって言うのはメモリー上に展開されてるプログラムやデータをはき出した物。これが16進数と対応したキャラクター文字で編集された診断用のリストとして出力される。ダンプリストのサンプル

アプリケーションの場合は自分のプログラムだけがわかればよかったり、使うメモリーも少なかったりするのでそんなに量がでない。でもサーバー系のソフトなんかだとメモリーは沢山使うは、さらに機能がシステム系だったりすると自分のプログラムやデータだけじゃ済まなくて、OS全体の共通エリアやOS自身のモジュール域なんかも必要だったりして、その出力量が半端じゃない。10万行、20万行とかはありがちで時には50万行なんてとてつもない量が出たりする。

それを1ページ66行133桁の用紙に出すんですが、すごい紙の量になる。ストックフォームって言ってましたが印刷用紙が入った箱が高さ30から40cmぐらいあって、まぁ普通で1箱、多いと2箱、3箱分ぐらい出ちゃったりする。当時でもメインフレームのプリンター、特にレーザープリンター、それも高性能のはもの凄いスピードで印刷できるからストックフォーム1箱分程度の印刷ならさして時間は掛からない。これだけの量になるとスプールに残しておいてもかなりのスペースを占めるからお客さんとしてはさっさか掃き出したい。なので「こっち来る間に出しとくからね」となる。あまりに頻繁だとトラブルこと自体もさることながら「今度は本当に紙代請求するよ!」なんて言われたりもした。(実際取られたことはなかったな)

さて前置きが長くなってしまった。まず最初にツライのはこの大量の紙が入った箱を会社に持って帰ること。さすがに2箱以上になると電車は無理なのでタクシー、でも若い身分でしょっちゅうタクシー使うとそれはそれでにらまれたりする。1箱程度だと2つに分けて紙袋に突っ込む。でも指がちぎれそうに痛い。真冬で雪が降った日に京葉線の何とかって駅まで延々とそれを持って歩いた時、本当につらくて本気で捨てようかと思った。

会社に戻ってからは、そのダンプリストを調べてデバッグが始まるんですが何せ紙なんで作業効率悪いことこの上ない。どのモジュールで落ちたか?何のエラーで落ちたか?ぐらいはすぐわかる。問題はその げ・ん・い・ん。まずは何でそんなことが起きたのかって言う原因を調べなければならないがこれがまた大変。紙だから検索なんて気の利いたことができない。アドレスで場所を探す場合はまだいいけど、ある特定の文字列を見つけるとか、バイナリー値を探したいなんて時は、リストの量が多いとたまらない。でもその頃はそうするしかなかったからね。調べるスピードが追っつかないからそのうち調査待ちのダンプの箱が何十個って積み上がってたりしたもんです。本当にやばくて緊急なものは徹夜してでもやったけど、そうでないとバカらしくてやってらんないってことになり、割とさっさか帰っちゃったりしてました。「いや?徹夜して調べたんですど、むずかしくてまだわかんないんですよ。すいませんもうしばらく時間下さい」なんてしれっとして中間報告。自分が作ったプログラムならいざ知らず、外国のそれも会ったこともない奴が作ったプログラムのバグで何で俺がこんな思いしなきゃなんないのって思いの方が強いからふてくされちゃうんですね、私は。それでもさすがに量がたまるとそれはそれでまずくなってくるので徹夜したり、休みをつぶしたりはしょっちゅうでした。ごめんなさいまだ前置き長いですね。

昔からメインフレームやってた人なら「何でTSOとか使わないの?」と思ったかも知れません。小さい会社だったんでそんなに端末なかったんですよ。事務所に数台って感じ。まだ新参者だったし先輩連中が端末の前にドカって座ってるとそうそう簡単に使わせてもらえません。周りも忙しいからなかなか帰ってくれないんで端末空かないし…
やがて部署に数台ってぐらいに増設されてからは使いましたよ。ダンプを紙じゃなくテープに入れてもらって、マシン室のある別の事務所に行ってテープからディスクに落として、自分の事務所に戻ってから机の上で調べられました。でもね、やっぱりこれはこれで不便なんですよ。と言うのは端末って言ってもMS-DOSベース(実際はIBM製なんでPC-DOS、PS/55とか言ったかなぁ…)のPCでの3270エミュレーターですが画面サイズが80桁*24行なんですよ。ダンプって121桁あるんで画面からはみ出るんです。画面をいちいち左右にスクロールしないとだめなんです。これが実にうっとおしくてやってられません。132桁*27行表示できる3270モデル5のハードウェア端末(型番は忘れた)が事務所に2台だか3台だかあったんで空いてればそれを使いましたが昼間だと結構取り合いになるんです。これが使えると検索はできるわ、リストの横幅一杯に表示できるわで紙を見るより作業効率はぐんと良くなりました。もっとも調査待ちで積み上がるのが紙の代わりにテープになっただけだったかも知れない。この頃が1990年過ぎぐらいですよ、確か。

それからしばらくして自分で買いました。DOS/Vノートパソコン。Dynabookだったかな。でもメインフレームには繋げられなかったんで単なる高級文房具としてこちょこちょやってたけど、仕事では何の役にたったかあまり覚えてない。あの頃はまだインターネットはやってなくて、代わりにハマッてたのがNifty-Serveって言うパソコン通信。ダイヤルアップって言ってモデムで電話回線と繋げて通信してたんですよ。なつかしいね。実はこのブログを一緒にやってる相棒とはここの何かのフォーラムで知り合ったんですよ。彼は当時外資系メーカーにいたんですけどいろいろ助けてもらいました。ISVでシステムソフトをやってた身としてはメーカーのエンジニアの友人は強い味方でしたねぇ。ちなみに僕は○○○BASなんてソフトを扱ってたとこにいましたが、僕はまったく違う製品をやってました。日本では超マイナーな製品でしたけど…



すいませんねぇ思い出話に浸ってしまい。ここからがタイトルに関しての本題。

その後に出たんですよ。ウ・イ・ン・ド・ウ・ズってものが。飛びつきました。自分で買いましたよ仕事用に。確かPS/VISIONってやつ。さすがに3270エミュレーターとホストに繋げるためのCOAXボードって言うインタフェース・カードはあまりにも高いんで会社で買ってもらった。まだ大らかな時代でした。個人持込みPCだって使い放題。そもそも個人用PCなんてお偉いさんから割り当てられるんでまだぺーぺーだった僕なんかいつになることやらって頃でしたから。

まだTCP/IPは普及してなくて、仮にWindows側で使えるようにしたとしてもホスト側のTCP/IPなんてまだまだ使えなかったらあくまでもSNA接続です。それでもWindowsになって自分のPCで3270エミュレーターを動かせたのは大きかったな。ソフトウェアでのエミュレーションだからお気に入りの132桁表示も出来たし、エミュレーターのファイル転送でホスト側のデータセットを自分のPCに持って来られたから紙のリストで苦労したダンプやら製品のアセンブルリストやら何やら仕事で使うホスト上にあったデータをみ?んな自分の道具の中に入れました。Windowsのテキストエディターはいいよねぇ。ISPFエディターだのISPFブラウザーなんて使ってられないですよ、PCの世界に浸ると。このあたりでついに紙の資料から解放されたって感じです。ダンプやトレースリストもそうだけどアセンブルリストやソースコードがPCの中に入ってくると出来るんですよ、け・ん・さ・く。それも複数のファイルにまたがって。このメッセージってどのモジュールが出すんだ?このフィールドに値を設定してるのはどのモジュールだ?ってことなんかを調べるのにそりゃあ便利になりましたよ。フリーウェアだのシェアウェアだのもこの頃はもう盛んでしたからいろいろ落としまくりました。まだインターネットではなく入手元はニフティサーブ(今の@niftyの前身)から役立ちそうなものはないかって。この頃会社の汎用機はIBM,FACOM,HITACってひと揃いあって、VM,MVS/ESA,VSE/ESA,AVM,MSP/EX,XSP,VMS,VOS3/ES1,VOS1が自由に使いまくれていい時代でした。メインフレーム全盛期の終盤あたりでしょうかね。

それから数年で出ましたねWindows95。TCP/IPが標準になってインターネットが普及し始めました。でもメインフレームの仕事関係でTCP/IPの恩恵を受けるようになったのは会社の汎用機にLANコントローラーが導入された後です。確かIBM機が最初だったと思う。型番はわかりません。まだ直接自分の仕事では関係なかったから。仕事でTCP/IPやったきっかけは1997年に仕事でアイルランドに行った時。アイルランドのある会社で作ったMVS(OS/390のバージョン2が出始めた頃かな)版ソフトを富士通にMSPに移してみないかって話で。そこの社長は当時いた会社で僕がやってた製品の開発元にいたエンジニアで仕事上ではあるものの元々付き合いがあった人。そんな縁で話がきたんですね。どんなソフトかをひとことで言うとメインフレームで動かすPOSIX環境。応用オプションで用意したのがWebサーバー。一応やりましたよMSPへの移植。このソフトはわりと壮大な構想で、MVSの中にPOSIXのAPIを実装して、C言語で書かれたプログラムはこの製品のライブラリーを使ってコンパイルすればUNIXベースのソフトを汎用機で動かせるってシロモノ。バッチ・プログラムでもいいし、専用のオンライン処理用サーバー内で動かしてもいい。C言語だけでなく、アセンブラー用のマクロやCOBOL用のAPIルーチンも用意してた。もっとも最初から全部のAPIを用意したわけでなく、Webサーバーで使うのに必要なものに絞ってたと思う。エンハンスを重ねて実装API数を増やすって計画でした。オプションで用意したWebサーバー自体はアセンブラーで書かれたがファイルのI/OやTCPソケット通信はそのPOSIX APIを使用してました。ちゃんと動きましたよ。MVSやMSPのコンソール・イメージをWebブラウザーで表示するなんて言うCGIルーチンを作った記憶がある。あくまでもテスト用で実用品ではありませんけど。技術的には完動品として完成したんですけど、まぁその後いろいろあって日の目を見るには至りませんでした。もっとも私は日本では売れるとは思いませんでした。すでにIBMさんはWebSphereを出してたし、その頃はみんなが思ってたんですよ「近いうちにメインフレームはなくなる」って。だったらWebサーバーなんてUNIXでApacheでしょ。メインフレームはなくなるんだから代わりになるものはUNIXしかないじゃんってね。じゃあなんでそんな開発できたのって思うかも知れませんね。わりと融通が効く会社だったんですよ。しかもベースのMVS版は出来ていてただMSP用に直すだけだし、外注するわけでなく全部自分達でやるし。まぁこの製品はいろいろ学べたものも多かったです。ちなみにTCP/IPを扱うソフトをやったのはこれが最初でした。

また話が脱線しました。すみません。で話を戻すとそのアイルランドに行った時に見たんですよ。WS_FTPってソフトを使ってるのを。このソフトはWindows用のFTPクライアントですが、何とサーバーとしてMVSをサポートしてるんです。区分データセットのメンバーが一覧で出てきてPC側のフォルダーにまとめてダウンロードしたり、アップロードしたり、GUIで操作できるんです。それって便利!ってことから使い始めました。FTPを使うと3270エミュレーターのファイル転送機能には戻れません。スピードは全然違うし、簡単だし。そもそも自分の仕事ではプログラム内に日本語を書くことはないから海外のソフトでも関係ないんですね。それからもメインフレームの仕事をしてはいましたが、WindowsとTCP/IPによって使えるツールによって、ダム端末しかなかった頃に比べれば作業の効率は格段に上がりました。それこそ紙や磁気テープでもらってたトラブルシューティングの資料なんかもその後はCD-ROMに焼いてもらったり、直接会社のWebサイトにアップロードしてもらったり、などなど便利な時代になりました。こんなブログを書いているのもネットのおかげですしね。

メインフレームだけやってる人であっても、今はWindowsやTCP/IP抜きでは仕事ができないって時代になりました。でも逆はないんですよね。Windowsとかオープン系だけやってる人はメインフレームなくっても(Windowsやオープン系の)仕事はできますよね。メインフレームでWindows用のクロスコンパイラーを動かすなんて聞いたことないし。

こんなことを書くのにだらだらと思い出話なぞを綴ってしまいました。最後まで読んでくれてありがとうございます。

Filed in つぶやき・雑感

04.メモリー管理

By kamii - Last updated: 土曜日, 10月 25, 2008

仮想記憶

コンピュータのプログラムは命令にせよデータにせよ、必ずメモリー上に置かれていなければCPUが処理することができません。プログラムが大きくなりデータ量も増えてくればそれに応じたサイズのメモリーが必要です。ところがすべてのプログラムが同じ大きさで同じ量のデータを扱うわけではありませんから、小さなプログラムでは使われないメモリーは無駄になってしまいます。昔はメインフレームに限らずハードウェア部品としてのメモリーは非常に高価であったため大きな問題でした。そこで登場したのが仮想記憶と言う考え方の仕組みです。
仮想記憶方式では主記憶装置はハードウェア部品としての実記憶装置とDASD上の補助記憶装置によって構成される論理的な装置として扱われます。MVS上のジョブは一部の例外を除けば実記憶(リアルストレージまたはリアルメモリー)を直接アクセスすることはありません。よってMVSでは単にメモリー、記憶域と言った場合は基本的に仮想記憶(バーチャルストレージまたはバーチャルメモリー)のことを指します。

仮想記憶によって得られるメリットとして大きく以下の2つがあります。


ページングとスワッピング

CPUは実記憶装置しかアクセスできませんから、実際に命令を実行したり演算処理やデータの移動を行うためには命令と対象となるデータは必ず実メモリー上に置かれなければなりません。仮想記憶は一般に実記憶より大きなサイズを持ちます。そのため溢れた内容をどこかにしまっておく必要があります。これが補助記憶でメインフレームではDASD内に作成されているページ・データセットに入れられます。
S/370アーキテクチャーではCPUはDATと呼ばれるハードウェア機構によって仮想アドレスのまま命令やデータの場所をアクセスできるようになっています。この時仮想アドレスで示されたメモリー領域が実際の実記憶上に存在しない場合、CPUはOSに割込みを起こして通知します。MVSはこの割込みを受けて、そのアドレスが示す領域が仮想記憶域として存在するかを調べます。正しい仮想アドレスであればページ・データセットにその内容が退避されているので、DASDからそれを実記憶上に読み込みます。これがページインです。逆に当面CPUが使わない領域はページ・データセットに退避されます。これがページアウトです。

このページインとページアウトによって実記憶と補助記憶間でのメモリー領域を、CPUがその都度必要とする部分に対応させ頻繁にやり取りを行って制御しています。これがページングと呼ばれる仕組みです。MVSではやり取りされるメモリー領域を4KBずつの大きさに区切って管理します。この4KBで区切られた領域をページと呼びます。ページングではページ単位に実記憶から補助記憶に書き出され、また逆に補助記憶から実記憶に読み込まれます。

頻繁にアクセスされるページがその都度DASDから読み込まれるのでは、効率が悪いので優先度が低いジョブが使用している実記憶上のページの集まり(ワーキングセットと呼ばれます)はCPUの割込みに依らずMVSが自らまとめてページ・データセットに書き出します。このようにページ単位ではなくワーキングセット単位に行われるのがスワッピングです。スワッピングは仮想記憶そのもののメカニズムではなく、パフォーマンス制御のために行われるMVSのOSとしての機能になります。
またMVSのページング制御や割込み制御などを行うモジュールはページアウトされてしまうとOSとしての制御ができなくなってしまいます。このようなOSとしての核になる部分はページアウトされないようになっていて、ページ固定と呼ばれます。


アドレス空間

MVSでは1つのジョブは1つのアドレス空間の中で動きます。実行するジョブが2つあるとそれぞれが独立したアドレス空間を持ちます。アドレス空間はプログラムに与えられる一定の大きさを持つ連続したメモリー領域です。メモリーと言ってもあくまでも仮想です。
またMVSと言う名前はMultiple Virtual Storageの略で、複数の仮想空間を並べて制御するためにMVSと名付けられたのです。ここで言うVirtual Storageが仮想アドレス空間となります。これが複数だからMVSとなったのです。ちなみにMVSの前にはSVSと呼ばれるものもありました。Single、つまり単一の仮想空間では、複数のプログラム(ジョブ)はパーティションと呼ばれる空間内を区分けした区画内で動きます。ジョブ管理とJES2で出てきたイニシエーターは、この区画の考え方の名残でもあります。
アドレス空間はメモリー空間と言い換えて考えてもいいです。Windowsなどではそう呼ばれます。「1つのプロセスには1つの独立したメモリー空間が与えられる」なんて解説されたりします。独立しているのがポイントです。ジョブAのプログラムでもジョブBのプログラムでも8000番地は同じ8000番地ですが、お互いの領域がかぶらないのは、それぞれの空間が独立しているからです。これによって、誤りがあっても他のプログラムのメモリー領域を壊すことがありません。ソフトウェア面におけるシステムの信頼性は大きく向上しました。「行儀の悪いプログラムのおかげでみんなが迷惑する」と言うことは、メインフレームの世界ではすでに1970年代初期には解決していたわけです。

アドレス空間の大きさは初期のMVSでは16MB(24ビット)、次のMVS/XAでは2GB(31ビット)となりました。何で32ビット使って4GBにしないのか?とお思いでしょうがこれにも理由があります。
先頭の1ビットはプログラムが16MBまでのメモリーをアクセスできる24ビット・プログラムなのか、それを超えてアクセスできる31ビット・プログラムなのか、を識別するための標識に使われます。そのため仮想アドレスは残りの31ビットで表現するため最大2GBとなったのです。これは古い24ビット・プログラムも、新しい31ビット・プログラムも、どちらも修正なしでそのまま動かせる互換性のためです。現在のz/OSでも同じです。MVSを始めとするメインフレームOSや、ハードウェアは、この互換性を非常に重要視してきました。故に今でも昔のプログラムが現役で動いているわけです。
現在のz/OSでは16ExaB(64ビット)となっていますが、2GBを超える領域はデータ用に使われプログラム自身は動きません。64ビットの空間をフルに利用するプログラムは、データベース系の製品など、これから少しずつ出てくるでしょうが、一般のプログラムではそこまでの広大なメモリーはあまり必要とされないと思います。またアドレス空間の数ですが最大で32767空間となっていますが、z/OSのデフォルト値では255とされています。

アドレス空間が2GBの大きさを持っていてもプログラムですべて自由に使える訳ではありません。MVSは空間をOS自身を置く領域、OSがシステムやプログラムを制御するために使う領域、複数のプログラムで共通に使える領域、ユーザー・プログラムを置く領域など、いくつかに区分けして管理します。それぞれの領域の大きさはシステムのパラメーター設定によっても変わってきます。
ユーザー・プログラムが利用できる領域が「リージョン(REGION)」です。PVTとも呼ばれます。リージョンは16MBより低い24ビット領域と、16MBより高い31ビット領域の2つに分かれ、それぞれ基本リージョン・拡張リージョンとなります。基本リージョンはユーザーのシステム設定によって幅があります(6MB?10MB)が、一般的なユーザーでは8MB程度の大きさを持ちます。拡張リージョンはGBの大きさを持つものの利用できるのは標準では32MBです。MVSとMSPでは暗黙で利用できますが、VOS3ではJCLに明示的に利用する大きさを定義する必要があります。

MVSアドレス空間構成図

MVSアドレス空間構成図



アドレスモード

MVSではプログラムはアドレスモード(またはアドレッシングモード)と呼ばれる空間をアクセスできる範囲があります。16MBまでのメモリー域にアクセスできる24ビット・アドレッシングモード、2GBまでのメモリー域にアクセスできる31ビット・アドレッシングモード、さらに16ExaBまでのメモリー域にアクセスできる64ビット・アドレッシングモードです。24ビットモードを基本モード、31ビットモードを拡張モードと呼ぶこともあります。
最初のMVSの仮想アドレス空間の大きさは16MBでした。その後MVS/XAになって、これが2GBに拡張された時に、旧24ビットプログラムの互換を保ち、新31ビットプログラムも同時に動かすためにアドレッシングモードの考え方が採用されたのです。
Windowsなどのように、32ビットを使用して4GBにしなかったのは、アドレス・ワードの先頭ビットをアドレスモードの識別に使用したためです。CPUは元々32ビット、PSWなどもアドレス部は32ビットを持っていたため、それらをそのまま生かして仮想アドレス空間を拡張しました。zアーキテクチャではPSWや命令も新たに64ビット対応に変更されたり、追加されたりしたので、MVS/XAの時のように63ビットではなく64ビットをすべて使用してアドレス表現できるようになっています。

Filed in ..基礎編

DISP=(RNW,…って便利です

By kamii - Last updated: 土曜日, 10月 25, 2008

JCLを使ってプログラムを動かすとき、DD文で新規にデータセットを作ってそこへアウトプットを出す場合に使うのが「DISP=(NEW,…)」。テストの時など失敗したら同じJCLでRE-RUNを掛けたりするが2回目以降はデータセットが出来てしまっているので、先行にDELETEのステップを追加するなど1回目の実行で出来てしまった中途半端なデータセットを消さなきゃいけないので結構面倒です。ABENDならDELETEさせることはJCLで出来るが、ノーマルエンドでも結果が×ってことはよくある。
カタログしないデータセットなら先行にDELETEのステップを常に入れておけばいいのですがやはり面倒。(UNITとVOLを定義したDISP=(OLD,DELETE)は例えデータセットが存在しなくてもエラーにならない)

日立のVOS3にはDISPの第1パラメーターに「RNW」って言うのが指定できる。RENEWですね。NEWと同じなんですけど、同名データセットが存在していれば一旦それをスクラッチしてから新たに作成し直してくれるわけです。使ってみると結構便利。
MVSとMSPでは使えませんが、これはいいよなって思う。

Filed in 知っておくと便利なテクニックなど

01.REXXとは

By takao - Last updated: 土曜日, 10月 25, 2008
IBM系のOSはすべからくREXXというインタープリター言語が搭載されている。それゆえ「REXXってIBMが好きなんだよね。」以上に考えない人が日本には多いと思う。なぜIBMはREXXを大事にしているのか、当時を知る私としては前書き代わりに少し理由を書いておきたい。

REXXプログラムが大量に使われているOSがある。そうVM。なぜか?もともとVMはマイクロカーネルアーキテクチャの流れを汲むOSだった。(研究所から生まれたんだもん、それくらいのアカデミックな香りはプンプンするんですよ。) カーネルはアセンブラーだが、その周辺は極力、EXEC, REXXといったスクリプト言語で実装していく、という暗黙のコンセプトがあったのだ。VMで使うコマンドはほとんどがスクリプトで実装されている。
この単純な動きのプログラムを重ねていく、という手法は、あなたが今後、スクリプトで仕事をしていく上で大切な考え方なので心に留めておいてほしい。例えば、ひとつのコマンドの処理結果を処理するプログラムを書く。次に、そのコマンドをパラメータを変えて、どんどん発行して結果を得たい、というと前に書いたプログラムを呼び出すように書いていけばいい、ということだ。

REXXはどういう素性をもっているかというと、もともとIBMではアウトローだった。IBMというとビジネスマンの集まりのイメージが強いが、REXXを作ったMike F. Cowlishaw(以下、コーリショウ。イギリス人)は社内で天才プログラマーとしての呼び名が高かった人だ。彼は「誰にでも使えるプログラミング言語」というコンセプトを実装することにした。
当時すでに、IBMは社内専用ネットワークVNETというものがあった。これは2000台近いVMマシーンが世界中につながり電子メール、リモートコンソール、ファイル転送、BBSなどが構築され、エンジニア,セールス、社内事務に携わる人が普通に使っていた。
このネットワークを利用し、コーリショウは言語を発表し、ブラッシュアップしていった。信じられないことだけれど、今のようにエクセルのない時代だったという理由もあり、秘書の人がデータ整理にREXXを使い、フィードバックをしていったのだ。もちろんプログラマーも意見をいい、おそらくのべ数千人の人のフィードバックが繰り返された。こういう育ち方をした言語はおそらくないと思われる。
それゆえ、REXXはプログラミング言語としてはユニークな特徴を持つに至った。以下に例を示す。
– 変数に型はない。基本はすべて「文字列」
– 文字列処理は独特ながら強力。正規表現を知らなくても相当なことができる。
– 数値計算に強い。桁落ちしにくい。
– プリコンパイルするため、長い作業は早い。
– 外部コマンドを呼んだり、結果を受け取る機能が強力

よく知らない人が書いても動くし、知っている人はさらに細かい調整の効く言語である。
数多くのユーザーのフィードバックと実績があるがゆえに、IBMはOSを超えてREXXが動作するようにした。それゆえほとんどのOS, プロダクトがREXXとのインターフェースをもつのだ。知らないと損すると思いませんか。
REXX自身も進化し、今はObject REXXというオブジェクト指向言語となった。(オープンソース)

それゆえ、汎用機でREXXを知ることは圧倒的に作業をラクにしてくれるはずである。TSOのCLISTに出来ないことはREXXにはできる。DB2の定型的アドミ作業やTivoliもREXXで可能だ。
プログラマーの経験からしても、PerlやCよりは、はるかに簡単で強力な言語だ。(PHPのようにWEBアプリに特化した言語には勝てないところはあるけれど)
20年以上にわたってメインフレームでは最強のスクリプト言語として君臨し、linuxでもWindowsでも、あらゆるプラットフォームで動く処理系を実はもっている。COBOLやPL/Iより、はるかに進化したREXXを覚えることは、必ずあなたの生産性を高めることになると思う。

なお、ここではマニュアルとして、z/OS TSO/E REXX 解説書 (SA88-8635-03)を使います。

次回はREXXの動かし方から始める。
Filed in REXX入門

区分データセットのディレクトリアクセス後のBPAM使用に関する注意

By kamii - Last updated: 金曜日, 10月 24, 2008

次のような手順でBSAMによりPDSのメンバーディレクトリを読み格納されているメンバー名を調べてから、その後でBPAMにより個々のメンバーの処理を行うようなプログラムを作る際の注意点。

  1. DYNALLOC
  2. DIRを読むためにBSAMでOPEN(RECFM=F,KEYLEN=8,BLKSZ=256)
  3. DIRをCLOSE
  4. 今度はBPAMでOPEN

※3と4の間にUN-ALLOCとRE-ALLOCを入れないと、4のOPEN時にJFCBに残っているKEYLENがセットされてしまう。このためBPAMのREADでレングスエラーが起きてしまう。

各ディレクトリ・ブロックの最終メンバーを示すキー部が不要ならQSAMでもディレクトリ・ブロックはアクセスできる。QSAMならキーは処理しないのでJFCBにKEYLENは入らない。
(僕は使ったことがないが)今のMVSのDFSMSにはDESERVマクロがあるからBSAMやQSAMでディレクトリ部を読む必要はなく、DFPのサービスでメンバーリストが作れる。MSPではGETDTRYマクロが使えるから最初からBPAMでOPENしておけばよい。VOS3ではディレクトリ読み取りのサービスはないのでディレクトリ部をPSデータセットとしてアクセスしなければならない。

Filed in システムプログラマーのための手引きいろいろ

データセット(メンバー)を編集して印刷する(IEBPTPCH)

By kamii - Last updated: 金曜日, 10月 24, 2008

順次データセットあるいは区分データセットのメンバーはIEBPTPCHユーティリティで印刷することができます。レコードの内容をべたで出力すればいいのならIEBGENERでSYSOUTにコピーする方法がお手軽ですが、PTPCHを使えば、タイトル行を付けたり、データ中のバイナリー部分を16進文字でダンプする、パック10進数をゾーン10進文字に変換したりの簡易編集ができます。


区分データセットのメンバーを印刷する


区分データセットのメンバー内容を編集して印刷する


順次データセットの内容を印刷する

MVS3.8で実行した印刷例を以下に示します。最新のMVSでも同じです。
IEBPTPCH JCLサンプルの実行結果リスト

Filed in ありがたいサンプルJCL

問題プログラムが原因でもシステムは落ちる

By kamii - Last updated: 金曜日, 10月 24, 2008

ちょっと驚かれるタイトルだったかも知れません。これは私の実体験から来ています。
MVSのJCLではREGION=0M(No Limit)っていうのが指定できます。バーチャル2GB一杯まで使えるだけ使うってことです。Authorizeされたプログラムの場合、いくつかの条件を満たしている時、仮想メモリーをバンバンとGETMAINして、LOCALページデータセットをFULLにしてしまうとMVSはDisable WAIT(コード03C)してしまいます。

    その条件とは、
  1. JCLでREGION=0Mを指定すること。
  2. APFプログラムとして実行されること。
  3. SYSEVENTマクロまたはPPT登録で空間をスワップ禁止状態にすること。
  4. GETMAINした領域には書き込みすること(ページの内容が変わること)。

この条件でGETMAINを延々と繰り返すと(LOOPすると)、ページデータセットを使い切った時点でコード03CでDisableWAITとなります。もちろんAux Storageが足らなくなってきたぞと警告だけはきちんと出ますが、それでも放っとくと最後は落ちます。APFは問題プログラムとは言わないだろうと思う人もいるかも知れませんが、ここでいう問題プログラムとはPSWの走行モード(SUPまたはPROBLEM)で言ってます。条件さえ満たせばPSW=問題プログラム、キー8の状態で起きます。
しかしスワップ禁止状態でなければ、AUX Storage Shortageになったらこのプログラムが動かなくなるだけです。OS自身は処理を継続します。ジョブをキャンセルすればStorage Shortageは解消します。またGETMAINだけしても書き込みしないでページの内容を変えなければページアウトされないのでAUX Storage不足にはなりません。

このケースは以前自分が担当してたサーバー系のソフトでサポートする端末台数の現実的な限界値をテストしようとして起こしたものです。その時は想定してなかったので結構あせりました。条件4はプログラムとしておかしくない、条件2と3はソフトの仕様ですからこれもおかしくないです。問題は条件1。安直に使ってしまったんですよねぇ、REGION=0Mを。REGION=nnMを切っとけばS878でガード掛かったんですけど…
それにしても長年MVSでシステムプログラマーやってましたが、まさかローカル・ページデータセットを一杯にしたらシステムダウンになるとは知らなかった…確かOS390のR8だったと思います。それ以来自分のプログラムでは基本的にREGION=0Mを使わなくなったのは言うまでもありません。

アセンブラー・プログラムでシステムを止めるって言うと、キー0で動くプログラムが間違ってOSの領域を壊してしまった時などのイメージがありますが、キー0でもなくSUPモードでもなくても時と場合によっては起こせるってことです。それにしても2GB分のページをしまって、さらに他のジョブ用に余裕を持たせるページデータセットのサイズってどの位必要なんだろう…

Filed in システムプログラマーのための手引きいろいろ

システム運用中にページデータセットを追加する

By kamii - Last updated: 金曜日, 10月 24, 2008

運用中にページデータセットが一杯になってくると「IRA200E AUXILIARY STORAGE SHORTAGE」と言うメッセージが出る。これはページング・スペースの70%が使用されたことを意味する。状況が変わらなければやがて「IRA201E CRITICAL AUXILIARY STORAGE SHORTAGE」となる。この時点でページング・スペースの85%が使用されている。この状態になるとMVSは新規のジョブは実行できなくなる。STARTコマンドでのSTCタスクの起動やTSOユーザーのログオンはリジェクトされる。アイドル・イニシエーターがあっても新たなジョブは実行されない。すでにログオン中のTSOユーザーや起動中のジョブ、STCタスクは実行が継続されるが何せページング・スペース不足の状態なので優先度にもよるが動きはにぶい。
MSPではIRAの代わりにKARのIDで同じメッセージが出る。(IRA200EはKAR200Iとなっている、MSGテキストは確か同じ)

メモリー・ストレージを獲りまくりながらループしているようなプログラムがいればそれをキャンセルすればいい。STORAGE SHORTAGEのMSGと共にどのジョブがどの位ページング・スペースを使っているか、トップ5(ワースト5?)が別のMSGで表示されるから怪しいと思ったジョブを殺せばよい。
ただこのようなバグっぽいプログラムのせいではなく、本当に必要なジョブが増えてしまったためページング・スペースが足りない場合はページデータセットを増やすしかない。
予備のページデータセットがあればOSのPAコマンドで簡単に追加できる。もし予備がないなら以下のJCLを使ってデータセットを作成すればよい。


ページデータセットの作成(MVS)


ページデータセットの追加

PA PAGE=SYS1.PAGE.TEMP1

ページデータセットの状況表示はD ASMコマンドで表示できます。

D ASM

追加したページデータセットが不要になったらPAGEDELコマンドでMVSから切り離します。

PD DELETE,PAGE=SYS1.PAGE.TEMP1

または放っておきます。次のIPLでは使われません。(データセットは消さない限り残っている)
こういう時のために予備のページデータセットを作っておいて、すぐにPAコマンドで追加できるようにしておくことといいでしょう。ただしお行儀の悪いプログラムによる一時的なことでなく、本当に必要なページング・スペースが足りなくなって来ているなら、通常使用するページデータセットとして追加しておく方がいいでしょう。

MSPではPAコマンドで新規ページデータセットがアロケートできるのでコマンドだけで対処できます(PDコマンドはありません)。

PA SYS1.PAGE1.TEMP1,FUNC=ALLOC,VOL=xxxxxx,SPACE=100
PA SYS1.PAGE1.TEMP1,FUNC=ADD
D PAGE,DS

VOS3ではMVSに準じた方法で行います。AMS(JSCVSUT)のDEFINE PAGESPACEでデータセットを作り(構文はMVSと同じ)、PAコマンドで追加(これも例示の内容ではJCLはMVSと同じ)となります。PDコマンドはありません。D ASM相当のコマンドもありません。

Filed in ありがたいサンプルJCL, 知っておくと便利なテクニックなど

DASDの初期化(イニシャライズ)

By kamii - Last updated: 金曜日, 10月 24, 2008

DASDボリュームを初期化(イニシャライズ)する。(MVSおよびMSP)

プログラム名はMSPではJTGGDSですが、ICKDSFの別名が付いているのでMVSと同じ名前でも利用できます。VOS3ではJSFDASDとなりICKDSFとの互換はありません。
ボリューム名を変えなければオンライン状態のままでイニシャライズできます。全データセットがパージされますが、カタログは残ります。ボリューム名を変える場合はボリュームをオフラインにした状態で実行しなければなりません。実行後にオンラインにすればマウントされます(MSPではマウントコマンドも必要)。中のデータセットを残したままボリューム名だけ変える場合はREFORMAT機能を使えます。
VTOCおよびINDEXパラメーターでVTOCとVTOC INDEXデータセットの位置と大きさを、(cyl番号,trk番号,trk数)で指定します。一般的にはボリュームの先頭に配置します。その場合CYL番号は0、TRK番号は1となります。TRK=0はシステムで使用するため利用できません。TRK数は作成されるデータセットの数によって変ります。VTOC 1トラックで50のデータセットが作成できる。正確には1トラックあたりに作成できるDSCBの個数で3390Diskでは50、3380Diskでは53となります。1つのデータセットは最低1つのDSCBを使用します。エクステントが増えたりすると追加のDSCBが作られますが、とりあえずは1データセットで1DSCBと考えてよいでしょう。作成されるデータセット50につき1トラック使うと考えて必要なTRK数を出し、システムが使うDSCBの分を考慮して10%増しぐらいにすればよいでしょう。VTOCは後で増やせない(確かそのはず)からあまりきちきちにする必要はありません。14trk、29trk、44trkあたりでしょうか。14と言うのはCYL=0のTRK=0はシステムでリザーブされてるので残りが14trkだから。以降はCYL単位にVTOCを増やそうとすれば29、44と15ずつ増えていきます。きれいなボリュームの空き容量をきっちりシリンダー単位にそろえたければこんな計算になります。

昔は「アクセスされるデータセットがたくさん格納されるボリュームのVTOCは、ボリュームの真ん中に配置させるとヘッドの動く量が小さくできるからパフォーマンスが良くなる」なんて教わったものですが、個人的には先頭にある方がすっきりします。ヘッドが飛び回る量を減らすにはアクセス頻度の高いデータセットは単一エクステントになるようにしてなるべくVTOCの近くに置くのがいいですが…
インデックスVTOCにするかどうかはセンターの運用方針に沿って下さい。今はほとんどがインデックスVTOCでしょう。SMSの機能をきっちり使うならインデックスVTOCが前提になってたりします。
SYSRESボリュームを作る場合は、IPLDDパラメーターでIPLプログラムのオブジェクトを指定します。SYS1.SAMPLIBにメンバーIEAIPL00で格納されています。MSPではKAAIPL00です。

向学心旺盛でもDASDのイニシャライズだけは注意してください。特にデータセットが入っているボリュームは。PCだってDISKのフォーマットってちょっとどきどきするでしょ?

Filed in ありがたいサンプルJCL

磁気テープの初期化とデータセットのコピー(IEHINITTとIEBGENER)

By kamii - Last updated: 金曜日, 10月 24, 2008

磁気テープを初期化(イニシャライズ)する

プログラム名はMSPではJSGINITT、VOS3ではJSFTINTとなるがいずれもIEHINITTの別名が付いているからMVSと同じ名前で利用できる。

最初のSTEPは3480型カートリッジテープ、2番目のSTEPが3490型カートリッジテープの初期化の例。3番目のSTEPは3420と言うオープンリール型テープの例。今では使われていないでしょうが…。DEN=4の指定は、6250bpiで記録させることを示します(当時の高密度テープ)。

UNITパラメーターにDEFERと指定することでマウントメッセージを抑止できます。あってもなくてもどちらでもよい。実行が開始されるとコンソールにIEC701DのMSGが出るので、テープをデバイスにセットしたらリプライに M を答えます。


磁気テープにデータセットをコピーする

テープへのデータセットのコピーは、GENERユーティリティやCOPYユーティリティなどを利用すればよい。
TRTCH=COMPはデータを圧縮することを指定しています、圧縮しない場合はNOCOMP。MSPとVOS3では指定方法が違った?のでマニュアル等で確認してください。

例では1ステップしかありませんが、DISPパラメーターにPASSと指定することで、ステップ終了後もテープはデバイスに付いたままになります。後続のステップで別のデータセットを追加するような場合、同じテープをマウントし直さなくて済みます。

Filed in ありがたいサンプルJCL