2006年11月29日
Asyncronous I/O
ソース。
AsyncIOについて(その1)
AsyncIOについて(その2)
またあちこちのBlogを見る限りNonBlockingI/OやNonBlockingI/O+シグナルとAIOが混同されている気がしたので,それら整理してみたい.
大体以下のような理解でいいのでしょうかね。もしかしたらきっちりした定義が有るのかもしれませんが。
(1) Blocking I/O
普通にopen or socketで作成したfdでwrite, read等を呼んだ場合に発生するI/O。system callが終了したら読み込み or 書き込みが終了する。
(2) Nonblocking I/O
上記のfdにfcntlでO_NONBLOCKオプションを指定してから、write, read等を呼んだ場合に発生するI/O。読み込み or 書き込み可能判定はerrno == EAGAINが返ってこなくなるまでビジーループを回したりする。その間sched_yieldで他のスレッドに処理を回したりすれば美味しい。
上のブログに書いてあるシグナルとの併用というのは見た事が無いのだが具体的にどのプログラムで使われているのだろう。
(3) Asynchronous I/O
一口にAIOと言っても、LinuxでAsynchronous I/Oをやろうとした場合、System Callの系統が2種類あるような。
- POSIX Asynchronous I/O for Linux
POSIX互換のAPI。aio_*のprefixが付いている関数。ヘッダはaio.h。
- Kernel Asynchronous I/O (AIO) Support for Linux
こっちはLinux固有のAPI。io_*のprefixが付いている関数。ヘッダはlinux/aio.h。
整理するとこんな感じ。結局Linux固有に実装しようというAPIとPOSIXで定義されたAPIが有るのも混乱の一因なのかな。OS固有に実装して性能をで引き上げるというアプローチは嫌いじゃないので、一旦頭の中で整理できれば許せる。
しかしまだしっくり来ないのは、Blocking <-> Nonblockingが相反する概念で、Asynchronous <-> Synchronousが相反する概念だよねぇ。BlockingはSynchronousと言えるからNonblockingがAsynchronousとも言えるのかなぁ。なんかその辺の混乱で誤用が多い気がしてならない。
にしてもid:yamazさんの日記はおもろいなー。ウォッチウォッチ。
- by
- at 04:57

comments