DMAとプログラムI/Oの違い:データ転送の方法を比較
デバイスとメモリの間でデータを動かす方法は2つあります。プログラムI/O(PIO)では、CPU自身が、レジスタを通して1ワードずつ読み書きします。ダイレクトメモリアクセス(DMA)では、DMAコントローラが自分でデータを動かし、CPUは転送の準備をするだけで、終わると通知を受けます。DMAは、CPUを解放し、大きな転送ははるかに速く行えますが、準備に手間がかかり、注意も必要です。
| 項目 | プログラムI/O(PIO) | DMA |
|---|---|---|
| データを動かす主体 | CPU。ロードとストアの命令で1ワードずつ | DMAコントローラ、またはデバイス自身。メモリへ直接、またはメモリから直接 |
| CPUの負荷 | 高い。転送の間ずっと、CPUがふさがる | 低い。CPUは転送の準備をして、ほかの仕事をする |
| 大きな転送のスループット | CPUの速度に制限される | 高い |
| 準備のオーバーヘッド | なし | アドレス、長さ、ディスクリプタの設定と、完了の処理が必要 |
| 小さな転送 | 準備がないので、速いことが多い | 準備のコストが、利点を上回ることがある |
| 複雑さ | 単純 | 複雑。ディスクリプタのリング、バッファのアラインメント、キャッシュコヒーレンシ、IOMMUの設定 |
| メモリバスの使用 | CPUを通る | DMAのエンジンが、CPUとメモリの帯域を取り合う |
| 主な用途 | 小さな制御用のレジスタ、単純なセンサー、古いPIOモード | SSDやNVMe、ネットワークカード、オーディオのバッファ、ADCのサンプルの連続した転送、GPUへの転送 |
数値は代表的な目安で、世代や製品によって異なります。