LISTCAT(AMSユーティリティー)

By kamii - Last updated: 火曜日, 10月 5, 2010

LISTCAT(AMSユーティリティー)

LISTCAT は List Catalog のことで、カタログされているデータセットの一覧を作成することです。AMS(IDCAMS)はVSAMやカタログを操作するバッチ・ユーティリティーで、LISTCATの機能も持っています。対話処理であれば、ISPFのDSLISTユーティリティーやTSOのLISTCATコマンドが利用できます。MVS の場合、本来のTSO LISTCAT コマンドは、同じ名前のAMS(アクセス方式サービス)コマンドに置き換えられています。

LISTCATはカタログからのデータセット一覧ですが、これにに対してデータセットが格納されたDASDボリュームからのデータセット一覧がVTOCリスト(LISTVTOC)です。現在ではデータセットはカタログすることが一般的です。そのためLISTCAT機能を使いこなすことは、データセット管理をする上で大いに役立ちます。

昔のことですが、カタログ参照のオーバーヘッドを嫌い、頻繁にアクセスするデータセットについては必ずUNIT/VOLを明示して、カタログを見ないで済むような運用をしていたユーザーもありました。今のカタログ・システムは初期のVSAMカタログなどに比べればパフォーマンスも向上していますし、VSAMやSMSデータセットなどカタログ抜きには運用できないものもあり、データセットはカタログして利用することが当たり前になっています。


LISTCATのJCLサンプル


LISTCATはバッチだけでなく、TSOコマンドとしても実行できます。パラメーターやオプションを変えてどのような結果が得られるかを試したい時は、バッチよりもTSOが便利です。ただしTSOの場合、LEVELパラメーターは省略してもすべてのDSNではなく、暗黙値としてLEVEL(userid)が設定され、ログオン中のUSERIDを先頭修飾子とするDSN一覧が表示されます。全DSNを表示する場合は、PROFILEコマンドでNOPREFIXを設定しておく必要があります。
LISTCATコマンドの詳細は、アクセス方式サービス・プログラム(AMS)のマニュアルに載っています。

Filed in キーワードから(何が知りたいですか)

T560/20データ・ストリーム

By kamii - Last updated: 月曜日, 10月 4, 2010

T560/20データ・ストリーム

T560/20データ・ストリームは日立のメインフレーム(VOS3等)で使用される、ホスト・コンピュータ側のオンライン処理プログラムと端末装置(ディスプレイ、プリンター)間でやり取りされる、データフォーマットの規約。HNAやTCPよりも上位のプロトコルで、アプリケーション・プログラムで直接ハンドリングされる通信データのことです。現在ではアプリケーション・プログラムが直接VTAMやXNFを介して通信することはほとんどなく、DCCMなどのミドルウェアなどのサービスを介して端末とのトランザクション通信がなされるのが一般的で、一般プログラマーがデータ・ストリームを理解し習得する必要はほとんどありません。これは日立に限らず、富士通やIBMでも同じです。
端末パネルの表示が上手く行かないような場合に、通信データのトレースを見てどんな内容がやり取りされているかを調べるような時にはデータ・ストリームの知識が必要になりますが、一般のユーザー自身でそれを行うこともほとんどないです。

データ・ストリームは端末画面のどこに(何行目の何桁目といった場所:アドレス)、何を(文字列の種類(漢字:英数字など)や内容)、どのように(色、輝度、罫線などの属性)表示する、といったものを明確にするために使われます。


アウトバウンドとインバウンド

データ・ストリームはデータが流れる方向によって、アウトバウンドとインバウンドの2つに分かれます。アウトバウンドはホストから端末方向のデータで、画面内容を示すデータで構成されています。
インバウンドは端末からホスト方向のデータで、アウトバウンドで示された画面に対して端末オペレーターが、どのようなデータを入力したかをホスト側プログラムに通知するものです。

TSSなどの対話型処理では、最初のアウトバウンド、インバウンド、それに対する答えとしてのアウトバウンド、インバウンド、・・・のように交互にやり取りがなされます。その他、画面の表示以外にもファイル転送などを行うためのデータ・フォーマットも規定されています。この場合は画面には転送データは表示されず、画面の裏でファイルデータがやり取りされるような動きになります。


コマンドとオーダー


データ・ストリームの例

