このようにページテーブル方式は自由度が高いアドレス変換方式であるが、科学技術計算でGB単位の巨大な配列を用いる場合や、データベースのバッファにGB単位の巨大なメモリを使う場合には、メインTLBの全エントリを使っても8KBx1024=8MB程度であり、このような巨大領域はカバー出来ず、TLBミスが頻発する。そして、TLBミスが発生するとメインメモリ上のページテーブルを読む必要があり、メモリアクセスの性能が大幅に低下してしまう。
このような巨大なメモリ領域を効率的に管理するために、最近のプロセサでは、ラージページと呼ぶ大きなサイズのページが扱えるようになっている。例えば、Intelのx86アーキテクチャのプロセサでは標準の4KBページに加えて4MBあるいは2MBのページをサポートしている。また、Sun Microsystems-富士通のSPARCアーキテクチャの場合は、ベースの8KBのページサイズに加えて、64KB、512KB、4MBという3種類のラージページが使用できる。
ラージページを用いるとTLBミスが減り性能が向上するが、単純なセットアソシアティブ方式のTLBを用いると、例えば4MBのページにTLBの4096エントリを必要としてしまいラージページの効果が得られない。したがって、プログラムがメモリ領域を確保するときにページサイズを指定し、ページサイズごとにTLBを設け、サイズの大きいTLBのヒットを優先するという構造がとられる。
Physical IndexキャッシュとVirtual Indexキャッシュ
このように、ページテーブルを使って、プログラムの世界のアドレスと実メモリのアドレスの変換を行うとメモリの利用率を改善することができる。しかし、ここでデータや命令キャッシュを使う場合、インデックスとしてプログラムの世界のアドレスであるVirtual Address(仮想アドレス)を使うのか、実メモリのアドレスであるPhysical Address(物理アドレス)を使うのかという選択が出てくる。
複数のプログラムをマルチプロセスで動かすと、プロセスごとに仮想空間が作られ、独立の仮想アドレスが振られる。このため、仮想空間ごとのページテーブルによるメモリ管理で、それぞれのプロセスに対応したアドレス変換を行うが、逆に言うと、プロセスAの0番地とプロセスBの0番地は異なる物理アドレスとなる。したがって、実行するプロセスを切り替えると、キャッシュの内容をすべてフラッシュ(Flush)する必要があり、効率が悪い。このため、キャッシュを引くインデックスとしては、プロセサの中で一意にメモリを指定できる物理アドレスの方が望ましい。
しかし、プロセサのロード、ストアユニットから出てくるのは仮想アドレスであるので、TLBを引いて物理アドレス変換し、その物理アドレスでキャッシュをアクセスするという2段階のアクセスが必要となる。
図5.8 Physical Index方式のキャッシュアクセス |
ワーキングセットが大きなビジネス用のプログラムを効率よく動かすため1次キャッシュの容量を大きく取りたいメインフレームプロセサでは、図5.8のようにTLBを引いて物理アドレスを求め、それを使ってキャッシュをアクセスするという方式が用いられているが、TLBを引く時間だけ1次キャッシュのアクセス時間が延びてしまうという問題がある。これは出来るだけアクセス時間を短くしたい1次キャッシュとしてはハンディキャップである。
しかし、詳細に見ると、仮想アドレスはページの単位で物理アドレスに変換されるが、ページ内のアドレスは変換されないので仮想アドレスと物理アドレスは同じである。したがって、図5.9のように、この物理アドレス=仮想アドレスの部分だけを使ってキャッシュをアクセスすれば、TLBを通さず1次キャッシュをアクセスすることができ、TLBを引くというペナルティを払わなくて良い。