Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

ブロッキングI/O(ブロッキングアイオー)とは | 意味や読み方など丁寧でわかりやすい用語解説

ブロッキングI/O(ブロッキングアイオー)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

ブロッキングI/O (ブロッキングアイオー)

英語表記

Blocking I/O (ブロッキングアイオー)

用語解説

ブロッキングI/Oとは、コンピュータプログラムが入力/出力(Input/Output、略してI/O)に関する処理を行う際に、その処理が完了するまでプログラムの実行を一時的に停止させる動作方式を指す。具体的には、ファイルからのデータの読み込みやファイルへのデータの書き込み、ネットワークを通じたデータの送受信など、外部デバイスとの間で情報をやり取りする際に、その処理が終わるまでプログラムが次の命令を実行せずに待機する状態のことである。この方式は、プログラムの記述が比較的シンプルになるという利点がある一方で、複数のI/O処理を同時に効率よく捌きたい場合には性能上のボトルネックとなる可能性がある。

ブロッキングI/Oの詳細な動作原理を説明する。プログラムがファイルからデータを読み込むためにread()のようなシステムコールを発行すると、その要求はオペレーティングシステム(OS)のカーネルに渡される。カーネルは、実際に物理的なストレージデバイス(ハードディスクドライブやSSDなど)に対してデータの読み込み指示を出す。この物理デバイスからのデータの読み込みや、ネットワークからのデータの受信といったI/O操作は、CPUが命令を実行する速度と比較して非常に時間がかかる。CPUはナノ秒単位で計算を行うことができるが、ディスクやネットワークからのデータ転送はミリ秒単位、場合によってはそれ以上の時間を要することが一般的である。ブロッキングI/Oの場合、カーネルがこの遅いI/O操作を完了させるまで、read()を呼び出したプログラムのスレッドは実行を停止し、CPUリソースを解放する。つまり、プログラムはI/O処理が完了してデータがメモリに準備されるか、あるいは書き込みが完全に終了するまで、「ブロックされた」状態となり、何もできない。I/O処理が完了すると、カーネルはプログラムのスレッドを実行可能な状態に戻し、スレッドはI/O操作の結果を受け取って次の命令の実行を再開する。

この方式は、I/O処理が開始されてから完了するまでを一連の流れとして捉えるため、「同期的な」I/O処理とも呼ばれる。プログラマにとっては、あるI/O操作を呼び出した後に、その操作が完了したと確信できるため、プログラムのロジックを直感的に構築しやすいというメリットがある。例えば、ファイルを読み込んでからその内容を処理するという一連の操作を、コード上で上から順に記述するだけで実現できる。エラーハンドリングも、I/O処理の直後にその結果をチェックすればよいため、比較的シンプルになる傾向がある。

しかし、ブロッキングI/Oには性能上の課題も存在する。特に、Webサーバーのように同時に多数のクライアントからのリクエストを処理する必要があるアプリケーションや、複数のファイルから同時にデータを読み込む必要があるようなアプリケーションでは、この課題が顕著になる。もしWebサーバーがクライアントからのリクエストを受信するたびにブロッキングI/Oで処理を行うと、一つのリクエストのI/O処理が完了するまで、そのリクエストを処理しているスレッドはブロックされ、他のクライアントからのリクエストを処理できなくなる。これにより、サーバー全体の応答性が低下し、多数のクライアントが同時にアクセスするとサービスが停止したように見えてしまう可能性がある。この問題に対処するため、一つのプロセス内で複数のスレッドを起動したり、複数のプロセスを生成したりして、それぞれのスレッドやプロセスが個別のI/O処理を担当するという手法が用いられることが多い。しかし、これらの手法も、スレッドやプロセスの生成・管理にかかるオーバーヘッドや、コンテキストスイッチによる性能低下、あるいはスレッド間の同期制御の複雑化といった別の課題を生み出すことがある。

このような背景から、ブロッキングI/Oはすべてのアプリケーションに適しているわけではない。I/O処理が非常に少なく、処理のほとんどがCPU内部での計算であるアプリケーションや、単一のタスクを順序立てて実行するスクリプトなど、I/O待ちによる影響が小さいケースでは、そのシンプルさからブロッキングI/Oが十分に機能する。また、プログラミングの学習初期段階においては、その動作が直感的で理解しやすいため、I/Oの概念を学ぶ上で基礎となる。しかし、高いスループットや低レイテンシが求められる大規模なネットワークアプリケーションやデータベースシステムなどでは、ブロッキングI/Oの限界を克服するために、ノンブロッキングI/Oや非同期I/Oといった、より複雑だが効率的なI/Oモデルが採用されることが一般的である。これらの代替モデルでは、I/O処理中にプログラムがブロックされずに他の処理を続行できるため、CPUをより有効活用し、システムの全体的な応答性と並行性を向上させることが可能になる。ブロッキングI/Oは、I/O処理の最も基本的で直接的な方式であり、その特性を理解することは、より高度なI/Oモデルや並行処理の仕組みを学ぶ上で不可欠な土台となる。

関連コンテンツ

関連IT用語