読者です 読者をやめる 読者になる 読者になる

Nullppo

メモ帳的なにか

ノンブロッキングI/Oとは何なのか調べてみた

今行ってる現場で、node.jsというキーワードが出てきた。
が、、、、あまりnode.jsを知らない。
(node.jsとExpress、Jade?でウェブアプリ作れたはず、、、くらい。)

なので、node.jsでググった。
すると、ノンブロッキングI/Oというものが出てきて、
さらにそのキーワードを調べたらなかなか面白かったので、記事にしてみよう。

node.js初心者かつノンブロッキング初心者なので、間違った事言ってたらゴメンナサイ。

料理で説明

ググっても、なかなか引用できそうな説明がない。(コピペできんorz
だから、肉じゃがを作ることにする。(いきなりw)
もちろんご飯とお味噌汁付きだ。

まず、炊き上がるまで時間がかかりそうなご飯から。
米を洗い、炊飯器にセットし、ボタンを押す。
あとは通知(ピーピーピー)が来るのを耳を立てて?待つのみだ。

さて、次は肉じゃがを作ろう。
材料を切り、鍋に入れ、調味料を入れ、煮る。
煮終わるまでちょいと時間がかかるので、
お味噌汁とサラダを作ろう。

お味噌汁を作りなーがー。。。
あれ、肉じゃができる?確認してみよう。(爪楊枝をじゃがに刺す)
あれ、硬い。まだか。
よし、お味噌汁完成した。

つぎはサラダ。
ぱぱと切って・・・
あれ、肉じゃができる?確認してみよう。(爪楊枝をじゃがに刺す)
あれ、硬い。まだか。
切った野菜を皿に盛って、完成!

あれ、肉じゃができる?確認してみよう。(爪楊枝をじゃがに刺す)
お!きたー!柔らかい!
肉じゃがを皿に盛って、完成。

炊飯器「ぴーぴーぴー」
よし、ご飯もできたから皿に盛って、完成!

例えはコレだけにしときましょうww

非同期I/O

ご飯は非同期で作りました。
通知をバックグラウンドで待機しておいて、
通知が来たら皿に盛るという処理をしたのです。
通知が来るまでの間、別の処理を実行できますね!

ノンブロッキングI/O

肉じゃがは、ノンブロッキングで作りました。
鍋に入れて煮始めてから、できるまでの間に他の処理をしました。
しかし、たびたび爪楊枝で刺す事で「じゃが」のステータスを確認し、
煮えていた場合、皿に盛るという処理をしたのです。

両者の違い

通知をバックグラウンドで待つのが非同期。
ステータスを決まった間隔で確認しに行くのがノンブロッキング

そもそも

なぜノンブロッキングI/Oというものが出てきたのか。。。

少し前にC10K問題というものがありました。
apacheは、マルチプロセスモデル/マルチスレッドモデルを採用していました。
上記のモデルでは、1クライアントに対して1プロセス/1スレッドが割り当てられます。
10000クライアントが同時にアクセスすることで10000プロセスが立ち上がり、プロセスIDがどうのこうの。。。

そこに、登場したのがイベントループモデルを採用したNginxです。
イベントループモデルはシングルスレッドでループ処理をまわし、キューに溜まったイベントを処理していきます。
C10K問題を解決したわけです。

しかし、イベントループモデルにも弱点がありました。
それは、コードのどこかでブロックする処理が発生すると、、、
イベントループ自体の処理もストップしてしまい、パフォーマンスに大きく影響してしまうことです。

イベントループにおいてブロックする処理をなくそうということで出てきたものが、
「ノンブロッキング」ってわけです。


以上。(間違ってたらゴメンナサイmm