QIO(キューI/O )は、マサチューセッツ州メイナードにあった旧デジタル・イクイップメント・コーポレーション(DEC)が設計したいくつかのコンピュータオペレーティングシステムで使用される用語です。
これらのシステムにおけるI/O操作は、カーネルに対してQIO呼び出しを発行することによって開始されます。QIOには、キューI/Oと待機付きキューI/Oの2種類があります。
待機なしの QIO の場合、呼び出しは即座に返されます。リクエストが正常にキューに追加されると、実際の操作は非同期で実行されます。完了すると、ステータスが QIO ステータス ダブルワードで返されます。QIO リクエストでは、完了時にイベント フラグを設定するか、非同期システム トラップ( AST ) を発行するように指定することもできます。
この呼び出しは、QIOW(キューI/Oおよび完了待ち)として発行することも可能で、同期I/Oが可能になります。この場合、イベントフラグ待ち操作が組み込まれているため、I/O操作が完了または失敗するまで呼び出しは戻りません。
以下のオペレーティングシステムはQIO(W)を実装しています。
VIOにおける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は読み取りが完了するまでの時間である可能性がありますが、ディスクドライブの場合は、転送の開始ブロック番号である可能性があります。
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リクエストは、VMS端末ドライバのIO$_READPROMPT呼び出しにIO$M_TIMED修飾子を付加したものです。このQIOには、以下の6つの追加パラメータすべてが必要です。
- P1
- 入力文字が受信されるバッファのアドレス
- P2
- バッファの長さ。読み込む文字数の上限を指定します。バッファがいっぱいになると、ユーザーが改行文字を入力しなくても読み込みは正常に完了します。0を指定することも可能で、その場合は読み込んだ文字数が0文字で正常に終了します。
- P3
- 入力待ちの最大秒数。これはIO$M_TIMED修飾子が存在する場合にのみ使用され、値がゼロの場合は0秒を意味します。読み取りは即座に終了するため、入力できるのはユーザーが事前に入力した内容のみとなります。
- P4
- オプションの「終端マスク」のアドレス。どのASCII文字で読み取りを終了するかを指定します。省略した場合、デフォルトでは通常のVMS行区切り文字(キャリッジリターンを含むが、ラインフィードは含まない)が使用されます。行終端文字を含まないマスクを指定することも可能です。その場合、読み取りはバッファがいっぱいになったとき、またはタイムアウトが経過したときにのみ完了します。
- P5
- 入力を受け付ける前にユーザーに表示されるプロンプト文字列のアドレス。このプロンプトを事前書き込み操作としてではなく提供する利点は、読み取り処理中に入力行の更新が必要な状況(例えば、オペレータメッセージが端末にブロードキャストされた後や、ユーザーがCtrl+Rを押して行を再表示した場合など)で自動的に再表示されることです。
- P6
- プロンプト文字列の長さ。
上記のパラメータを適切に選択することで、1回の呼び出しで端末入力と出力の両方を行うことが可能になり、端末出力のために通常のIO$_WRITEVBLK呼び出しを使用する必要は全くなくなります。
参考文献
- ↑ 「HP OpenVMS システムサービス リファレンス マニュアル」。2018年10月12日にオリジナルからアーカイブされました。2018年10月11日に取得。