初めに
前回はBIOとNIO転送路それぞれを作りました、今日はBIOとNIOの違いについてまとめてみます。
通信方式の比較
通信フロー
簡単に言うと、
BIOはI/Oをする際(read,write)に、処理がブロックされること。
NIOはI/Oをする際(read,write)に、処理がブロックされないこと。
通信フローは、以下になります。
どの処理がブロックされるか
サーバー側に対して、以下のことをやらないといけません:
- step1:クライアントから送られたデータをもらうこと(IO処理がこの段階で発生)
- step2:もらったデータを何か処理を行い、クライアントにリスポンスすること
BIOとNIOに対して、step2の処理がほぼ同じですが、step1の処理が違います。
- BIOのstep1:ブロッキング。1リクエストに対して1threadで処理する。スレッドの上限数がボトルネックになります。
- NIOのstep1:ノンブロッキング。1リクエストに対して1threadで処理するではなくて、Selectorに任せます。そして、Selectorが随時に任されたsocketをチェックします。socketの生成が終わったら、threadに連絡して、step2に移行するという流れです。
まとめ
BIOに比べて、NIOはI/Oリクエストをブロッキングさせないものです。既存のI/O処理(BIO)を改善でき、数万以上のクライアントを同時に相手にする必要があるシステムでは、NIOの方がいいと言われています。