ノンブロッキングI/Oとは

ノンブロッキングI/Oは、コンピュータプログラムがI/O(入出力)操作(ファイルの読み書き、ネットワーク通信など)を要求した際、操作の完了を待たずに即座に制御を呼び出し元プログラムへ戻し、他の処理を続行させるI/Oモデルのことであり、I/O操作が完了するまでの待機時間中にCPU資源を効率的に利用できるようにし、特にネットワークプログラミングにおける多数の同時接続を低遅延で処理するための、並行処理を実現する主要な手法の一つです。

ノンブロッキングI/Oの概要とブロッキングI/Oとの対比

ノンブロッキングI/O(Non-blocking I/O, 非同期I/Oと混同されやすい)は、システムの応答性とスループットを向上させるために、I/O操作の特性を考慮した設計手法です。

1. ブロッキングI/O(同期I/O)

従来のI/OモデルであるブロッキングI/O(Blocking I/O)では、プログラムがI/O処理(例:ネットワークソケットからのデータ読み込み)を要求すると、その操作が完全に完了し、要求されたデータが利用可能になるまで、呼び出し元のプログラムの実行が停止(ブロック)されます

  • 課題: I/O操作はCPU処理に比べて極めて低速(特にディスクI/OやネットワークI/O)であり、ブロックされている間、CPUはアイドル状態となり、資源が非効率的に利用されます。

2. ノンブロッキングI/Oの動作原理

ノンブロッキングI/Oでは、I/O要求が即座にOSカーネルに発行されますが、カーネルが処理の準備(データが到着するまでなど)ができていない場合、呼び出し元プログラムに対してエラーコード(例:EAGAINやEWOULDBLOCK)を即座に返却し、制御を直ちに戻します

  • 待機時間の活用: プログラムはI/O操作の完了を待つことなく、他の計算処理や、別のソケットのI/O要求など、意味のある作業を続行できます。
  • ポーリング(Polling): プログラムはI/Oが完了したかどうかを、繰り返しカーネルに問い合わせる必要があります(ポーリング)。I/Oが完了すると、次の呼び出しでデータが返されます。

ノンブロッキングI/Oの課題と発展形

ノンブロッキングI/OはCPUの効率利用に貢献しますが、その実装には課題があり、それを解決するためにさらに高度なI/Oモデルが発展しました。

1. ポーリングの非効率性

ノンブロッキングI/Oの大きな課題は、プログラムがI/Oの準備完了状態を定期的に確認しなければならないポーリングの必要性です。

  • 問題点: I/Oが完了していないにもかかわらず頻繁にポーリングを行うと、ポーリング自体がCPU時間を無駄に消費し(ビジーウェイト)、システム全体のオーバーヘッドが増大する可能性があります。

2. マルチプレクシングI/O(I/O多重化)

ポーリングの課題を解決し、多数のI/Oストリームを効率的に管理するために、I/O多重化の手法が用いられます。

I/O多重化では、プログラムは複数のI/Oディスクリプタ(ファイルやソケットなど)をカーネルに登録し、いずれかのI/O操作が完了するまでブロックすることができます。これにより、個々のI/Oに対してビジーウェイトでポーリングする手間がなくなります。

  • 代表的なシステムコール:
    • select()
    • poll()
    • epoll()(Linux)や kqueue(macOS, BSD)など。これらは、select()poll()の持つファイルディスクリプタ数の制限や、大規模環境でのパフォーマンスの課題を改善した、より効率的な多重化機構です。

3. ノンブロッキングI/Oの適用分野

ノンブロッキングI/O、特にI/O多重化を組み合わせたモデルは、特にC10K問題(1台のサーバーで1万以上の同時接続を処理する課題)に対処するために必須であり、以下の分野で広く利用されています。

  • Webサーバー: NginxやNode.jsなどの高性能なWebサーバー。
  • リアルタイム通信: チャットシステムやオンラインゲームのサーバー。
  • イベント駆動型プログラミング: I/O完了イベントに基づいて処理を実行するプログラミングパラダイム。

ノンブロッキングI/Oは、シングルスレッドプロセスにおいても多数の同時I/Oを効率的に処理することを可能にし、システムの高いスケーラビリティを実現するための鍵となります。

関連用語

ポーリング | 今更聞けないIT用語集
スループット | 今更聞けないIT用語集
ソフトウェアエンジニアリング

お問い合わせ

システム開発・アプリ開発に関するご相談がございましたら、APPSWINGBYまでお気軽にご連絡ください。

APPSWINGBYの

ソリューション

APPSWINGBYのセキュリティサービスについて、詳しくは以下のメニューからお進みください。

システム開発

既存事業のDXによる新規開発、既存業務システムの引継ぎ・機能追加、表計算ソフトによる管理からの卒業等々、様々なWebシステムの開発を行っています。

iOS/Androidアプリ開発

既存事業のDXによるアプリの新規開発から既存アプリの改修・機能追加まで様々なアプリ開発における様々な課題・問題を解決しています。


リファクタリング

他のベンダーが開発したウェブサービスやアプリの不具合改修やソースコードの最適化、また、クラウド移行によってランニングコストが大幅にあがってしまったシステムのリアーキテクチャなどの行っています。