DMAコントローラがCPUを介さず直接メモリと入出力装置を転送する方式
DMA制御方式とは、専用の回路「DMAコントローラ(DMAC)」が、CPUを介さずに入出力装置とメモリの間で直接データを転送する方式のことです。DMAは Direct Memory Access の略で、「直接メモリにアクセスする」という意味です。
身近な例で考えると、引っ越し業者に荷物の運搬を丸ごと任せるのに似ています。あなた(CPU)は「どこから、どこへ、何を運ぶか」を最初に伝えるだけ。実際に荷物(データ)を運ぶのは業者(DMAC)で、その間あなたは別の用事を片付けられます。終わったら業者が「完了しました」と連絡(割込み)をくれます。
上のツールで▶ボタンを押すと、CPUがDMACに設定したあと、DMACがI/Oとメモリの間でブロックを次々と直接転送し、その間CPUが別の仕事を進める様子を確認できます。
プログラム制御方式や割込み制御方式では、データは必ず「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が速い理由は、データを運ぶ経路が短くなるからです。DMAなしの場合、データはかならず「I/O → CPU → メモリ」という経路をたどり、CPUが1語ずつ受け取っては書き込む作業を繰り返します。転送量が多いほど、CPUがその作業に拘束される時間も増えます。
DMAを使うと、経路が「I/O → メモリ」に短縮されます。CPUはDMACに「どこから、どこへ、何バイト転送するか」を最初に伝えるだけ。あとはDMACが自分でバスを使ってデータを運び、CPUは転送が終わるまで別の仕事を進められます。
CPUの負担が減る理由を一言でいうと、「転送という単純作業をDMACに外注したから」です。料理人(CPU)が野菜の仕込みから調理まで全部やるのではなく、仕込み係(DMAC)に仕込みを任せて、料理人は調理に専念できるようになった、と考えると分かりやすいです。転送が完了したらDMACが「終わりました」と割込みで知らせてくれるので、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ステップの様子をアニメーションで確認できます。