Anarchy In the 1K

I/O処理の分類まとめ

I/O処理の分類

 "I/O処理準備中の振る舞い"と" I/O処理完了の連携方法"の組み合わせにより、以下の通り分類されます。 f:id:fujiU:20200331155212p:plain

"I/O処理準備中の振る舞い"

 カーネルがI/O処理の準備中*1だった際の、アプリケーションの振る舞いで、以下の通り分かれます。

  • ブロッキングI/O: カーネルがI/O処理準備中だった際に、準備完了を待つ。
  • ノンブロッキングI/O: カーネルがI/O処理準備中だった際に、準備完了を待たない。

"I/O処理完了の連携方法"

 カーネルがI/O処理を完了した際の、アプリケーションへの連携方法で、以下の通り分かれます。

  • 同期I/O: アプリケーションからの問い合わせにより、処理完了を連携する。
  • 非同期I/O: カーネルからの通知により、処理完了を連携する。

I/O処理の分類毎のシーケンス

 以下サイトの内容を元に、分類毎のシーケンスの違いを見てみましょう。
Boost application performance using asynchronous I/O – IBM Developer

同期ブロッキングI/O

下図より、以下が伺えます。

  • ブロッキングI/O: カーネルのI/O処理の準備完了を(initiate read I/OからRead responseまで)、アプリケーションが待つ。
  • 同期I/O: I/O処理の完了(Read response)をアプリケーションが問い合わせる。

https://developer.ibm.com/developer/articles/l-async/images/figure2.gif

同期ノンブロッキングI/O

下図より、以下が伺えます。

  • ノンブロッキングI/O: カーネルのI/O処理の準備完了を、アプリケーションが待たない。
  • 同期I/O: I/O処理の完了をアプリケーションが問い合わせる。 https://developer.ibm.com/developer/articles/l-async/images/figure3.gif

非同期ブロッキングI/O

下図より、以下が伺えます。

  • ブロッキングI/O: カーネルのI/O処理の準備完了を、アプリケーションが待つ。
  • 非同期I/O: I/O処理の完了をカーネルが通知する。

https://developer.ibm.com/developer/articles/l-async/images/figure4.gif

非同期ノンブロッキングI/O

下図より、以下が伺えます。

  • ノンブロッキングI/O: カーネルのI/O処理の準備完了を、アプリケーションが待たない。
  • 非同期I/O: I/O処理の完了をカーネルが通知する。

https://developer.ibm.com/developer/articles/l-async/images/figure5.gif

*1:ソケット送信バッファに空きがない場合や、ソケット受信バッファにデータがない場合