T560/20データ・ストリームは、マニュアル「T-560/20ターミナルシステム」(500-2-095)に概要が解説されていましたが、実際にプログラムを作成して端末にデータを表示させたり、端末からのデータを読み込んだりするためには情報不足です。その他にも輸出用の英文マニュアルがあったような気もしますが定かではありません。ベンダー向けに開示された技術仕様書にはconfidentialのスタンプがあったので、国内向けには詳細が一般公開されていなかった気もします。そんなわけでプログラムを作成したり、トレースを解析するレベルの詳細であれば、メーカーに照会する必要があります。IBMはマニュアルですべて公開していますが、富士通や日立は端末のデータ・ストリームに関して、ユーザーに対してはその必要性がない限り公開されない可能性が高いです(ソフトウェア・ベンダーの場合は技術情報の開示契約に基づきます)。FHオーダーのDFCビットなどもマニュアルには詳細(何ビット目が何を示す)はマニュアルに記載されていなかったので掲載しませんでした(昔の自分のノートには書いてありますが、さすがに勝手に出すことはできません)。
検索回数が多かったので記事として掲載してみたのですが、今となってはベンダーでエミュレーターでも作る人でない限り実務で詳細が求められることはないでしょう。製品のトラブル等であれば、メーカー(あるいはベンダー)で調べるからトレースなどはそのまま渡してくれれば結構です、となるでしょうし。ミドルウェアを使わずに独自のオンラインプログラムを作ることも今はないでしょう。そうであっても個人的にはブラックボックスにしないで、公開した方がいいと思いますが、このあたりの考え方は日本のメーカーとIBMとでは本当に違いますね。

Filed in キーワードから(何が知りたいですか)

01.4共通域のGETMAINとアンカーポインター(NAME/TOKEN)

By kamii - Last updated: 金曜日, 9月 24, 2010

複数のジョブで構成されるソフトウェア、ジョブをまたがってデータをやり取りするようなソフトウェア(例えば通信サーバー、データベースなど)では共通域を使ってデータをやり取りすることができます。多重アドレス空間のMVSではジョブ内のメモリーはそれぞれ独立しているので、他のジョブのリージョン内領域を参照することは容易ではありません。現在のMVSではクロスメモリー・サービスも利用できますが、多くのソフトウェアは共通域であるCSAを利用する方法を採ってきました。この場合、CSAにデータを受け渡す領域を用意し、WAIT/POSTで互いの同期を取るような方法が使われます。


共通域(CSA)のGETMAIN


ジョブ間での同期取り


NAME/TOKENサービスを使ったアンカーポインター

Filed in 中級編

01.3獲得済み領域の管理(VSMLIST)

By kamii - Last updated: 木曜日, 9月 23, 2010

プログラムが仮想記憶内のどの領域をGETMAINしているかをマッピングすることができます。一般のプログラムではほとんど必要とされませんが、サーバー・プログラムなどで、自分が使用しているリソース量の詳細を得る機能などを実装する場合などに利用できます。


VSMLISTマクロでストレージ・マップを作る


その他の仮想記憶管理関連マクロ

Filed in 中級編

AUXストレージ(補助記憶)

By kamii - Last updated: 水曜日, 9月 22, 2010

Auxiliary Storage:補助記憶

AUXストレージは、Auxiliary Storage(補助記憶)のことです。
仮想記憶システムでは、メモリーは実記憶と補助記憶に分かれます。実記憶が実際のメモリー装置です。パソコンでいう「DDR2 PC6400のSDRAM」などのメモリーモジュールに相当します。補助記憶は実記憶に入りきらないデータやプログラムを一時的にしまっておく記憶装置です。基本的にDASD(ディスク)装置が使われます。

仮想記憶のしくみはソフトウェア(OS)だけでなく、ハードウェア(CPU)の機能も含めて実現されています。OS内のプログラムがアクセスするメモリーは仮想メモリーです。10000番地のデータにアクセスする、20000番地のプログラムへジャンプする、といった命令の動作はすべて仮想メモリーを対象にします。

OSの一部のモジュールやシステムプログラムの特別な処理などにおいては直接実アドレスでメモリー操作をする場合もありますが、そのような例外を除き仮想記憶システムではプログラムは原則仮想メモリーを使って動作します。

しかし実際に命令を実行するCPUは実メモリーしかアクセスできません。そこでCPUではDAT機構(DAT:Dynamic Address Translation:動的アドレス変換)によってプログラムが提示した仮想アドレスを実アドレスに変換します。CPUのDAT機構は実メモリー内に作られているアドレス変換のためのテーブルを参照して仮想アドレスと実アドレス変換を行います。DATはハードウェアのしくみですが、アドレス変換のためのテーブルはOSがシステムの初期設定時に作成します。DATはCPU単独ではなくOSと連携して機能を実現します。

