![CPU は実際にどのメモリからデータを読み取るのでしょうか?](https://rvso.com/image/1540085/CPU%20%E3%81%AF%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%81%A9%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
私の理解によれば、CPUで処理するデータは、ラム一方、CPU自体はキャッシュメモリ、データへのアクセスにも使用されます。CPU キャッシュは CPU に「近く」、他の種類のメモリよりも高速であることはよく知られています。しかし、処理するにはデータを CPU キャッシュに格納することが必須であるかどうかは、私にはやや不明瞭です。必須である場合、キャッシュはどのようにして大量のデータを保持できるのでしょうか。(キャッシュ サイズは RAM に比べて小さく、最大数 MB、多くの場合 1 未満です) そうでない場合、CPU はデータのどの部分をキャッシュに格納するかをどのように決定するのでしょうか。
私もスワップについては少し混乱しています。CPU はそれを RAM の一部として扱い、そこに保存されているデータを HDD から直接処理するのでしょうか?
答え1
CPU のキャッシュはデータを保存するのではなく、アクセスを高速化するだけです。
キャッシュの最も基本的な説明は、CPU が RAM から特定のバイトを読み取ろうとすると、そのデータもキャッシュにコピーされるということです。次に CPU がそのバイトを読み取る必要があるとき、メモリ コントローラはそれがキャッシュ内にあることを確認し、RAM への低速な呼び出しを行う代わりに、キャッシュから CPU にデータを渡すだけです。
ただし、この説明には 2 つの具体的な問題があります。
キャッシュのサイズは有限です。このため、データが追加されると、最終的には古いデータを削除 (または「ドロップ」) して、スペースを確保する必要があります。これを行うにはさまざまな方法があり、正確な方法論はこの議論では重要ではありませんが、重要なのは、しばらくするとデータがキャッシュ内になくなる可能性があり、その場合はとにかくメイン メモリに移動する必要があることです。
データが書き込まれるときに、そのアドレスに以前保存されていたキャッシュのデータを更新するか削除する必要もあります。これを処理するには、主に 3 つの方法があります。
- ライトバック: ライトバック方式を使用すると、データは最初にキャッシュに書き込まれ、その後最終的にメイン メモリに書き出されます。これはパフォーマンスの面で多くの利点がありますが、状況によっては問題を引き起こす可能性があります。
- ライトスルー: ライトスルー方式を使用すると、データはキャッシュとメインメモリの両方に同時に書き込まれます。ライトバックよりもパフォーマンスは低くなりますが、より安全です。
- ライトアラウンド: ライトアラウンド方式を使用すると、データはメインメモリに直接書き込まれ、同じ場所にあったデータはキャッシュから削除されます。これは、非常に特殊なユースケースを除いてほとんど使用されません。
RAM と CPU キャッシュに関する質問にお答えすると、技術的には両方ですが、ほとんどの場合、データは最終的に RAM から取得されます。この点について具体的に詳しく知りたい場合は、次の 2 つの Wikipedia の記事を読むことをお勧めします。
https://en.wikipedia.org/wiki/キャッシュ_(コンピューティング)
https://en.wikipedia.org/wiki/CPU_cache
さて、スワップ スペースの問題ですが、これは仮想メモリとページングに結びついたまったく異なる概念です。ここでそれを説明しようとすると、Wikipedia の記事のほとんどを書かなければならなくなるので、代わりに問題の記事を直接紹介します。