本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 5 : その他の機能 > a

aio(5)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

aio ― POSIX 非同期 I/O 機能

構文

#include <aio.h>

説明

POSIX 非同期 I/O 機能は、IEEE Standard 1003.1b-1993 の Section 6.7、 Standard for Information Technology、Portable Operating System Interface (POSIX)、Part 1: System Application Program Interface (API)、Amendment 1: Realtime Extensions (C Language) を実現します。 この機能によって、プロセスあるいはスレッドは、同時に実行する複数の読み込み/書き込み操作を複数のファイルに対して開始したり、要求した操作の完了通知を待ったり取得したり、完了した操作の状態を検索したりすることができます。 POSIX 非同期 I/O 機能の目的は、計算および I/O 処理による情報処理の複数の要素をオーバーラップさせることをプロセスあるいはスレッドに許可することです。

インタフェース関数

POSIX 非同期 I/O 機能には、次のインタフェース関数が含まれています。

aio_read() 

非同期読み込み操作を開始します。

aio_write() 

非同期書き込み操作を開始します。

lio_listio() 

非同期 I/O 操作のリストを開始します。

aio_suspend() 

1 つまたは複数の非同期 I/O 操作の完了を待ちます。

aio_error() 

非同期 I/O 操作のエラーステータスを検索します。

aio_return() 

非同期 I/O 操作の戻りステータスを検索し、関連するシステム資源をすべて解放します。

aio_cancel() 

保留中の非同期 I/O 操作の取り消しを要求します。

aio_fsync() 

非同期操作が指定されているファイルの媒体イメージの同期を要求します。

これらの関数を使用するには、コンパイラまたはリンカーのコマンド行上で -lrt を指定することによって、リアルタイムライブラリ内にリンクします。

非同期 I/O 制御ブロック

非同期 I/O 制御ブロック (aiocb) は、すべての非同期 I/O 関数へのパラメータとして使用されます。 aiocb は、 aio_read()aio_write()、または lio_listio() への呼び出しの中で非同期 I/O 操作のパラメータを指定すると、その後、 aio_cancel()aio_suspend()aio_fsync()aio_error()、または aio_return() が呼び出されたときに、待ち行列に入っている非同期 I/O 操作の「ハンドル」として使用されます。

aiocb 構造体には、以下のメンバーが含まれています。

    int      aio_fildes;            /* file descriptor */ 
    off_t    aio_offset;            /* file offset */ 
    void    *aio_buf;               /* location of buffer */ 
    size_t   aio_nbytes;            /* length of transfer */ 
    int      aio_reqprio;           /* request priority offset */ 
    struct   sigevent aio_sigevent; /* signal number and value */ 
    int      aio_lio_opcode;        /* operation to be performed */ 

aio_read()aio_write()、または lio_listio() に指定する aiocb には、通常の同期式 read() または write() 関数呼び出しで指定するパラメータが含まれていなければなりません。この中で、 aio_fildesfildes に該当し、 aio_nbytes は、 nbytes に該当し、 aio_offset は、暗黙のファイルオフセットに該当します。 aiocb は、固有のリアルタイムおよび非同期 I/O 要件を満たすために、要求優先順位のデルタ値 (aio_reqprio) と、シグナル方式情報を指定することもできます。 lio_listio() 関数の場合、 aio_lio_opcode フィールドは、操作が読み込みまたは書き込みのどちらであるかを指定します。

特定の aiocb に対する非同期 I/O 操作が待ち行列に入ると、そのアドレスは、他の非同期 I/O 操作 のハンドルとして使用され、待ち行列に入っている 1 つの操作を参照するためにだけ使用することができます。

aiocb 構造体に定義されたその他のフィールドは、将来の用途と拡張のために予約されています。 これらのフィールドは、非同期 I/O 機能では、すべて無視されます。

明白な定数

POSIX 標準によって定義される値は、 aio.h 内に宣言されています。

aio_cancel() 関数によって、次の値が戻されます。

AIO_CANCELED 

指定したすべての非同期 I/O 操作の取り消しに成功しました。

AIO_NOTCANCELED 

指定した非同期 I/O 操作の中の少なくとも 1 つの取り消しができませんでした。

AIO_ALLDONE 

この要求を処理する前に、指定したすべての非同期 I/O 操作が完了しました。

次の値は、 lio_listio() 関数からの復帰を制御する flags フィールドの有効な値です。

LIO_WAIT 

指定したすべての操作が完了するのを待ちます。

LIO_NOWAIT 

操作が完了するのを待たないで戻ります。

次の値は、 lio_listio() により開始される操作の種類を示す aio_lio_opcode フィールド内に指定される操作コードです。

LIO_READ 

aiocb は、非同期読み込み操作を指定します。

LIO_WRITE 

aiocb は、非同期書き込み操作を指定します。

LIO_NOP 

aiocb による操作が何も行わないように指定します。

操作の待ち行列への配置

