FE EXAM

DMA制御方式(直接メモリアクセス)

DMAコントローラがCPUを介さず直接メモリと入出力装置を転送する方式

INTERACTIVE VISUALIZATION
DMAC
CPU
転送済みブロック
0 / 4
CPUの稼働
設定中
転送の担当
転送の進み具合
1
2
3
4
転送済み:0 / 4 ブロック
ステップ 1 / 8
STEP 1/8開始前 — 大量データを転送したいディスクから大きなデータ(4ブロック分)をメモリへ読み込みたい状況です。1語ずつCPUが運ぶと時間がかかるため、専用のDMAコントローラ(DMAC)に任せます。DMA=Direct Memory Access、「直接メモリにアクセスする」という意味です。
システムバス(共用の通り道)CPU中央処理装置DMACDMAコントローラI/O装置ディスクなどメモリ主記憶
転送中のCPUの関与度
プログラム制御
100%
割込み制御
60%
DMA制御
10%
DMA制御方式は、転送中のCPUの関与が最も小さくて済みます(最初の設定と完了通知の受け取りのみ)。
解説

📌
DMA制御方式とは

DMACがI/O⇔メモリを直接つなぐI/O装置DMACメモリCPUは通らない

DMA制御方式とは、専用の回路「DMAコントローラ(DMAC)」が、CPUを介さずに入出力装置とメモリの間で直接データを転送する方式のことです。DMAは Direct Memory Access の略で、「直接メモリにアクセスする」という意味です。

身近な例で考えると、引っ越し業者に荷物の運搬を丸ごと任せるのに似ています。あなた(CPU)は「どこから、どこへ、何を運ぶか」を最初に伝えるだけ。実際に荷物(データ)を運ぶのは業者(DMAC)で、その間あなたは別の用事を片付けられます。終わったら業者が「完了しました」と連絡(割込み)をくれます。

上のツールで▶ボタンを押すと、CPUがDMACに設定したあと、DMACがI/Oとメモリの間でブロックを次々と直接転送し、その間CPUが別の仕事を進める様子を確認できます。

🔀
CPUを介さない転送

バスはCPUとDMACで譲り合うシステムバスDMACCPUDMACCPUDMAC

プログラム制御方式や割込み制御方式では、データは必ず「I/O → CPU → メモリ」という経路を通り、CPUの手を経由していました。DMA制御方式では、DMACが「I/O → メモリ」へCPUを通さず直接運びます。CPUは転送の1語1語に関わらないため、その分の負担が消えます。

ただし、データが通る道であるバス(bus)は、CPUもDMACも使う共用の通り道です。両者が同時にバスを使うとぶつかってしまうため、譲り合う必要があります。代表的な譲り合い方が次の方式です。
サイクルスチール(cycle stealing):CPUがバスを使っていない一瞬のすき間を「盗む」ようにDMACが少しずつ転送する。CPUの動きをほとんど止めない
バーストモード:DMACがバスを一定時間占有して、まとまったデータを一気に転送する

サイクルスチールでは、DMACがバスを使う一瞬だけCPUが待たされますが、CPUの処理そのものは止まりません。「CPUを完全に解放する」のではなく、「バスのすき間を使って転送し、CPUの邪魔をほとんどしない」のがDMAの実際の姿だと理解しておくとよいでしょう。

🎯
用途と利点

DMA制御方式が最も力を発揮するのは、大量のデータをまとめて高速に転送したい場面です。1語ずつCPUが運ぶと膨大な回数の処理が必要ですが、DMACに任せればCPUは設定するだけで済みます。

代表的な用途は次のとおりです。
ディスク(SSD・HDD)とメモリ間の転送:ファイルの読み書きで大量データを運ぶ
ネットワーク通信:受信したパケットをメモリへ高速に移す
音声・映像データの転送:途切れさせずに連続して大量に運ぶ

利点をまとめると、次のようになります。
CPUの負担が小さい:転送中もCPUは別の仕事を進められる
転送が速い:CPUを経由しない分、大量データを効率よく運べる
システム全体の性能が上がる:CPUを計算本来の仕事に専念させられる

プログラム制御 → 割込み制御 → DMA制御 という順に、CPUを入出力の手間からだんだん解放していったと捉えると、3つの方式の関係がきれいに整理できます。さらに進んで、入出力専用のプロセッサ(チャネル)に処理ごと任せるのが、より高度なチャネル制御方式です。

💡
なぜDMAは速く、CPU負荷が減るのか

DMAなし(CPUを経由)I/OCPUメモリCPUが1語ずつ受け取り → 書き込み(ずっと拘束)DMAあり(CPUを通らない)I/OメモリCPU別の仕事DMACが直接運ぶ → CPUは別の仕事ができる

DMAが速い理由は、データを運ぶ経路が短くなるからです。DMAなしの場合、データはかならず「I/O → CPU → メモリ」という経路をたどり、CPUが1語ずつ受け取っては書き込む作業を繰り返します。転送量が多いほど、CPUがその作業に拘束される時間も増えます。

DMAを使うと、経路が「I/O → メモリ」に短縮されます。CPUはDMACに「どこから、どこへ、何バイト転送するか」を最初に伝えるだけ。あとはDMACが自分でバスを使ってデータを運び、CPUは転送が終わるまで別の仕事を進められます

CPUの負担が減る理由を一言でいうと、「転送という単純作業をDMACに外注したから」です。料理人(CPU)が野菜の仕込みから調理まで全部やるのではなく、仕込み係(DMAC)に仕込みを任せて、料理人は調理に専念できるようになった、と考えると分かりやすいです。転送が完了したらDMACが「終わりました」と割込みで知らせてくれるので、CPUは都合のよいタイミングで結果を受け取れます。

📋
DMAの流れ(3つのステップ)

① CPU がDMACに設定1② DMAC が直接転送(CPU不要)2③ DMAC がCPUに割込み通知3② の間 CPU は別の仕事

DMA転送の流れは、大きく3つのステップに分けられます。

① CPUがDMACに転送条件を設定する
CPUがDMACに「転送元(I/Oのどこか)」「転送先(メモリのどの番地か)」「転送するデータの量(バイト数)」の3つを伝えます。これが唯一、CPUがDMAに直接関わる瞬間です。

② DMACがI/Oとメモリの間でデータを直接転送する
設定を受け取ったDMACが、CPUの助けを借りずにデータを運びます。この間、CPUはまったく別の仕事を進められます。転送量が大きくても、CPUの負担は変わりません。

③ 転送完了をDMACがCPUに割込みで伝える
すべてのデータを運び終えたDMACが、「終わりました」という割込み(=緊急の連絡)をCPUに送ります。割込みを受け取ったCPUは、転送結果を確認して次の処理に進みます。

まとめると、CPUは最初に指示を出し(①)、最後に完了を受け取る(③)だけで、膨大な転送作業(②)をDMACに丸ごと委託できます。上のツールの▶ボタンを押すと、この3ステップの様子をアニメーションで確認できます。

関連コンテンツ