キャッシュメモリについて

コンピュータの基礎知識
この記事を書いた人
井上 周

WEBのバックエンドエンジニア。金沢大学大学院→株式会社マイベスト。
最も得意な言語はRuby(Rails)。その他、GoやPython、TypeScriptsを使った開発を行っています。

井上 周をフォローする

ご覧いただきありがとうございます!
こんにちは!!金沢で学生をしています、あまね(@isaka122)です!

さて、キャッシュについて勉強したことのまとめです。

キャッシュとは、小型の小容量の高速メモリのことです。
CPUに一番近い位置にあります。

コンピュータの処理を高速化に役立てられます。

キャッシュは小容量なのですが、これでコンピュータが高速化するんです!

その仕組みを解説していきますね。

コンピュータの記憶装置の3種類

コンピュータには、例えばプログラムを記憶したり、動画や写真などのデータを記録したりと、記憶領域があります。

このデータを保存するために使われるのは主に以下の3種類の装置です。

  • キャッシュ
  • 主記憶装置
  • 補助記憶装置

詳しく見ていきましょう。

キャッシュ

キャッシュは先程も述べた、小容量の超高速メモリです。

SRAMという素子が使われることが多いです。

ものすごく高速なのですが、あまり容量が高くありません。
また、定期的にリフレッシュ動作をする必要があります。

主記憶装置

「メインメモリ」とも言われます。
一般的に「コンピュータのメモリ」と言ったら主記憶装置のことを指します。
DRAMなんかが使われます。

補助記憶装置

補助記憶装置は、大容量の低速メモリです。
ハードディスクや SSDがこれに当たります。

ハードディスクなんかでは磁気によって書き込みが行われています。

速度は「キャッシュ>主記憶>補助記憶」
容量は「補助記憶<主記憶<キャッシュ」

といった具合になります。

キャッシュで高速化が図られる理由

さて、ではなぜキャッシュを使うと高速化ができるのでしょうか?

それは、キャッシュを使うことでデータの読み書きのスピードをCPUの速度に合わせることできるからです。

これがどういうことか説明していきますね。

実は、主記憶装置の書き込み速度はプロセッサの速度に比べてかなり遅いのです。
いかに良い性能のプロセッサを使っていても、主記憶の読み出しの速度が遅ければ結果としてプロセスの処理は遅くなってしまいます。

じゃあ書き込みが早い装置を使えばいいじゃないか!
ということなのですが、書き込みが早いSRAMという素子は大容量にできない・・・。

そこで、この2つを組み合わせて高速な書き込みができないかと考えた結果、

データをあらかじめキャッシュに保存しておくという方法がとられることになります。

実は、よく使うデータというのは予測できます。
それには「プログラムの局所性」という性質を使っています。

プログラムの局所性

  • 空間的局所性・・・メモリ内で近い部分が将来的に参照されやすい
  • 時間的局所性・・・一度参照されたデータは将来的に再び参照されやすい

この局所性をもって、次に使われそうなデータをあらかじめ主記憶からキャッシュに読みこんで置きます。
すると、CPUはキャッシュからは高速にデータを読み書きができるので、結果としてコンピュータが高速化されるのです!

キャッシュへのアクセスの方法

では次にCPUはキャッシュにどうアクセスしているか説明します。

読み出し

読み出しは大きく2ステップです。

1. キャッシュにアクセス

2. あれば(ヒット)読み出し

2. なければ(ミス)主記憶からデータを読み出して、キャッシュに上書きする

読み込みはシンプルですね。

書き込み

書き込みですが、2種類の方法があります。

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

です。

ライトスルー方式

まず、ライトスルー方式について説明します。
ライトスルー方式は大きく2ステップです。

1. キャッシュにアクセス

2. データがあればキャッシュのデータ、主記憶上のデータを上書き

2. なければ主記憶上のデータを上書き

データがあってもなくても、主記憶まで書き込みをします。

利点としては、必ず主記憶にも上書きをするのでキャッシュの間にデータの矛盾が生じることがありません。

しかし、欠点として毎回主記憶にアクセスするので遅くなります。
これではキャッシュの「主記憶へのアクセスを減らして高速化を測る」という目的達成が遠くなってしまいます。

ライトバック方式

もう1つの方法はライトバック方式です。
こちらも2ステップ。

1. キャッシュにアクセス

2. データがあればキャッシュのデータのみを上書き

3. なければ主記憶からキャッシュに読み出しして、キャッシュのみ上書き

どちらにしてもキャッシュにだけ上書きする方法です。書き込みがとにかく高速で行えます。
キャッシュの本来の目的達成ですね。

でも、その分キャッシュと主記憶の間で食い違いが生じることがある。

セパレートキャッシュ

さて、ここではセパレートキャッシュについて解説したいと思います。

まずは、主記憶の仕組みから

命令とデータそれぞれにキャッシュを用意する

メリット

  • パイプライン処理ができる
  • バンド幅とアクセス時間が改善する
  • 物理的に近い場所に置くことで転送時間が短縮

デメリット

  • 命令とデータが同じブロックにあると困る
  • プログラムによっては効率が悪い

マッピング

キャッシュと主記憶はブロックによってデータをやりとりしてます。
主記憶のアドレスはキャッシュのどこにでも格納できるというわけではなく、両者の間にはある種の対応が決められているのです。

マッピングには3種類の方法があります。

  • ダイレクトマップ方式
  • セットアソシエイティブ方式
  • フルアソシエイティブ方式

の3種類です。

ダイレクトマップ方式

ダイレクトマップ方式とは、ページの内容に応じてキャッシュの場所が決まります。(例えば剰余などを使います)
これによって、データが格納させるキャッシュ上の場所は1つに決まるわけです。

セットアソシエイティブ方式

セットアソシエイティブ方式では、ページの内容に応じてどのセットに入るかが決まります。
セットとは、キャッシュの場所の集まりです。

例えば、1,2,3,4,5,6というキャッシュの場所があったとします。
1,2,3がセット1、4,5,6,をセット2とすると、ページの内容でセット1と2のどちらに入るかが決まるんです。

セット内でどこに入るかは自由に決めることができます。

フルアソシエイティブ方式

フルアソシエイティブ方式は、ページをキャッシュの任意の場所にいれることができる方式です。

まとめ

以上、ここまでキャッシュについて僕がまとめたことをまとめてみました。
みなさんの勉強のお役に立てれば幸いです。

 

タイトルとURLをコピーしました