QIO (キュー I/O ) は、マサチューセッツ州メイナードの旧Digital Equipment Corporation ( DEC )が設計したいくつかのコンピュータオペレーティング システムで使用される用語です。
これらのシステムにおけるI/O操作は、カーネルへのQIO呼び出しを発行することによって開始されます。QIOには、キューI/Oと待機付きキューI/Oの2種類があります。
待機なしのQIOの場合、呼び出しは直ちに返されます。要求が正常にキューに登録された場合、実際の操作は非同期的に実行されます。完了すると、QIOステータスダブルワードにステータスが返されます。QIO要求では、完了時にイベントフラグを設定するか、非同期システムトラップ(AST)を発行するかを指定することもできます。
この呼び出しはQIOW(キューI/Oと完了待ち)として発行することもでき、同期I/Oが可能になります。この場合、イベントフラグ待ち操作が組み合わされるため、I/O操作が完了するか失敗するまで呼び出しは戻りません。
次のオペレーティング システムは QIO(W) を実装しています。
- RSX-15
- RSX-11(すべての派生型を含む)
- RSTS/E (同期のみ、RSXランタイム システムによってエミュレート)
- オープンVMS [1]
VMS の QIO 引数
VMS では、QIO 呼び出しの引数は次のとおりです。
- 操作完了時に設定するイベントフラグ。イベントフラグを指定しないことはできません。フラグ0が有効です。複数の操作が同時に実行され、完了時に同じイベントフラグが設定されても全く問題ありません。その場合、アプリケーション側で混乱が生じないようにするか、そのイベントフラグを無視するかを判断してください。
- チャネルは、デバイスに以前関連付けられていた小さな整数です。このレベルでは、ディスクファイルとディレクトリに対するすべての操作(ファイル名の解析、ディレクトリの検索、ファイルのオープン/クローズ)は、適切なQIOリクエストによって実行されます。
- 実行される機能コード。基本コード(読み取り、書き込みなど)には 6 ビットが割り当てられ、さらに 10 ビットが、基本コードに応じて意味が変わる「修飾子」に割り当てられます。
- オプションのI/Oステータスブロック(IOSB)は、QIO呼び出しによってクリアされ、I/O操作の完了時に設定されます。最初の2バイトには完了ステータス(成功、ファイル終端到達、タイムアウト、I/Oエラーなど)が保持され、次の2バイトは通常、操作中に読み書きされたバイト数を返します。最後の4バイトの意味は、もし意味がある場合、操作によって異なります。
- 操作が完了したときに呼び出すオプションのASTルーチン。
- AST ルーチンに渡される追加のパラメータ (意味は呼び出し元によって異なります)。
- P1からP6と呼ばれる最大6つのパラメータからなる、部分的に標準化されたリストです。最初の2つのパラメータは通常、I/Oバッファの開始アドレス(P1)とI/Oバイト数(P2)を指定します。残りのパラメータは、操作やデバイスによって異なります。例えば、コンピュータ端末の場合、P3は読み取りが完了するまでの時間ですが、ディスクドライブの場合、P3は転送の開始ブロック番号となる場合があります。
QIO完了
キューに入れられた I/O 操作が完了したことを検知する方法は 3 つあります。
- イベントフラグが設定されたとき。
- IOSB の最初の 2 バイトがゼロ以外になったとき。
- AST ルーチンが実行される時。
複雑な処理を必要とする異常なQIO
読み取りや書き込み要求などの単純なQIOは、カーネル自体またはデバイスドライバによって処理されます。テープドライブやファイルレベルの操作など、より複雑な要求は、元々は補助制御プロセッサ(ACP)(独自のアドレスマッピングを持つ特殊用途タスク)によって実行されていました。
RSX-11上のFiles -11 ODS-1ファイルシステムは、「ACP QIO」と呼ばれる特殊なQIOセットを使用してF11ACPというタスクと通信するサブルーチンライブラリによって実装されていました。磁気テープデバイスを制御するための同等の機能は、MTAACPというタスクによって提供されていました。
もともと、Files-11 ODS-2 ファイルシステムはVMS上の F11BACP によって提供されていましたが、後にプロセスコンテキストスイッチのオーバーヘッドを節約するために F11BACP の機能が VMS カーネルに組み込まれ、現在では XQP (eXtended Qio Processor) と呼ばれています。
IO$_READPROMPT
おそらく最も複雑な単一の QIO 要求は、IO$M_TIMED修飾子を指定した VMS 端末ドライバのIO$_READPROMPT呼び出しです。この QIO には、次の 6 つの追加パラメータがすべて必要です。
- P1
- 入力文字が受信されるバッファのアドレス
- P2
- バッファの長さ。読み取る文字の最大数を制限します。バッファがいっぱいの場合、ユーザーが行末文字を入力しなくても読み取りは正常に完了します。0文字を入力することもでき、その場合、読み取りは0文字で正常に終了します。
- P3
- 入力を待つ最大秒数。これはIO$M_TIMED修飾子が指定されている場合にのみ使用され、値が0の場合は0秒を意味します。つまり、読み取りは直ちに終了するため、ユーザーが事前に入力した値のみが入力可能となります。
- P4
- オプションの「終端文字マスク」のアドレス。読み取りを終了するASCII文字を指定します。省略された場合、これはデフォルトで、キャリッジリターン(ラインフィードは含まない)を含む通常のVMS行区切り文字に設定されます。行末文字を含まないマスクを指定することも可能です。その場合、読み取りはバッファがいっぱいになったとき、またはタイムアウトが経過したときにのみ完了します。
- P5
- 入力を受け付ける前にユーザーに表示されるプロンプト文字列のアドレス。事前の書き込み操作ではなく、このプロンプトを提供する利点は、読み取り中に入力行の更新が必要な状況(オペレータメッセージが端末にブロードキャストされた後、またはユーザーがCtrl/Rキーを押して行を再表示した後など)で自動的に再表示されることです。
- P6
- プロンプト文字列の長さ。
上記のパラメータを適切に選択することで、1 回の呼び出しで端末の入力と出力の両方を行うことが可能になり、端末出力に 通常のIO$_WRITEVBLK呼び出しを使用する必要はまったくなくなります。
参考文献
- ^ 「HP OpenVMS システムサービスリファレンスマニュアル」。2018年10月12日時点のオリジナルよりアーカイブ。2018年10月11日閲覧。