- ベストアンサー
データキャッシュ、命令キャッシュ、キャッシュフラッシュ
データキャッシュ 命令キャッシュ キャッシュフラッシュ この三つの差がよくわかりません。キャッシュはCPUの処理速度を上げるためのものであることは理解しています。私が知っていたのはデータキャッシュのみで、同じデータのやり取りを行う時に使用するものですよね? では、命令キャッシュとは、同じ命令を行うときに使用する?いつ、どこで、その命令をキャッシュに入れておくのでしょうか? キャッシュフラッシュはなんとなくわかります。キャッシュに格納してある情報を要求先へ送ることですか? 会社でこの質問に答えれなくて、宿題にされてしまいました・・・・。答えでも、答えでなくてもいいです。情報をいただけたらと思い質問させていただきました。 よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
プロセッサとメインメモリの処理速度は全然違うので, データが必要なたびにメインメモリにアクセスするのでは実行速度が大幅に低下してしまいます. そのため「メインメモリほど容量はないけどメインメモリより高速なメモリ」を間に入れて実行速度の低下を防ごうというのがキャッシュの主目的です. ここでは「データ」と書きましたが, プログラムの命令そのものもプロセッサから見ればデータの一種ですので, 当然命令に対しても同様に考えることができます. つまり, プロセッサから見ると, メモリアクセスは全てキャッシュに対して行われます. また, 今のプロセッサは当然のようにパイプライン化されていますので, 命令の読み込み・実行・データのアクセスが全て同時に行われます. そのため, 命令を格納するメモリとデータを格納するメモリが同じバスに接続されていると, やはり実行速度は低下してしまうため, この 2つは異なるバスに接続するハーバードアーキテクチャが使われています. ということで, 「命令に対するキャッシュ」と「データに対するキャッシュ」を分けておくとうのは合理的である, ということになります. そして, 処理が進んでいくと「キャッシュが全ていっぱいになってしまい, 新たなデータをキャッシュに読み込めなくなる」ことになります. このとき, キャッシュ上のデータを捨てる必要があるのですが, これを「キャッシュのフラッシュ」と呼びます. 命令キャッシュであったり, データキャッシュでもデータを読み込んでいるだけならいいのですが, データを書き込んでいる場合にはキャッシュ上のデータをメインメモリに書き戻す必要がある場合があります. これはデータをメモリに書き込むときに「メインメモリにも同時に書き込む (= write-through)」なら必要ないのですが, 「メインメモリにはあとで書き込む (= write-back)」場合には必須となります. したがって write-back の方がフラッシュの処理が面倒になりますが性能は一般に write-through より高くなります. なお, #1 でも書かれているようにキャッシュは「アクセスの局所性」に基づいていますので, 分岐命令に対してうまく処理しなければならないという問題点があります (分岐先の命令をキャッシュに入れておかないと実行できないので). 普通は分岐予測というものを使うのですが, SPARC V9 では「絶対分岐しない分岐命令」というおもしろいものを用意してあります. これは命令単独では全く意味を持たないのですが, その副作用として「分岐先アドレスの命令をキャッシュに先読みする*かもしれない*」という機能があったりします.
その他の回答 (1)
- elmclose
- ベストアンサー率31% (353/1104)
キャッシュが有効である理由は、いわゆる参照の局所性(Locality of reference)があるからです。 そして、その参照の局所性は、データだけではなく、命令についても言えます。例えば、いかなる言語であっても普通にプログラムを書いた場合、一般的にループはよく現われます。そのプログラムをコンパイルした結果、通常は(つまりリバースエンジニアリングしにくくするためにわざとあっちこっちに飛ぶようなコードがはき出されていたりしない限りは)、そのループ部分の命令は局所的に存在します。よって、最近実行した命令をキャッシュに残しておけば、所定の確率で再度その命令をフェッチすることになります。 また、命令を先読みする場合があります。この場合も、先読みした命令をキャッシュに入れておくことにより、CPUから見た命令転送コストは、トータルとして少なくて済みます。 また、PCに基づいて単純に命令を先読みする場合だけではなく、分岐キャッシュ(分岐命令のアドレスとその分岐先とのアドレスのペアを保持)に基づいて、分岐先を予測して命令を先読みする場合もあります。 なお、キャッシュフラッシュは、キャッシュにおいている情報を捨てることではないでしょうか。