この記事は、メモリ管理 からの続編です。
この記事は、絵でわかる プログラムとは何か(4)~マルチタスクとメモリ~ の一記事です。
この記事のポイント
- 超高速なCPUを、ケタ違いに低速な入出力に付き合わせるのは、もったいない。
- だから入出力装置側に、CPUより低速な専用プロセッサDMACを付け、制御を代行させる。
- 入出力データは、いつでもすぐ利用できるよう、バスを通じてメモリに一時記録される。
- CPUを介さず、入出力装置から直接メモリアクセスする入出力をDMAと言う。
- バス上の共用DMACより、入出力装置内のDMACによるバスマスタリングが主流となっている。
- バスの調停では、バスのホストコントローラーがバスアービターとしてバスマスターを決める。
入出力に重要なメモリ
コンピューターにつながる入出力装置は、キーボードとディスプレイの他にも、マウスやストレージ、ネットワーク機器など、様々なものがあります。
これらの入出力装置は、コンピューター内にあるバス(bus)と言われる配線につなげられます。
このバスは、乗り物のバスと同じ英単語です。元々、配線にはその形状に応じて、バス(┴┬)型やリング(○)型、スター(*)型などいくつかの種類があって、一本のバス路線にポツポツとバス停がつながるような形状の配線をバス型と言ったところから、それがそのままコンピューター内の標準配線の名前として使われるようになりました。
バスには、入出力装置だけでなく、プロセッサやメモリもつながります。
そして通常、これらの入出力装置が、バスを通じてデータを送受信する先は、メモリになります。
- コンピューターに入力されたデータは、直ちにメモリへ保存されて、いつでもすぐ利用できるようになります。
- コンピューターから出力するデータは、あらかじめメモリに用意されて、いつでもすぐ取り出せるようになっています。
入出力の末端にメモリを使用することで、送受信を速く正確にできるのです。
このようなメモリの使い方をバッファと言います。バッファは、メインメモリだけでなく、入出力装置内のメモリが使われることもあります。
プロセッサを待たせる入出力
そして、メモリアクセス(アドレス指定)や送受信制御(クロック同期転送)をするのは本来、プロセッサの役割になります。
しかし、現在のプロセッサやメモリのデータ送受信能力は、周りの入出力装置の送受信速度より、ケタ違いに速いのです。入出力装置とメモリの間の送受信制御を超高性能なCPUにやらせていたら、他のどんな作業も超高速で処理できるCPUに、無駄な待ち時間ばかりを与えて、もったいないことになってしまうのです。
このように、データ送受信の制御まで細かくプログラムに記載し、CPUが入出力装置とメモリの間の送受信制御を行う方式をPIO(Programmed Input/Output)と言います。
CPUの代理で送受信制御をするDMAC
そこで、コンピューターの処理の中心となるCPUとは別に、入出力装置側に送受信制御専門のプロセッサ(コントローラー)を設置しておきます。
そうして、そのコントローラーに送受信制御を任せ、CPUは入出力に関係しない処理を先に進める「分業体制」をとれるようになりました。
このようにCPUを待たせず、入出力装置側から直接メモリに対してデータの送受信を行う制御方式を、DMA(Direct Memory Access)と言います。また、このようなコントローラーのことをDMAC(DMA Controller)と言います。
ファーストパーティーDMA と サードパーティーDMA
入出力装置側と言っても、さらにその置き場所によって、DMACは2種類に分かれます。
- 複数の入出力装置で共用できるようにバス上に設置されているDMAC
- 各入出力装置に内蔵されているDMAC
DMACが2種類あるのに合わせて、どちらのDMACを使うかによって、DMAの方式も2種類に分かれます。現在は、より高速なファーストパーティーDMAが主流となっています。
- バス上の共用のDMACによるDMA・・・サードパーティーDMA
- 入出力装置内蔵のDMACによるDMA・・・ファーストパーティーDMA
この場合のパーティーは「宴」ではなく「側」くらいの意味で、ファーストパーティー(first-party:第一人称)は主体者側、セカンドパーティー(second-party:第二人称)は相手側、サードパーティー(third-party:第三人称)は第三者側です。
バスの調停とバスマスター
バスは、複数の機器が同時に使うと送受信データの衝突が起こるため、通常、バスのホストコントローラ(host controller)が、バスの利用を調停(arbitrate)します。
ホストコントローラーは、ホストバスアダプタ(Host Bus Adapter : HBA)とも言い、バスホストとして、バスの全体管理をしています。
調停は、対立を調整して停めることです。この場合、バス使用をまず一者だけに認め、順番に他者にも認めることを指します。
ホストコントローラーが持つ、DMACからのバス使用要求に対する調停機能を、バスアービター(bus arbiter)と言います。
調停の結果、一定時間バスを独占できるようになった機器(DMAC)をバスマスター(bus master)と言います。
ファーストパーティーDMAでは、DMACを持った入出力装置がすぐさまバスマスターとなれるため、ファーストパーティーDMAのことをバスマスタリングとも言います。
DMAでCPUが絡むのは最初と最後だけ
送受信制御はDMACに任せても、メモリ管理は、OS(カーネル)からCPUを通して一元的に行う必要があります。
入出力の開始
入出力を始める時、CPUは通常、1行のマシンコードをDMACに送ります。そのマシンコードの中身は、以下3項目です。
- 読取(メモリ→入出力装置) か 書込(メモリ←入出力装置) か
- 入出力データの先頭メモリアドレス
- 入出力先の指定(以下の1. および、複数データの中から指定する場合は2. 3. も)
- 入出力装置の指定
- 入出力装置内の先頭アドレス
- データのバイト数
入出力の終了
入出力開始のマシンコードを送ったら、CPUは入出力データに関係しない処理を先に進めます。一方DMACは、CPUから受け取ったマシンコードに従って入出力処理を進めます。入出力処理が完了したら、DMACはCPUへ割り込み信号を送り、入出力の完了をOSに知らせます。(入出力割込)
この記事のまとめ
通常、入出力データは、いつでもすぐ利用できるよう、バスを通じてメモリに一時記録されます。
CPUの速度は、入出力の速度に比べ、ケタ違いに超高速なので、入出力装置とメモリの間のデータ送受信に、CPUの足が引っ張られるのは、CPUの無駄遣いになります。
入出力装置側に、CPUより低速な専用プロセッサDMACを付け、CPUを介さず、入出力装置側から直接メモリアクセスする入出力をダイレクトメモリアクセス(DMA)と言います。
DMAは、バス上の共用DMACより、入出力装置内のDMACによるバスマスタリングが主流となっています。バスの調停では、バスのホストコントローラーがバスアービターとしてバスマスターを決めています。
以上で、絵でわかる プログラムとは何か(4)~マルチタスクとメモリ~ は終わりです。
次は、絵でわかる プログラムとは何か(5)~データ~ へ進みましょう。
コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。
日本全国 オンラインレッスン にも対応しています。
知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。