操作の開始を妨げるエラー状態が検出されると、 aio_read() および aio_write() は、要求を待ち行列に入れることはありません。代わりに、これらの関数は、ただちに -1 を戻し、異常終了の原因を示す、 errno を設定します。 操作が正常に待ち行列に入った後は、その操作のステータスおよびエラー状態を判断するために、 aio_error() および aio_return() を呼び出さなければなりません。このステータスには通常 read() および write() により報告されるものも含まれます。 aio_return() が呼び出されるまで、要求は待ち行列内に残ったままなので、プロセスおよびシステムの資源が浪費されます。

lio_listio() によって待ち行列に入っている操作のエラー報告は、 aio_read() および aio_write() によって待ち行列に入っている操作のエラー報告よりも遅くなります。 資源の不足の場合は例外ですが、 aio_read() および aio_write() がただちに -1 および errno 値を戻すエラーによって、 lio_listio() がそのリスト内の現在または後続の要求を待ち行列に入れるのを中止することはありません。 その代わり、一部の操作だけが待ち行列に入ります。 この場合、アプリケーションは aio_error() を使用して、リスト内のどの操作が待ち行列に入っているか、およびどの操作がエラーを引き起こしたかを調べなければなりません。

非同期 I/O 操作は、以下のいずれかが true の場合に完了 したと見なされます。

 

I/O 転送の実行に成功した場合

 

操作の 1 つまたは複数のパラメータ内でエラーが検出された場合

 

操作が取り消された場合。

有効な sigevent が操作を開始するために使われた aiocb で指定されると、そのシグナルは、操作が完了した時点で送信されます。

非同期の読み込みおよび書き込み

非同期の読み込みおよび書き込み操作は、 aio_read()aio_write()、および lio_listio() インタフェースを使用して開始されます。 それぞれの操作のためのパラメータは、操作を開始するために使用される aiocb 内に入っています。 aiocb ポインタのリストを、 lio_listio() 関数呼び出しに指定することができます。この場合、操作の種類 (読み込みまたは書き込み) は、 aiocbaio_lio_opcode フィールドから決まります。 この I/O 操作は、開始した後、その操作を開始したプロセスあるいはスレッドの実行と同時に進行することができます。

HP-UX カーネルスレッドの実装では、アプリケーションは、プロセス内の独立スレッドから同期の read() および write() 関数を使って非同期 I/O 動作を実行します。 ただし、このアプリケーションは、POSIX 非同期 I/O 機能に備わっている多数のステータス管理機能を実行しなければならないことがあります。

完了待ち

POSIX 非同期 I/O 機能は、ポーリング および通知 モデルの両方をサポートしています。 ポーリング モデルは、 aio_error() を繰り返し呼び出して操作のステータスを調べることによって実行されます。 通知 モデルは、操作を開始するために使用される aiocb 内に sigevent を指定することによって実行されます。 指定された通知がある場合には、操作の完了時にその通知が行われます。

aio_suspend() 関数によって、アプリケーションは、1 つまたは複数の非同期 I/O 操作の完了を待つことができます。 操作が予想通りに完了しない場合に、プロセスは再度実行したり適切な回復処理操作をとることができるように、 timeout を設定することができます。 aio_suspend() が複数の操作を参照している場合は、その操作の中のどれか 1 つが完了した時点で戻ります。

エラーの取り出し

非同期 I/O 操作が開始した後、そのステータスは、 aio_error() および aio_return() 関数によって調べることができます。これらの関数は、参照されている aiocb の現在のステータスを戻します。 ポーリング を実行している場合、 aio_error() 関数を使用して完了ステータスが分かるまでステータスを調べ、その後、 aio_return() を使用して再利用のために aiocb を解放します。

通知 を実行している場合、 aio_return() を 1 度呼び出すことにより、完了した I/O のステータスを判断して aiocb を解放することができます。

aio_error() および aio_return() により報告されるエラーの中には、 read() および write() によって通常報告されるすべてのエラーの他に非同期 I/O 処理に固有のエラーが含まれます。 非同期 I/O 操作が開始した後、エラーが検出されたり、操作が正常に完了するまでは、 aio_error()EINPROGRESS を戻します。

取り消し

aio_cancel() 関数によって、アプリケーションは非同期 I/O 操作の取り消しを要求することができます。 操作を開始するために使用された aiocb を取り消しのためにその操作を指定するためのハンドルとして使用することができます。 あるファイルに対するすべての保留中の操作の取り消しを要求することもできます。 非同期 I/O 操作のすべてを取り消すことができるわけではありません。

永久記憶装置の同期

aio_fsync() 関数は、ファイルまたは装置を対象とする複数の非同期 I/O が未処理の時点で、永久記憶装置の内容の同期をサポートします。 この関数を呼び出した時点で指定したファイルを対象とする要求が、既に待ち行列に入っている場合のみ 、この同期操作の中に含まれます。

ファイルオフセット

非同期 I/O 操作は、本来連続して起こるものではありません。 それぞれの操作でオフセットを指定する必要があり、このファイルオフセットは非同期 I/O 操作の結果として更新されることは一切ありません。

