Linuxでaio

実装が2つある。以下、あくまで今の時点でのLinuxの場合の状況/実装のおはなし。

POSIX aio

  • aio_read(3) とか aio_write(3), aio_error(3), aio_return(3) とか。
  • インターフェースはPOSIXで定義されているのと同じ。
  • システムコールじゃなくてライブラリ関数(librt)
  • 裏でpthreadつくってがんばってるげ。

libaio

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 resources

Usage: aiocp file(s) desination

    • がーっと読んでがーっと書くんじゃなくて、チャンクにブツ切りにして、読んだら新しいファイルの同じオフセットのところへ書く、というのをチャンクごとにやる。ほんで、このreadとwriteは全部非同期。仮に、おっそいチャンクがあってもほかのチャンクたちは影響ない、おっそいread(やwrite)がいてもほかのチャンクのreadやwriteには影響ない。あ、影響ないってのはいいすぎか。I/Oブロックされてほかの処理に移れないってことがなくなる。
    • イメージ的には、チーズをよってたかってみんなで一斉にちびっとずつ食べる感じ。

POSIX aio vs libaio

libaioはPOSIX aioの高レベルラッパだと思ってたんだけど違かった。どちらも「非同期I/O」だけど実装は別もの。

軽ーく比較したところ、Linuxの場合は、POSIX aioよりlibaioの方が超絶速かった。POSIX aioはライブラリ関数なのに対し、libaioはシステムコールであるというのが一因かも。

移植性優先ならPOSIX aio、性能優先ならlibaioか、な。