MPUについての勉強~メモリについて~

2020/12/20

組み込み

はじめに

前回はMPUの構成について勉強しました。

今回はMPUの構成の中でメモリに焦点を当てていきたいと思います。

今回は下記本を参考にしております。

 

メモリの種類

メモリには大きく分けて2種類あります。電源を切ったら内容が消えてしまう揮発性メモリ(Volatile Memory)と電源を切っても内容が消えない不揮発性メモリ(NVM:Non-Volatile Memory)です。

一般的に揮発性メモリのことをRAM(Random Access Memory)といい、不揮発性メモリのことをROM(Read Only Memory)といいます。

ただ、個人的には不揮発性メモリのことをROMというのはあまり好きではありません。昔は名前の通り読み込み専用だったかもしれませんが、最近時は書き込みもできるからです。
(書き込みもできるけどROMという理由を知っている人がいれば教えていただきたいです。。。)

図1に各メモリの種類と概要をまとめました。

図1:半導体メモリの種類と概要

MPUとの速度とメモリのアクセス速度

以前の記事でも紹介しましたがMPUはプログラムをメモリから読み出し、メモリ上のデータを加工しながら動作しています。なので、MPUはメモリにアクセスする必要があります。


しかし、MPUがメモリに対して読み込み(書き込み)要求を出してから、実際にデータがMPUのレジスタに読み出せるまでには1命令を処理し終えるより長い時間がかかってしまいます。この時間差をメモリアクセスのレイテンシといいます。

MPUが次の動作に移るためにはこのメモリアクセスが完了しないといけません。
なので、MPUがいくら高速でもメモリアクセスの速度が遅いとボトルネックとなってしまい、性能が出せません。このボトルネックのことをフォンノイマン・ボトルネックといいます。

※フォンノイマンボトルネックについては下記を参照してください。[1]
プロセッサが命令を実行するためには、バスを通して記憶装置にアクセスしなければならず(ストアドプログラム方式=記憶装置内に命令が入っている)、プロセッサの処理速度と記憶装置のアクセス速度に差があること、また信号伝達速度の高速化には限界があることから、転送性能に制限が生じる。つまり、CPUの処理能力にも限界ができてしまう。これがボトルネックとなる。(ボトルネックとは管自体を指す語である。)
以上のことより、主記憶として使用されるメモリが高速であるほどMPUの性能を引き出せます。メモリの種類と速度については下記の通りです。(左の方が高速)
レジスタ>SRAM>DRAM>マスクROM>フラッシュメモリ

キャッシュメモリ

先ほどメモリのアクセス速度がMPUの性能に大きくかかわると説明しましたが、高速なメモリほど高価になってしまいます。

そこで安価でMPUの性能を引き出すためにキャッシュメモリというものが考案されました。

キャッシュメモリは図3のようにMPU(図ではプロセッサ)と主記憶(メモリやディスク)の間に小容量だが高速なメモリを配置し、MPUがアクセスした主記憶のデータのコピーを保存します。MPUが次に同じデータにアクセスするときはキャッシュ内にデータがあるため、より高速にデータにアクセスできます。また、図3に記載されてますが、キャッシュメモリは複数ある場合もあります。その際の容量は1次キャッシュメモリ>2次キャッシュメモリとなります。
図2:キャッシュメモリの階層構造[2]
キャッシュの制御は専用のキャッシュコントローラというハードウェアが行うので、MPUはキャッシュの存在を認識することなく、通常のメモリにアクセスを行うだけでキャッシュを使用できます。

統合キャッシュとハーバードキャッシュ

キャッシュには統合キャッシュとハーバードキャッシュと呼ばれるものがあります。
(他にもブランチキャッシュとブランチターゲットアドレスキャッシュもあるみたいですが、ここでは紹介しません。)

2つのキャッシュの違いは命令とデータの扱いが異なります。(命令とデータについては以前のブログを見てください)


統合キャッシュは名前の通り命令とデータを統合して扱います。
ノイマン型アーキテクチャの場合はこちらの方式をとります。
図3:統合キャッシュ[3]

ハーバードキャッシュは命令だけと取り扱うキャッシュとデータキャッシュを取り扱うキャッシュの2つを持っています。
図4:ハーバードキャッシュ[3]



キャッシュヒットとキャッシュミス

キャッシュメモリに必要なデータが存在し、データが読み込むことができる場合をキャッシュヒットといいます。しかし、先ほど説明した通り、キャッシュは高速にアクセスできますが、容量が少ないため必要なデータがない場合があります。この場合をキャッシュミスといいます。(図4参照)
図5:キャッシュヒットとキャッシュミス[2]


図4ではキャッシュメモリが一つしかないので、1回キャッシュミスしたらメインメモリに読み込みに行ってますが、複数キャッシュメモリがある場合は1次キャッシュにアクセスしキャッシュミスしたら2次キャッシュにアクセスとなります。すべてのキャッシュでキャッシュミスしてしまった場合にメインメモリにアクセスします。ちなみにアクセス時間は

1次メモリ>2次メモリ>メインメモリ
の順で速いです。

当たり前ですがキャッシュミスが発生するとキャッシュのアクセス時間+メインメモリのアクセス時間となってしまうので、キャッシュにアクセスしないほうが速いことになります。

また、キャッシュ機能をうまく機能している理由として参照の局所性を利用しているからです。参照の局所性には大きく分けて時間的局所性空間的局所性の2つがあります。(正確には逐次的局所性というのもあるみたいですが、今回は省略します)

時間的局所性とは最近アクセスしたデータは再びアクセスする可能性が高いという性質です。(例えばループ変数iへのアクセスです)

空間的局所性とは最近アクセスしたデータの近傍のデータは近々アクセスする可能性が
高いという性質です。(例えば配列へのアクセスです。)

キャッシュメモリはこの局所性を利用しているので、局所性がないものに対してはキャッシュミスが発生しやすいらしいです。詳しくは参考文献[4][5][6]を見てください。

ライトスルー方式とライトバック方式

キャッシュへの書き込み方法にライトスルー方式ライトバック方式の2つがあります。
2つの違いはキャッシュの情報をメインメモリへ書き換えるタイミングが異なります。

ライトスルー方式はキャッシュと同時にメモリにも書き込みます。
メインメモリにも書き込むため書き込み時間が長いですが、キャッシュの内容とメモリの内容が一致するのでコヒーレンシ(一貫性)が保たれます。

ライトバック方式はキャッシュのみに書き込みます。
キャッシュからメモリへの書き込みはプログラムからライトバック命令が来たとき、キャッシュがいっぱいになった時に行われます。なので、メインメモリの内容とキャッシュの内容が不一致の場合があります。
図6:ライトスルー方式とライトバック方式[4]

ライトバック方式で、複数のMPUを使う場合などは適切にライトバックを行ってコヒーレンシを保つ必要があります。

まとめ

今回はキャッシュメモリについて調べました。
キャッシュメモリをうまく扱うことでMPUの性能を引き出すことが可能です。

参考文献



その他参照したサイト

自己紹介

はじめまして 社会人になってからバイクやプログラミングなどを始めました。 プログラミングや整備の記事を書いていますが、独学なので間違った情報が多いかもしれません。 間違っている情報や改善点がありましたらコメントしていただけると幸いです。

X(旧Twitter)

フォローお願いします!

QooQ