# Asynchronous I/O (非同期I/O)

\
非同期I/Oは、通信が進行中でもCPUが同時に実行を続けられるようにする入出力処理の形式です。

ディスクとネットワークはCPUよりも桁違いに遅いです。I/O操作を開始して結果を待つのではなく、データが必要になることが分かったらすぐにCPUがI/O操作を開始し、I/O操作の結果に依存しない他の命令の実行を続けることができます。

説明のために大まかな比較をいくつか示します。

| **デバイス**                  | **レイテンシー** | **帯域幅**                     |
| ------------------------- | ---------- | --------------------------- |
| CPU L3 キャッシュ              | 10ns       | >400 GB/秒                   |
| メモリ                       | 100ns      | 100GB/秒                     |
| <p>ディスク<br>（NVMe SSD）</p> | 400us      | 380MB/秒                     |
| 通信網                       | 50～200ミリ秒  | <p>1 Gb/秒<br>（125 MB/秒）</p> |

（fioによる報告による実際のディスク統計で、サイズ2KBのランダム読み取りで約190k IOPS）

幸いなことに、SSDドライブは操作を同時に実行できるため、CPUは同時に複数のリクエストを開始し、実行を続け、その後ほぼ同時に複数の操作の結果を受け取ることができます。

一部のデータベース（例：lmdb / mdbx）は、ディスクへの読み書きにメモリマップドストレージを使用しています。残念ながら、メモリマップドストレージはカーネル（mmap）によって実装されており、非同期ではないため、操作が完了するのを待っている間、実行がブロックされます。

非同期i/oについての詳細は[こちら](https://en.wikipedia.org/wiki/Asynchronous_I/O)で読むことができます。
