実装が2つある。以下、あくまで今の時点でのLinuxの場合の状況/実装のおはなし。
POSIX aio
- aio_read(3) とか aio_write(3), aio_error(3), aio_return(3) とか。
libaio
- http://lse.sourceforge.net/io/aio.html
- http://ftp.jaist.ac.jp/pub/Linux/Fedora/development/source/SRPMS/libaio-0.3.106-3.2.src.rpm とか
- io_prep_pread(2), io_prep_pwrite(2), io_submit(2), io_queue_init(2), io_queue_run(2) とか
- Linux独自
- ライブラリ関数じゃなくてシステムコール
- 裏でスレッド作ってごにょごにょとかはしない
- libaioのアーカイブのman/io.3に書いてあるサンプルコードがおもろい。
Copy file by using a async I/O state machine.
1. Start read request
2. When read completes turn it into a write request
3. When write completes decrement counter and free resourcesUsage: aiocp file(s) desination
-
- がーっと読んでがーっと書くんじゃなくて、チャンクにブツ切りにして、読んだら新しいファイルの同じオフセットのところへ書く、というのをチャンクごとにやる。ほんで、このreadとwriteは全部非同期。仮に、おっそいチャンクがあってもほかのチャンクたちは影響ない、おっそいread(やwrite)がいてもほかのチャンクのreadやwriteには影響ない。あ、影響ないってのはいいすぎか。I/Oブロックされてほかの処理に移れないってことがなくなる。
- イメージ的には、チーズをよってたかってみんなで一斉にちびっとずつ食べる感じ。