{非同期, ノンブロッキング}I/O と IRC
こんにちは。先週、非同期I/OとノンブロッキングI/Oの違いについて頭を抱えていたきたけーです。
今日、おとなりのRubyistとこんな会話になりました。
h◯◯tさん 「◯◯さんに聞いておいて!」
kitak 「IRCでよしななタイミングで返答をくださるようにプライベートメッセージを投げておきます」
h◯◯tさん 「お! それ非同期I/Oじゃね?」
と、いうことで
非同期I/OやノンブロッキングI/O及びI/Oの多重化についての定義を引用しつつ、IRCと{非同期, ノンブロッキング}I/Oの比喩について考えてみましょう。
ブロッキングI/O
データ処理が完了するまで待つ必要がある
プライベートメッセージで「◯◯さん、おつかれさまです」と投げかけて、返事が返ってくるまで待ち続ける。
ノンブロッキングI/O
データ処理の完了を待たずに他の処理が可能
プライベートメッセージで「◯◯さん、おつかれさまです」と投げかけて、待たずに別の作業に移る。
同期I/O
データ処理の入出力が可能になった時点で通知(その後にreadが必要、データの整合性は含まない)
プライベートメッセージで「◯◯さん、おつかれさまです」と投げかけた後に「おつかれさまです」と向こうから返事が返ってきた状態。必要なことはこの後にたずねる。
非同期I/O
データ処理の入出力が完了した時点で通知(readの場合この段階で既にバッファ内にデータがある)
プライベートメッセージで「◯◯さん、おつかれさまです。この前の件なのですが、◯◯ということでしょうか?」と投げかけておいて、「おつかれさまです。◯◯はそれでOKです。」と、返答が返ってきた状態。既に必要なことを得ている。
I/Oの多重化
I/O可能になったfdを通知(I/OはブロッキングI/O)
複数の人にメッセージを投げかけて、返事が返ってきたらGrowlとかNotificationCenterで通知を出すようにする(通知がくるまではブロック)。
※ システムコールに渡す引数でタイムアウトや即座に処理を戻してブロックしないようにすることもできます。
まとめ
技術的な概念を無理やり現実を結びつけて考えるのもどうかと思うのです...