アドレスが決まると実記憶はCPUによってアクセスされます。しかし一般に実メモリーは仮想メモリーより小さいです。MVSのように同時に複数のジョブを動かすOSでは複数個の仮想メモリーを使うため、実メモリーとの大きさの差はさらに拡がります。また仮想メモリー上はデータが連続していても実メモリー上では断片化していることもあります。実メモリー上に格納しきれないデータや、他のプログラムのために実メモリー領域を明け渡したデータは、補助記憶と呼ばれる外部の記憶装置に格納されます。主にディスク装置が使われ、ディスク内に作成されたページ・データセット(ページング・ファイル)が補助記憶の実体となります。

プログラムはメモリーをバイト単位でアクセスできますが、OSのメモリー管理はそこまで細かい単位ではありません。MVS(z/OS)では4KBのサイズでメモリーを区切って管理します。仮想メモリー上の4KBの単位を「ページ」と呼びます。仮想メモリー上ではページですが、実メモリー上ではページ枠、補助記憶内ではスロットとなります。実メモリー上のページを補助記憶であるページ・データセットのスロットに書き出したり、逆にスロットからページ枠に読み込むことが「ページング」です。メモリーから書き出すことがページアウト、メモリーへの読み込みがページインとなります。

MVSではCPUが実メモリーをアクセスした際に実際にそこに目的のデータがなければ、記憶保護例外が発生して、CPUが割込みを起こします。MVSはそれを受けてページング・スーパーバイザーを起動し、必要なページ枠がページ・データセットに書き出されているかを確認します。ページ・データセットにあれば、そこから実メモリー上に読み込み、割込みを起こしたプログラムの動作を続けます。
割込みによって必要なページング処理が行われながらプログラムは実行されますが、プログラムからはページング処理はまったく見えません。あたかも自分1人がメモリーを独占して使っているかのよう見えるのです。

仮想記憶を構成するメモリー・コンポーネント


Filed in キーワードから(何が知りたいですか)

COBOLでSYSINをアクセスする

By kamii - Last updated: 月曜日, 9月 20, 2010

COBOLプログラムでSYSINにアクセスする

//STEP1    EXEC PGM=PROG1
//OUTLIST  DD SYSOUT=*
//DATAIN   DD *
ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890
//

このようなJCLで示されるプログラム(PROG1)があったとして、PROG1をCOBOLで作る場合、DD * で定義されたデータにどうやってアクセスすればいいのか?ということで検索されていたと考えます。



Filed in キーワードから(何が知りたいですか)

COBOLでアドレスを取り扱う

By kamii - Last updated: 月曜日, 9月 20, 2010

COBOL言語でのアドレスの取扱い

「COBOL address」というキーワードで何回も検索されていたので目にとまったものです。プログラム中で定義したデータエリアの場所、パラメーターで渡す値をメモリー上の格納エリアの場所で示したい、ということでしょうか。言い換えればCOBOLでポインターを扱うにはどうすればいいのか?ということになるのでしょうか。

マニュアルで見た限りでは、z/OSとMSPのCOBOL言語ではアドレスとかポインターの取扱いはできないようです。しかしVOS3のCOBOL85ではアドレス操作機能というのがあってアドレスの取扱いができるようになっていました。
と、当初は書いたのですがご指摘をいただき改めてマニュアル(IBMのEnterprise COBOL for z/OS)を見るとポインターの扱いについての解説はありました。いかに適当にマニュアルを読んでるかがばれますね。



VOS3のCOBOL85によるアドレス操作例

ただしこのアドレス操作機能を使うには、COBOL85コンパイラの組み込み時(導入時?)に追加のオプションが必要とのことで、一般的ではなく特に必要とするユーザーのみに有効とする機能のように見受けられます。


