最終更新日:2026年8月5日
fe technology computer-architecture io-control
まず結論
DMA(Direct Memory Access)とは、入出力装置と主記憶の間のデータ転送を、CPUが1件ずつ処理する代わりに、専用の制御回路へ任せる方式です。
科目Aでは、次の表現が判断の合図です。
専用の制御回路
+
入出力装置と主記憶の間を転送
→ DMA
DMAを使うと、データ転送中もCPUが別の処理を進めやすくなります。
ただし、CPUがまったく関与しないわけではありません。
CPU
→ 転送元・転送先・転送量を設定
DMAコントローラ
→ 実際のデータ転送を担当
直感的な説明
大量の荷物を運ぶ場面を考えます。
CPUが1個ずつ荷物を運ぶと、CPUは運搬中に別の仕事ができません。
入出力装置
↓
CPUが受け取る
↓
CPUが主記憶へ渡す
一方、DMAでは、CPUは運搬担当へ指示だけ出します。
CPUが転送条件を設定
↓
DMAコントローラが転送
↓
CPUは別の処理を進める
↓
転送完了後に通知を受ける
つまりDMAは、CPUの代わりにデータ転送を担当する専門係のようなものです。
定義・仕組み
DMAの役割
DMAは、入出力装置と主記憶の間でデータを転送します。
入出力装置
↕
DMAコントローラ
↕
主記憶
CPUがデータを1単位ずつ読み書きしないため、CPUの負担を減らせます。
DMAの基本的な流れ
一般的には、次の順番で処理します。
1. CPUが転送元を設定する
2. CPUが転送先を設定する
3. CPUが転送量を設定する
4. DMAコントローラが転送する
5. 完了後にCPUへ通知する
DMAコントローラには、転送元アドレス、転送先アドレス、転送量などが設定されます。
CPUを介さないの意味
DMAは、しばしば「CPUを介さずに転送する」と説明されます。
ただし、より正確には次の意味です。
CPUが実際のデータ転送を1件ずつ担当しない
CPUは、転送開始前の設定や、転送完了後の処理には関与します。
割込みとの関係
DMA転送が終わると、DMAコントローラはCPUへ割込みを通知することがあります。
DMA転送完了
↓
割込み
↓
CPUが完了処理を行う
したがって、DMAと割込みは対立する仕組みではありません。
DMA
→ データ転送を担当
割込み
→ 転送完了などをCPUへ知らせる
バスの利用
DMAコントローラが主記憶へアクセスするときは、CPUと同じバスを利用する場合があります。
そのため、CPUとDMAコントローラが同時にバスを使おうとすると競合が起こります。
この調整方法の一つが、サイクルスチールです。
DMAが一時的にバスを使用
↓
CPUはその間だけ待つ
DMAはCPUの負担を減らしますが、主記憶やバスを無制限に同時利用できるわけではありません。
科目Aでどう出る?
科目Aでは、DMAの説明を選ぶ問題や、ほかの方式との違いを問う問題が出ます。
選択肢を切る判断表
| 選択肢の表現 | 判断 |
|---|---|
| CPUが入出力装置と主記憶の間を逐次転送する | 直接制御方式 |
| 入出力装置のレジスタを主記憶のアドレス空間へ割り当てる | メモリマップドI/O |
| 専用回路が入出力装置と主記憶の間を転送する | DMA |
| 命令の実行段階を重ねて処理する | パイプライン制御 |
試験では、まず「何を効率化する仕組みか」を見ます。
入出力データの転送
→ DMA
入出力装置のアドレス指定
→ メモリマップドI/O
命令実行
→ パイプライン
直接制御方式との違い
直接制御方式では、CPUがデータ転送を担当します。
CPU
↓
入出力装置から読み取る
↓
主記憶へ書き込む
DMA方式では、CPUが転送条件を設定した後、DMAコントローラが転送します。
| 方式 | 実際の転送担当 |
|---|---|
| 直接制御方式 | CPU |
| DMA方式 | DMAコントローラ |
判断の中心は、誰が実際の転送を行うかです。
メモリマップドI/Oとの違い
メモリマップドI/Oは、入出力装置のレジスタを主記憶と同じアドレス空間で扱う方式です。
誰がデータを転送するか
→ DMA
入出力装置をどのアドレスで扱うか
→ メモリマップドI/O
両者は論点が異なります。
パイプライン制御との違い
パイプライン制御は、CPU内部の命令処理を複数段階に分けて重ねる方式です。
命令フェッチ
命令解読
命令実行
結果格納
DMAは入出力処理の効率化、パイプラインは命令処理の効率化です。
データ転送を効率化
→ DMA
命令実行を効率化
→ パイプライン
どんな場面で使う?
大量データの転送
磁気ディスク、SSD、ネットワーク機器、音声・映像機器など、大量のデータを扱う場面で使われます。
大量データを連続転送
→ CPUが1件ずつ処理すると負担が大きい
→ DMAが向いている
高速な入出力処理
データ転送中にCPUが別の処理を進められるため、システム全体の効率を高めやすくなります。
組込みシステム
マイコンでは、ADC、UART、SPI、I2Cなどの周辺回路とメモリの間でDMAを使うことがあります。
例えば、センサデータを連続取得する場面では、CPUが毎回値を読み取らずに、DMAでバッファへ保存できます。
センサ
↓
DMA
↓
メモリ上のバッファ
CPUは、一定量たまった後にまとめて処理できます。
よくある誤解・混同
DMAではCPUが一切関与しない
違います。
CPUは、転送前に条件を設定し、転送後に完了処理を行います。
CPUが関与しない
×
CPUが実転送を逐次担当しない
○
DMAは割込みの代わりになる
DMAと割込みは役割が違います。
DMA
→ データを転送する
割込み
→ CPUへ出来事を知らせる
DMA完了時に割込みを使うこともあります。
DMAとメモリマップドI/Oは同じ
違います。
DMAは転送方式、メモリマップドI/Oはアドレス指定方式です。
転送担当の違い
→ DMA
アドレス空間の使い方
→ メモリマップドI/O
DMAを使えばCPUは全く待たない
DMAも主記憶やバスを使います。
CPUとDMAが同じバスを利用するときは、CPUが一時的に待つ場合があります。
DMAはCPU内部の高速化技術
DMAはCPU内部で命令処理を高速化する技術ではありません。
CPU内部の命令実行を効率化する代表例は、パイプライン制御です。
まとめ(試験直前用)
- DMAは、入出力装置と主記憶の間のデータ転送を専用回路へ任せる方式
- CPUは転送条件を設定するが、実際の転送を1件ずつ担当しない
- 転送完了は割込みで通知されることがある
- CPUが直接転送するのは直接制御方式
- 入出力レジスタを主記憶のアドレス空間へ割り当てるのはメモリマップドI/O
- 命令実行段階を重ねるのはパイプライン制御
- 判断の合図は、専用回路・入出力装置・主記憶・データ転送