トランスレーション・ルックアサイド・バッファ (TLB) について
トランスレーション・ルックアサイド・バッファ(英: Translation Lookaside Buffer、TLB)は、
メモリ管理ユニット (MMU) 内に設けられた高速なキャッシュの一種であり、仮想アドレスを
物理アドレスに変換する処理を高速化するために用いられます。現代の多くの
マイクロプロセッサは、
仮想記憶をサポートするためにTLBを利用しています。
TLBの基本動作
TLBは通常、
連想メモリ(CAM)で実装されます。
CPUがメモリ空間にアクセスする際、仮想アドレスを検索キーとして、TLB内に対応するエントリが存在するかを検索します。
- - TLBヒット: 仮想アドレスに対応する物理アドレスがTLB内に見つかった場合、その物理アドレスが即座に返されます。この状態をTLBヒットと呼びます。
- - TLBミス: 仮想アドレスに対応するエントリがTLB内に見つからない場合、TLBミスが発生します。この場合、ページテーブルを参照して物理アドレスを特定する「ページウォーク」と呼ばれる処理が必要になります。ページウォークは複数回のメモリアクセスを必要とするため、時間がかかります。ページウォークで物理アドレスが判明すると、その仮想アドレスと物理アドレスの対応がTLBに格納されます。
TLBの概要
TLBは、仮想アドレスから
物理アドレスへの変換情報を格納する固定数のスロットを持っています。仮想アドレス空間は、プロセスから見えるメモリ空間であり、固定サイズのページに分割されます。ページテーブルは、仮想ページが物理メモリ上のどの位置に対応するかを管理しており、通常はメモリ上に存在します。TLBは、このページテーブルのキャッシュとして機能し、ページテーブルのサブセットのみを保持します。
TLBには物理メモリアドレスが格納され、
CPUと
キャッシュメモリの間、キャッシュと
主記憶装置の間、または複数レベルのキャッシュ間に配置されます。これは、キャッシュが仮想アドレスを使用するか、
物理アドレスを使用するかによって決定されます。仮想アドレスキャッシュの場合、メモリアクセスは
CPUからキャッシュに直接送られ、キャッシュミス時にTLBが使用されます。
物理アドレスキャッシュの場合、メモリアクセスの度にTLBが参照され、その結果を用いてキャッシュにアクセスします。
仮想アドレスキャッシュでは、仮想アドレスに加えて「アドレス空間識別子(ASID)」というキーも保持することがあります。ASIDがない仮想アドレスキャッシュでは、
マルチプロセッシング環境において、
コンテキストスイッチごとにキャッシュの内容をフラッシュする必要があります。
ハーバードアーキテクチャでは、命令とデータで仮想空間が分離されており、それぞれ個別のTLBが必要になる場合があります。
性能との関係
TLBは、
CPUがメモリにアクセスする際の性能に大きな影響を与えます。TLBミスが発生すると、ページテーブルを辿る処理が必要となり、メモリアクセスの遅延が発生します。TLBミスが頻繁に発生する場合、特にプログラムが仮想空間全体に分散してアクセスする場合、TLBスラッシングが発生し、システム全体の性能が低下します。
TLBの多層化
キャッシュと同様に、TLBも多層化されることが一般的です。一次TLBは高速ですが容量が小さく、二次TLBは容量が大きいですがやや低速です。命令用とデータ用に一次TLBを分ける場合(ITLBとDTLB)、二次TLBも分ける場合があります。
TLBミス処理
TLBミスが発生した場合、以下の2つの手法で処理されます。
- - MMUによるTLB管理: CPU自身が自動的にページテーブルを参照し、仮想アドレスに対応するエントリを探します。エントリが見つかればTLBにロードし、TLB参照を再試行します。エントリが見つからない場合はページフォールトが発生し、OSが処理を行います。この方式では、TLBエントリのフォーマットはソフトウェアからは見えず、CPU機種ごとに最適化できます。
- - ソフトウェアによるTLB管理: TLBミスが発生すると、OSがページテーブルを参照してアドレス変換を行います。見つかった情報をTLBに格納し、TLBミスを起こした命令を再実行します。この方式では、TLBエントリのフォーマットが命令セットアーキテクチャの一部として公開され、TLBを操作する命令が用意されています。
TLB特性の例
TLBの性能は、サイズ、ヒット時の時間、ミス時の時間、ミス率などの特性によって決まります。例えば、ヒット時に1クロックサイクル、ミス時に30クロックサイクルかかり、ミス率が1%の場合、平均メモリアクセス時間は約1.3クロックサイクルになります。
コンテキストスイッチ時に、仮想空間が切り替わるため、TLBエントリの一部が無効になります。最も簡単な対処法はTLB全体をフラッシュすることですが、最近の
CPUでは、TLBエントリがどのプロセスに対応するかを記録することで、無駄なフラッシュを避けています。
仮想化とx86のTLB
仮想化環境では、x86アーキテクチャでの仮想マシンの性能向上が課題でした。従来、x86のTLBはどのアドレス空間とも結びついていなかったため、
コンテキストスイッチごとにフラッシュする必要がありました。2008年以降、x86のTLBにアドレス空間を識別するタグが導入され、
コンテキストスイッチ時のフラッシュを回避できるようになりました。
TLBシュートダウン
マルチプロセッシング環境において、ある仮想アドレスを無効化する際に、すべての
CPUでそのアドレスに対応するTLBエントリを無効にする処理をTLBシュートダウンと呼びます。TLBシュートダウンは負荷が高く、システム全体の性能に影響を与えます。アーキテクチャによってはTLBシュートダウンをハードウェアでサポートすることで、処理の効率化を図っています。
まとめ
TLBは、仮想アドレスから
物理アドレスへの変換を高速化するための重要な機構です。TLBの性能は、システム全体の性能に大きな影響を与え、その効率的な管理が重要となります。