COBOLという言語を考えた時、そもそもアドレス(ポインター)を扱うこと自体が不自然に思えますが、アセンブラーに慣れた者にとっては逆にアドレスが扱えないことにもどかしさを覚えます。もっともそういう場合はアセンブラーなりCなりを使いなさいということでしょうか。アドレスとかポインターとかの概念がないから、COBOLのような言語ではプログラマーによる個人差が出にくい、ということを聞いたことがあります。それだけが理由でもないでしょうが、言語の仕様上似たようなコードになってしまう、ということかも知れません。
そうだとすれば、これは企業のシステム部門にとってはある意味よいことでもあります。メインフレームのように企業の基幹で使われるシステムでは、品質の良いプログラムが当然のように求められますが、品質とは必ずしもバグがない、ということだけではありません。むろん性能や使いやすさなども品質のうちでありますが、企業にとっては誰が書いても同水準の品質を保てるということも大切です。特に今日のように自社のソフトウェア要員を教育して訓練する、などということがめっきり減ってしまった状況では、1人のスーパースターが素晴らしいプログラムを書いても、その人がいなくなり、他に誰もそのプログラムの面倒が見られなければ、結局捨てざるをえません。今日のメインフレームにおけるアプリケーションで圧倒的なシェアでCOBOLが使われているのも、アプリとしては最もつぶしが効く言語となっているからでしょう。アドレスを扱うことはできない、という点で考えた時、それでもCOBOLがこれだけのシェアを持って使われているのは、アドレスの取扱いは必要ない、ということの表れとも言えます。


COBOL2002

COBOL2002という規格では、新たにポインター項目とアドレス付けの機能が追加されたようです。これによってCOBOLプログラムでもポインターを取り扱うことができるようになるようです。COBOLなのにCのようなパラメーターの受け渡しができるようになるみたいですが、目的はC言語プログラムなどとの連携を容易にするためでしょう。メインフレームでもIBMなどがいずれサポートする可能性はありそうです。
詳細は「COBOL Consortium」の「第4次COBOL規格 COBOL2002のご紹介:ポインタ項目とアドレス付け機能」を参照してみて下さい。

Filed in キーワードから(何が知りたいですか)

PSデータセットとは?

By kamii - Last updated: 金曜日, 9月 17, 2010

PSデータセット(順次データセット)とは?

順次データセットはMVSにおける最も基本的なファイルです。ファイルの中はレコードという単位で分割されます。データを記録したレコードが順番に並んでいるため順次編成ファイルとも呼ばれます。ディスクやテープなどに書き込まれた順次編成ファイルとしての実体データが順次データセットあるいは順編成データセットということになります。

順次データセットは単に先頭からレコードを並べているだけの単純な構造なので、シンプルでわかりやすくプログラミングも容易です。区分データセットやVSAM、さまざまなデータベースではディスクに格納しなければなりませんが、順次データセットはディスク以外のテープ、紙(印刷用紙)などへの記録もできます。現在では使われませんが、過去には紙カードや紙テープといったメディアもありました。
業務プログラムにおいては処理の中間で作成される作業用データファイルや、帳票データの出力先として多用されています。その他業務処理用のベース・データファイルとしても利用されます。制御プログラムやユーティリティーにおいては、データセットやボリュームのバックアップファイルやログファイルの出力先としてよく使われています。

まとまった量のデータを格納しておくには簡単で便利ですが、レコードは単に順番に並んでいるだけなのでデータの再利用時も先頭から順番にしか取り出せません。そこでレコードの1部をキーとして扱い、キーに対応したレコードがデータセット内のどこにあるかの目次(インデックス)を持って、キーによるレコード検索を可能にする索引順データセット(ISAM)、レコードに番号を付けてその番号を指定してダイレクトに目的のレコードを取り出せるようにした直接データセット(DAM)などのデータセットもありました。ISAMもDAMも順次データセットの応用編ともいうべきものでしたが、今ではVSAMのKSDSとRRDSによって置き換えられています。特にMVS(z/OS)ではISAMはもはやサポートすらされていません。キーやレコード番号によるアクセスはアプリケーションプログラムでは必須のしくみですが、それらはVSAMやデータベース製品を利用するのが一般的になっています。

現在のMVSでは基本的なデータセット編成としては順次データセットと区分データセットの2種類と考えていいでしょう。z/OSにおいてはこの2種類をベースに、ストライピングなどをサポートした拡張順次データセット、自動的に拡張されるディレクトリーや圧縮不要なしくみを持つ拡張区分データセット(PDSE)、のように従来のデータセットにはなかった追加機能をサポートしたり、欠点を克服したり、の拡張がなされています。

