I/O(Input/Output/入出力)とは、コンピュータやプログラムが、自分の外側との間でデータを受け渡すことです。キーボード入力や画面表示だけでなく、ファイルの読み書き、ネットワーク通信、プリンターへの出力もI/Oです。

I/Oのポイントは「どちらから見て入力か、出力か」です。テキストエディタからSSDへデータを渡すのは出力、SSDから読み戻すのは入力です。
I/Oは境界を越えるデータ移動
NISTではI/Oを、コンピュータとの通信に使う機器と、その通信で扱うデータを含む一般用語としています。実務では、プログラムとOS、OSと機器、コンピュータとネットワークなど、ある境界を越えるデータの受け渡しとして使われます。
memo.txtへ「A」と入力して保存する場面には、少なくともキーボード入力、画面出力、ストレージ出力があります。

memo.txtで起きるI/Oを分ける
| I/O | 入力か出力か | 移動するデータ |
|---|---|---|
| キーボード → アプリ | 入力 | キー操作から得られた文字A |
| アプリ → 画面 | 出力 | 表示する文字や描画命令 |
| ストレージ → アプリ | 入力 | 開いたmemo.txtの内容 |
| アプリ → ストレージ | 出力 | 保存する新しい内容 |
| アプリ ↔ ネットワーク | 入力と出力 | 受信データと送信データ |
CPU処理とI/O処理は役割が違う
CPUは命令の演算・比較・分岐などを実行します。一方、I/Oはキーボード、SSD、ネットワークなどとのデータ移動です。CPUが書き込み要求を準備しても、機器側の処理が完了するまで時間がかかる場合があります。
| 分類 | 主に時間を使う対象 | 例 |
|---|---|---|
| CPUバウンド | 計算や命令実行 | 圧縮、暗号計算、画像変換 |
| I/Oバウンド | 外部との読み書き・待ち | 大量ファイル読込、DBアクセス、通信待ち |
処理が遅いとき、CPU使用率が高ければCPUが忙しい可能性があります。CPU使用率が低くても、ストレージやネットワークの完了待ちで進めない場合があります。したがって「CPUが空いている=処理が速い」とは限りません。
I/O待ちとは何か
スレッドが読み書きを依頼し、結果が必要になるまで先へ進めない状態をI/O待ちと呼びます。OSは待っているスレッドからCPUを外し、実行可能な別スレッドへCPU時間を回せます。I/Oが完了すると、待っていたスレッドを再び実行可能にします。
プロセスとスレッドの関係はプロセスとスレッドの違いで確認できます。
同期I/Oと非同期I/O
| 方式 | 要求した処理の進み方 | 考え方 |
|---|---|---|
| 同期I/O | 必要な結果が返るまで呼び出し側が待つ | 単純だが待ち時間がその処理を止める |
| 非同期I/O | 完了を待たず別処理へ進み、後で通知や結果を受け取る | 待ち時間をほかの仕事に使える |
非同期にすれば必ず速くなるわけではありません。I/O装置の実速度は変わらず、完了通知・順序・エラー処理が複雑になります。目的は「待っている間に何を進められるか」です。
I/O性能を見る4つの指標
| 指標 | 意味 | 見るときの質問 |
|---|---|---|
| レイテンシ | 1回のI/Oが完了するまでの時間 | 1回の応答は何msか |
| IOPS | 1秒あたりのI/O回数 | 小さな要求を何回処理できるか |
| スループット | 1秒あたりに運ぶデータ量 | 合計で何MB/s運べるか |
| キュー | 処理待ちのI/O要求 | 装置の前に要求がたまっていないか |
Linuxではカーネルが/proc/diskstatsなどへブロックI/O統計を公開し、sarやiostatが読み取ります。ただし、数値の意味や集計方法はOS・ツール・バージョンで異なるため、項目名だけで即断しません。
まとめ:I/Oとは何か
I/Oとは、境界を越えてデータを移動させる処理です。memo.txtの入力・表示・保存を分けて追うと、CPU処理とは別に、機器や通信の完了を待つ時間があることまで理解できます。
