Basic Direct Access Method、略してBDAMは、 System/360以降のメインフレーム上のIBMのOS/360および後継コンピュータオペレーティングシステム用のアクセス方式です。BDAMは「直接アクセスデバイスからデータを取得したり、直接アクセスデバイスにデータを格納するために使用されるルーチンで構成されています。」[ 1 ]: p.5 BDAMは、 OS/360、OS/VS2、MVS、z/OS、および関連するハイエンドオペレーティングシステム で使用できます。
IBMの用語では、 Basicとは、データセットを物理ブロック単位で扱う低レベルのアクセス方式を指し、先読み(予測バッファリングと呼ばれる)や同期機能を提供しない。つまり、ユーザープログラムは各入出力イベントの完了を明示的に待つ必要がある。[ 2 ]: p.31
BDAMでは、「プログラマは、実際のデバイスアドレス、データセット内の相対位置(相対ブロック番号)、またはシステムが検索を開始するデータセット内の相対トラックのいずれかを指定することで、ブロックを直接保存および取得できる。」 [ 2 ]: p.63
BDAMは、アプリケーションによってプログラムされた場合を除き、ファイルにインデックスや構造を提供しません。多くのアプリケーションでは、ハッシュ関数または乱数生成関数を使用して、データ内のキーに基づいてブロックアドレスを割り当てることができます。物理キーを使用する場合は、ブロック内の最後のレコードのキーをそのブロックのキーとして書き込む必要があります。
BDAMアプリケーションプログラミングインターフェースは、UnixやWindowsなどの他のオペレーティングシステムにおけるopen、read 、 write、close呼び出し(ファイルハンドルを使用)によって提供されるインターフェースと比較できます。
BDAMは2026年現在もIBMによってサポートされています。物理デバイスの形状に依存するため、z/OSで使用される新しいIBMダイレクトアクセスデバイスは、実際の物理的特性に関わらず、 IBM 3390デバイスをエミュレートします。
プログラマは、データ制御ブロックDSORG=DA(DCB)でBDAM の使用を指定します。各ボリュームには最大 16エクステントの領域を割り当てることができます。データセット (「ファイル」に相当) は、複数のボリュームにまたがって最大 255 エクステントの領域に格納できます。アプリケーションが連続したトラック上の領域に依存している場合は、 DD ステートメントにコードを記述することで、直接データセットの領域を連続したトラックに割り当てることができます。SPACE=(,,CONTIG)
直接データセットは、出力として開き、すべてのブロックを順番に書き込むことで、使用前にフォーマットする必要があります。これにより、すべての「ダミー」レコードをロードしたり、初期データをロードしたりできます。[ 3 ]
BDAM は基本的なアクセス方法として、メンバー データをブロック単位で読み書きし、I/O 操作は非同期でCHECK進行するため、マクロを使用して完了をテストする必要があります。 [ 4 ] BDAM は標準システム マクロOPEN、、、、およびを使用します。またはマクロ命令は、目的のレコードのブロック アドレスまたはキーを指定する必要があります。マクロは、データにアクセスしたりデータ バッファを再利用したりする前に、特定の操作の完了を待つために使用する必要があります。複数の入出力操作を同時に開始して実行することも可能です。CLOSEREADWRITECHECKREADWRITECHECK
直接データセットのレコードには、最大 255 バイトのユーザー指定の記録キーを含めることができます。ファイル内のすべてのキーは同じ長さでなければなりません。読み取りと書き込みでは、ディスク アドレスに加えてキーを指定できます。BDAM は、要求されたブロックからファイル全体の領域まで、一致するキーを持つレコードを検索します。 [ 2 ]これにより、同じトラックにハッシュされる複数のキーをI/O サブシステムが自動的に処理できます。
BDAMは、ディスクアドレスを実際のデバイスアドレス、相対トラックアドレス、または相対ブロック番号のいずれかとして受け入れます。
デバイスアドレスは、 MBBCCHHR の形式の 8 バイトのフィールドです。すべてのサブフィールドはバイナリ数です。[ 5 ]
デバイスアドレスを指定すると、データセットは移動できなくなります。[ 2 ]: p.106
相対トラックアドレスは、 TTR の形式の 3 バイトのフィールドです。すべてのサブフィールドはバイナリ数です。
相対ブロック番号は、ファイル内のブロック番号を示す4バイト(フルワード)のバイナリ数です。最初のブロックはブロック0です。この形式のアドレス指定は、固定長ブロック(RECFM=F)でのみ使用できます。[ 6 ]: p.106