データセットを構成するレコードにはいくつかの種類がありますが、大きく固定長レコードと可変長レコードに分かれます。レコードは通常複数でまとめられてブロックとなり、ディスクやテープにはブロック単位で書き込まれます。MVS(MSP、VOS3)ではWindowsやUnixと異なり、ファイル(データセット)は必ずレコードによって構造化される、という特徴を持っています。バイト列が並んでいるだけのストリームではなく、例えばとりあえず2バイトだけ読む、その内容によって次に読むべき長さを変える、改行文字(CRLF)を見つけたらその行は終わり、といったアクセスの仕方ではありません。一般のアプリケーションプログラムではレコードを単位にして読み書きするのが基本です。そのためデータセットのしくみ(ファイルシステム)を理解するには、どのような形式のレコードがあり、どのように長さを表現するか、といった知識も必要になります。またそれらはプログラミングだけでなく、データセットを作成する場合にも必要になるので、プログラマーに限らずMVSシステムに携わる人は職種に限らず覚えておきたいことです。
データセットを構成するレコードの構造、OSが提供する順次データセットのアクセスサービスなどに関しては「z/OSのしくみ:データセットの種類とアクセス法:レコードとブロック、レコード形式および順次データセットとQSAM・BSAM」で解説しています。

Filed in キーワードから(何が知りたいですか)

IEBPTPCH

By kamii - Last updated: 金曜日, 9月 17, 2010

IEBPTPCH:データセットやメンバーのプリント・ユーティリティー

IEBPTPCHは(z/OS)における、順次データセットまたは区分データセットのメンバー内容のプリントを行うユーティリティー・プログラムの名前です。MSPではJSDPTPCH、VOS3ではJSDPRNTとして提供されています。プログラム名は異なるものの、JCLもSYSIN制御ステートメントも含め、基本的に互換ユーティリティーです。

IEBPTPCHはGENERやCOPY同様に初期のMVSから提供されている基本的(古典的)なユーティリティーの1つです。順次データセットや区分データセットのメンバー内容をそのまま印刷するだけでなく、見出し行を付けたり、パック10進数を見やすく変換したり、といった簡単な編集機能も持っています。
基本的な利用法については、こちらにサンプルJCLを掲載してあります。「データセット(メンバー)を編集して印刷する(IEBPTPCH) 」

初期のMVSではデータセットやメンバーの内容は実際のプリンター装置から紙に印刷リストとして打ち出すことが普通でした。JCL上に定義したSYSOUTは実際に紙に打ち出されていました。今のように気軽にISPFやSDSFなどを使うようなシステムではなかったのです。しかし現在ではISPFなどを使いディスプレイ端末上で内容を確認することが多く、データセットやメンバーの内容を紙に打ち出すようなことは少なくなりました。プリントする場合でもJCLやソースプログラムなどの場合、バッチ・ユーティリティーではなく、ISPFのPRINT機能を使うこともできます。またプリント・データもSYSOUTへの書き出しではなく、VTAMやTCPで接続されたPCプリンターなどに直接送ることのできるソフトウェアを導入しているユーザーもいます。例えばIBMのKDSP(漢字端末印刷プログラム)などです。
またバッチ・ユーティリティーであっても、編集せずにそのまま用紙に打ち出すだけならGENERユーティリティーを利用することもできます。この場合はデータセットをSYSOUTへコピーする、ということになります。その他AMSユーティリティーのPRINTやREPROコマンドでもプリントすることができます。

Filed in キーワードから(何が知りたいですか)

IEBCOPY

By kamii - Last updated: 木曜日, 9月 16, 2010

IEBCOPY:区分データセットのコピー・ユーティリティー

IEBCOPYは(z/OS)における、区分データセットのコピーを行うユーティリティー・プログラムの名前です。MSPではJSECOPY、VOS3ではJSDPCPYとして提供されています。プログラム名は異なるものの、JCLもSYSIN制御ステートメントも含め、基本的に互換ユーティリティーです。

IEBCOPYはIEBGENER同様にMVS(z/OS)と言うオペレーティング・システムに携わることになった人が、最初に使うであろう基本中の基本とも言えるものです。GENERが順次データセット用、COPYが区分データセット用のユーティリティーです。IEBCOPYの主な機能は2つの区分データセット間でのメンバーのコピーですが、他にも複数の区分データセットのメンバーをマージして1つのデータセットにコピーしたり、コピーする際にメンバー名を変更したり、区分データセットを順次データセットに変換(アンロードという)して磁気テープなどへのバックアップを行ったり、区分データセットの管理やメンテナンスに必要なさまざまな機能を持っています。z/OSにおいてはPDSEデータセットもIEBCOPYで処理できます。PDSとPDSE間の相互コピーも可能です。
基本的な利用法については、こちらにサンプルJCLを掲載してあります。「区分データセットのコピー(IEBCOPY)」


Filed in キーワードから(何が知りたいですか)