このページでは、SRAM・DRAM・フラッシュメモリの違い、記憶階層、実効アクセス時間の計算、ライトスルーとライトバック、キャッシュの割付方式がわかります。
- 一言で言うと:
- メモリの種類と、遅いメモリを速く見せる工夫の話。メモリの種類、速いものと大きいものを組み合わせる記憶階層、キャッシュの計算と書込み方式、キャッシュの置き場所の決め方、メモリインタリーブまで。
メモリの種類 → 速さと容量を組み合わせる(記憶階層)→ 平均の速さを計算する(実効アクセス時間)→ いつ書き戻すか(書込み方式)→ どこに置くか(割付方式)→ 並べて同時に読む(メモリインタリーブ)
覚え方の軸
- メモリは「電源を切ると消える(揮発性)」か「消えない(不揮発性)」か:
- 揮発性はSRAM(フリップフロップ、速い、キャッシュ)とDRAM(コンデンサ、リフレッシュ必要、主記憶)。不揮発性はフラッシュメモリ、FeRAM
- 記憶階層は「上ほど速くて小さくて高い、下ほど遅くて大きくて安い」:
- レジスタ → キャッシュ → 主記憶 → ディスクキャッシュ → 補助記憶
- 実効アクセス時間は「当たったときの時間×当たる確率+外れたときの時間×外れる確率」
- 書込み方式は「すぐ書く(ライトスルー)」か「追い出すときに書く(ライトバック)」か:
- 一貫性をとるか、速さをとるか
- キャッシュの割付は「置ける場所の自由度」で3つ:
- 1か所だけ(ダイレクト)、セットの中ならどこでも(セットアソシアティブ)、どこでも(フルアソシアティブ)
半導体メモリの種類と特徴:メモリの種類
- RAM(Random Access Memory):
- 読み出しも書き込みもできるメモリ。電源を切ると内容が消える揮発性メモリと、消えない不揮発性メモリがある
- ROM(Read Only Memory):
- 基本的には読出し専用のメモリ。書換えはできないが、不揮発性なので電源を切っても内容が残る
- SRAM(Static RAM):
- フリップフロップ回路で情報を記憶するRAM。主にキャッシュメモリに使う
- リフレッシュが不要なので速い
- 短所:
- 集積度を上げにくく容量が小さい。1ビットあたりの値段が高い
- DRAM(Dynamic RAM):
- コンデンサ(キャパシタ)に蓄えた電荷の有無で情報を記憶するRAM。主に主記憶装置に使う
- 集積度を上げやすく、大容量で1ビットあたりの値段が安い
- 短所:
- 電荷は時間がたつと失われるのでリフレッシュを随時行う必要があり、SRAMより遅い
- リフレッシュ:
- コンデンサの電荷が放電しきる前に、電荷を注入し直す処理(再書込み)
- コンデンサ:
- 2枚の金属板の間に絶縁体(誘電体)をはさんだ電子部品
- ①電荷を蓄える ②直流は通さないが、交流は通す(試験では②が問われる)
- DRAMの種類
| 種類 | 特徴 |
|---|---|
| SDRAM(Synchronous DRAM) | バスクロック(外部クロック)に同期して、1クロックにつき1データを読み出す |
| DDR SDRAM(Double Data Rate SDRAM) | クロック信号の立ち上がりと立ち下がりの両方に同期して読み出す。SDRAMの2倍の転送速度 |
| DDR2 SDRAM | DDRの2倍(SDRAMの4倍)の転送速度。CPUが必要とする前に先読みするプリフェッチ機能(4ビットずつ)を持つ |
| DDR3 SDRAM | DDR2の2倍の転送速度。8ビットずつのプリフェッチ |
| DDR4 SDRAM | DDR3と同じく8ビットずつのプリフェッチ。転送速度はDDR3の2倍 |
- 注意(新しい規格):
- 2020年にJEDECがDDR5 SDRAMを標準化し、今のPCではDDR5が主流になりつつある。DDR4よりさらに速く、プリフェッチは16ビット。試験対策としてはDDR4までを押さえれば十分
- フラッシュメモリ(不揮発性メモリ):
- 電源を切っても内容が残る。電気的に書き換えられるが、上書きができないので「消去 → 書込み」の順に行う
- 消去はブロック単位。消去回数に上限があるので、同じブロックばかり書き換えるとそこだけ劣化する
- ウェアレベリング:
- 各ブロックをなるべく均等に使うように制御して、フラッシュメモリ全体の寿命を延ばす技術
- NOR型とNAND型
| NOR型 | NAND型 | |
|---|---|---|
| 得意なこと | 信頼性が高い、読出しが速い、ランダムアクセスが得意 | 集積度が高く、安く大容量にできる、書込みも速い |
| 苦手なこと | 回路が複雑で高集積化に不向き | ― |
| 用途 | ファームウェアの格納 | USBメモリやSSDなどのデータストレージ |
| 消去の単位 | ブロック | ブロック |
| 読み書きの単位 | バイト | ページ |
- ブロック:
- ページを複数まとめたもの
- NAND型のタイプ(1セルに何ビット記録するか)
- SLC型(Single-Level Cell):
- 1セルに1ビット。従来型
- MLC型(Multi-Level Cell):
- セルの電子の量に応じて、1セルに複数ビットを記録する。ふつう2ビットのものをMLCという
- TLC(Triple-Level Cell):
- 3ビット
- QLC(Quad-Level Cell):
- 4ビット
- PLC(Penta-Level Cell):
- 5ビット
- SLC型(Single-Level Cell):
- FeRAM(Ferroelectric RAM:強誘電体メモリ):
- 強誘電体材料の分極の仕組みを記憶に使う不揮発性メモリ。構造はDRAMによく似ている
- 特徴:
- 読み書きが速い(読出しはDRAM並み)、フラッシュメモリより書換え可能回数が多い、DRAMやフラッシュメモリより低消費電力
- 相変化メモリ:
- 結晶状態と非結晶状態の違いを使って記憶する不揮発性メモリ
記憶階層:速いものと大きいものを組み合わせる
- 問題:
- CPUがいくら速くても、主記憶や補助記憶へのアクセスが遅ければ処理は速くならない
- CPUは「高速で大容量」の記憶装置を望むが、ふつうは速いものほど小さくて高い、大きいものほど遅い
- 記憶階層:
- 記憶装置をうまく階層にして、CPUからは高速で大容量の記憶装置があるかのように見せること(よく使うものほど手元の机に、あまり使わないものは倉庫に置くイメージ)
- 上から:
- レジスタ → キャッシュメモリ(L1 → L2)→ 主記憶装置 → ディスクキャッシュ → 補助記憶装置(磁気ディスク装置)
- 上ほど高速・小容量・高価、下ほど低速・大容量・安価
| 記憶装置 | 役割 |
|---|---|
| レジスタ | CPUの中にある高速な記憶装置。何度も繰り返し使うデータを入れておく(毎回主記憶を読むと効率が悪い) |
| キャッシュメモリ | CPUと主記憶の速度の差を埋める、主記憶より速い記憶装置。CPUが使いそうなデータやプログラムを主記憶からコピーしておき、CPUはキャッシュを読みに行く |
| ディスクキャッシュ | 磁気ディスク装置より速い記憶装置。磁気ディスクのデータやプログラムの一部をコピーしておく |
- 命令キャッシュとデータキャッシュ:
- メモリアクセスの局所性をより生かすため、プログラムだけを入れる命令キャッシュと、データだけを入れるデータキャッシュを分けることがある
- 1次キャッシュ(L1キャッシュ):
- キャッシュを複数置くとき、CPUに近く最初にアクセスされるもの
- 2次キャッシュ(L2キャッシュ):
- L1に必要な情報がないとき、次にアクセスされるもの
主記憶の実効アクセス時間:平均の速さを計算する
- キャッシュにはCPUが使いそうなデータしか入っていない。キャッシュにあれば速く読めるが、なければ主記憶を読みに行く
- ヒット率:
- 使いたいデータがキャッシュメモリにある確率
- ミスヒット:
- 使いたいデータがキャッシュメモリにないこと。ミスヒットしても割込みは起きない
- NFP(Not Found Probability):
- ミスヒットになる確率。NFP=1 − ヒット率。★試験ではヒット率でなくNFPで出ることもある
- 実効アクセス時間(平均アクセス時間)(★計算問題)=
- TC × P + TM × (1 − P)(TC:キャッシュのアクセス時間、P:ヒット率、TM:主記憶のアクセス時間)
- 例:
- 主記憶A(60ナノ秒、キャッシュなし)と、それより遅い主記憶B(80ナノ秒)にキャッシュ(8ナノ秒、ヒット率0.9)を付けたものを比べる
- 主記憶Bの実効アクセス時間 = 8×0.9 + 80×0.1 = 7.2 + 8 = 15.2ナノ秒
- キャッシュを付けると、遅い主記憶Bでも、速い主記憶A(60ナノ秒)より速く読める
- 主記憶全体を速くするのはお金がかかるので、小さなキャッシュでスループットを上げるのはコストパフォーマンスが高い
- 例題:
- キャッシュ5ナノ秒、主記憶50ナノ秒、NFPが0.1(ヒット率0.9)→ 5×0.9 + 50×0.1 = 4.5 + 5 = 9.5ナノ秒
主記憶への書込み方式:いつ主記憶に書き戻すか
- キャッシュ上のデータは、いつか主記憶に書き出す必要がある。書き出すタイミングで2つの方式に分かれる
- ライトスルー方式:
- CPUが書き込むとき、キャッシュと同時に主記憶にも書き込む
- 長所:
- 両者の内容が必ず一致するので、データの一貫性(コヒーレンシ)を保てる。キャッシュからデータを追い出すときに特別な処理が要らないので、仕組みを単純にできる
- 短所:
- 主記憶への書出しが終わるまでCPUが次の処理に移れないので遅い
- ライトバック方式:
- CPUが書き込むとき、キャッシュだけに書いておき、主記憶への書込みは、そのデータがキャッシュから追い出されるときに行う
- 長所:
- 主記憶への書込みを待たなくてよいので速い
- 短所:
- 主記憶への反映が後になるので、キャッシュと主記憶の一貫性(コヒーレンシ)を保てない。コヒーレンシ問題など考えることが増えるので、仕組みが複雑になる
- 主記憶に書き込むタイミングには、ほかにシステムの処理の空き時間などもある
- コヒーレンシ:
- キャッシュと主記憶のデータの一貫性
- LRU(Least Recently Used)アルゴリズム:
- ライトバック方式で、キャッシュのどのデータを追い出すかを決めるアルゴリズムで最もよく使われる。「最後に使われてから最も長い時間がたったもの」を追い出す
- 追い出す選択を間違えると、追い出したばかりのデータをまた読み直すことになり、ヒット率が下がる
- 根拠:
- 時間的局所性から、最近使われていないものは将来も使われないと推測できる
- 例:
- 最後に参照された時刻が「データA 10:05、データB 9:50、データC 10:00」なら、最も前に使われたデータBを追い出す(読み込まれた時刻ではなく、最後に参照された時刻で判断する)
- 時間的局所性:
- 一度アクセスされたデータは、近いうちにまたアクセスされる可能性が高いという性質
- その他の追出しアルゴリズム
- FIFO:
- 一番最初にロードされたデータを追い出す
- LIFO:
- 一番最後にロードされたデータを追い出す
- LFU:
- 使用頻度が最も小さいデータを追い出す
- FIFO:
- マルチプロセッサでのデータ整合性:
- 主記憶を共有するマルチプロセッサで、同じデータを各CPUのキャッシュに持っているとき、他のCPUが主記憶のデータを更新すると、自分のキャッシュと主記憶が食い違う
- スヌープ方式:
- 各キャッシュの内容を正しく保つ方式。共有する主記憶のデータが変わったかをバスを介して監視し、自分に影響する変更があれば、自分のデータを最新データで更新するか無効にする
- バススヌープ:
- バスを監視する動作
- ライトバック方式では主記憶に最新データがないことがあり、古いデータを読む危険がある。スヌープ方式では他のキャッシュと更新情報を交換して、どのキャッシュに最新データがあるかを知る
キャッシュメモリの割付方式:主記憶のデータをキャッシュのどこに置くか
- 主記憶のデータをキャッシュのどのブロックに対応づけるかで、3つの方式がある
- ブロック番号:
- 8語(word)や16語などの単位でまとめたブロック単位のアドレス
- ダイレクトマッピング(ダイレクトマップ)方式:
- 主記憶のブロック番号から、キャッシュのブロック番号が一意に決まる(ハッシュ演算で求める)
- 式:
- (主記憶のブロック番号)mod(キャッシュの総ブロック数)= キャッシュのブロック番号
- mod:
- 割り算の余り。「a mod b」はaをbで割った余り
- 例:
- キャッシュの総ブロック数が7のとき、主記憶のブロック9は 9 mod 7 = 2。ブロック2も 2 mod 7 = 2 なので、同じ場所を取り合う。CPUがこの2つを交互に読むと追出しが起きる
- 例題:
- キャッシュが8ブロックなら、主記憶のブロック21は 21 mod 8 = 5番に入る(ブロック5、13、29も5番を取り合う)
- フルアソシアティブ方式:
- 主記憶のブロックを、キャッシュのどのブロックにも置ける
- 長所:
- 書きたいブロックがふさがっていても空いている所に書けるので、ヒット率が上がる
- 短所:
- どのブロックがどこにあるかを全部覚えておく必要があり、検索に時間がかかる。ダイレクトマッピング方式よりオーバヘッドが多く、仕組みも複雑
- セットアソシアティブ方式:
- ダイレクトとフルアソシアティブの中間。連続したキャッシュブロックをセットにまとめ、セットの中ならどのブロックにも置ける
- セット番号の決め方:
- (主記憶のブロック番号)mod(総セット数)
- 例:
- 4セット(各セットにブロック0と1)のとき、主記憶のブロック3と11は、どちらも 3 mod 4 = 11 mod 4 = 3 でセット3になる。セット3には2つのブロックがあるので、3がセット3の0番を使っていれば、11は1番に入れられる(追出しが起きない)
- Nウェイ・セットアソシアティブ:
- セットの中のブロック数がN個のもの(上の例は2ウェイ)
| 方式 | 置ける場所 | ヒット率 | 仕組み・検索 |
|---|---|---|---|
| ダイレクトマッピング | 1か所に決まる(mod 総ブロック数) | 低め(取り合いで追出し) | 単純で速い |
| セットアソシアティブ | セットの中ならどこでも(mod 総セット数) | 中間 | 中間 |
| フルアソシアティブ | どこでも | 高い | 複雑、検索に時間がかかる |
メモリインタリーブ:主記憶を分けて同時に読む
- メモリインタリーブ:
- 主記憶を、独立にアクセスできる複数のメモリバンクに分け、並行してアクセスすることで、見かけ上のアクセス速度を上げる(キャッシュとは別の、主記憶へのアクセスを擬似的に速くする方法)
- メモリバンク:
- 主記憶をいくつかのアクセス単位に分割したもの
- 例:
- 連続したアドレスをバンク1、2、3、4に順番に割り振っておくと、連続したデータを4つのバンクから同時に読み出せる(スーパーのレジを4つ開けるイメージ)
- 注意:
- 連続したアドレスへのアクセスでないと効果が薄い。読みたいデータがすべてバンク1にあれば、速くならない
- プロセッサの多重化と同じく、バンク数と性能向上は比例しない。高速化を突き詰めるには、メモリインタリーブの特徴を生かすハードウェアやソフトウェアが必要
混同しやすいペア
- SRAM(フリップフロップ、リフレッシュ不要、速い、高い、キャッシュ)/DRAM(コンデンサ、リフレッシュ必要、遅い、安い、主記憶)
- SDRAM(クロックに同期、1クロック1データ)/DDR SDRAM(立ち上がりと立ち下がりの両方、2倍)
- DDR2(4ビットプリフェッチ)/DDR3・DDR4(8ビットプリフェッチ)
- NOR型(読出しが速い、ランダムアクセス、ファームウェア)/NAND型(大容量、安い、書込みも速い、USBメモリ・SSD)
- SLC(1ビット)/MLC(2ビット)/TLC(3ビット)/QLC(4ビット)/PLC(5ビット)
- フラッシュメモリ(書換え回数に上限)/FeRAM(強誘電体、書換え回数が多い、低消費電力)
- ヒット率(キャッシュにある確率)/NFP(ない確率=1 − ヒット率)
- ライトスルー(同時に書く、一貫性あり、遅い、単純)/ライトバック(追い出すときに書く、速い、一貫性なし、複雑)
- LRU(最後に使ってから最も長い)/LFU(使用頻度が最も少ない)/FIFO(最初にロードした)/LIFO(最後にロードした)
- ダイレクトマッピング(mod 総ブロック数、1か所)/セットアソシアティブ(mod 総セット数、セット内)/フルアソシアティブ(どこでも)
- キャッシュメモリ(速い小さなメモリにコピーする)/メモリインタリーブ(主記憶をバンクに分けて並行アクセスする)