ファイルに O_APPEND フラグを立てると、そのファイルに対する非同期 I/O の値が制限されます。 O_APPEND が設定されると、ファイル内の操作が、ファイルの終わりまで順次に処理され、1 つの要求が実行されると、次の処理の開始オフセットが設定されます。 システムが要求を待ち行列に入れる機能には利点がありますが、順次に処理しなければならない要求を大量に待ち行列に入れてシステムリソースやプロセスリソースが消耗されることのないように、注意してください。

システムの制限事項

POSIX 非同期 I/O インタフェースの操作は、いくつかのシステムの制限事項に従います。

待ち行列に入っている非同期 I/O 操作がそれぞれその内部制御構造のためにシステムメモリの割り当てを要求するので、システムが保留しておくことができる、同時に待ち行列に入れる非同期 I/O 操作の数は制限されます。システムのすべてのアクティブなプロセスが同時に待ち行列に入れる非同期 I/O 操作の最大数は変更可能です。現在の最大数の値は、sysconf() 関数呼び出しで引き数 _SC_AIO_MAX を指定して調べることができます。デフォルトの最大値は 2048 です。このシステム全体にわたる制限値の他に、プロセス単位の制限値があります。これは、 getrlimit() および setrlimit() システムコールで 引き数 RLIMIT_AIO_OPS を使用して制御されます。 非同期 I/O 操作は、完了した場合でも、その操作に対して aio_return() を呼び出すまでは待ち行列に入ったまま残っています。

I/O 用のスレッド機構ではなく、要求およびコールバック機構を使用する非同期 I/O 操作は、非同期 I/O 転送中にロック可能な物理メモリ容量に関して、システム全体で適用される制限を受けます。 システム全体に適用され、非同期 I/O 転送中にロックできる最大メモリ容量 (バイト数) は、変更可能です。この値は、システムで使用可能な物理メモリの量をパーセンテージで指定し、デフォルトで 10% に設定されています。さらに、システム全体に適用される制限の他に、各プロセスに対する制限があります。この設定は、getrlimit() および setrlimit() システムコールで引き数 RLIMIT_AIO_MEM を使用して変更できます。さらに、 lockable_mem を使用して、非同期 I/O 操作以外の理由でロックできるメモリの量を制限し、この制限をシステム全体に対して適用することができます。 plock() および mlock() インタフェースの両方またはどちらかによる明示的なメモリロックを含めて、他のシステム動作によって、その時点で、ロック可能なメモリの量が影響されることがあります。

aio_reqprio で指定できる最高優先順位の値には、制限があります。また、最高優先順位の値は、変更可能です。現在の最高優先順位の値は、sysconf() 関数呼び出しで引き数 _SC_AIO_PRIO_DELTA_MAX を指定して調べることができます。デフォルト値は 20 です。

1 つの lio_listio() 関数呼び出しで指定できる非同期 I/O 操作の数には制限があります。現在の最大値は、sysconf() 関数呼び出しで引き数 _SC_AIO_LISTIO_MAX を指定して調べることができます。デフォルトの最大値は 256 です。

一部の非同期 I/O 操作では、同時にアクティブにできるスレッド数について、システム全体と各プロセスに対して適用される制限がある場合もあります。 pthread(3T) を参照してください。

プログラム上の制限事項

ある非同期読み込み操作が未解決である間、つまり、 aio_return()aiocb に対して呼び出されていない間に、 aiocbp によって参照される aiocb に関連付けられたメモリまたは aiocbp->aio_buf によって参照されるバッファに対してその内容を変更したり、割り当てを解除したりすると、予測できない結果が発生する可能性があります。

次のコードシーケンスは、非同期読み込み操作および完了のためのポーリングを示します。

#include <fcntl.h> 
#include <errno.h> 
#include <aio.h> 
char buf[4096]; 
int retval; 
struct aiocb myaiocb; 
bzero( &myaiocb, sizeof (struct aiocb)); 
myaiocb.aio_fildes = open( "/dev/null", O_RDONLY); 
myaiocb.aio_offset = 0; 
myaiocb.aio_buf = (void *) buf; 
myaiocb.aio_nbytes = sizeof (buf); 
myaiocb.aio_sigevent.sigev_notify = SIGEV_NONE; 
retval = aio_read( &myaiocb ); 
if (retval) perror("aio:"); 
/* continue processing */ 
 ...  
/* wait for completion */ 
while ( (retval = aio_error( &myaiocb) ) == EINPROGRESS) ; 
/* free the aiocb */ 
retval = aio_return( &myaiocb); 

参照

aio_cancel(2), aio_error(2), aio_fsync(2), aio_read(2), aio_return(2), aio_suspend(2), aio_write(2), fsync(2), getrlimit(2), lio_listio(2), read(2), write(2), pthread(3T)

標準準拠

aio: POSIX Realtime Extensions, IEEE Std 1003.1b

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.