0

次のタスクについて質問があります。

MMU が 2 レベルのページ テーブルをサポートする IA-32 システムを考えてみましょう。第 2 レベルには、4 KB ページ フレームにマッピングされた 1024 ページ テーブル エントリが含まれます。各ページ テーブル エントリ (両方のレベル) のサイズは 4 バイトです。システムは 4 KB のページ サイズのみをサポートします。
バイト 0 から始めて、連続する 8 MB を仮想メモリから順次読み取ります。一度に 1 ワード (4 バイト)
を読み取ります。8 エントリのデータ TLB があります。上記で指定された 8 MB のメモリを読み取るには、何回のメモリ アクセスが必要ですか?

TLB に 8 つではなく 4 つのエントリがある場合、違いはありますか?

というわけで、順番に読んでいきます。これは、8MB/4B = 2M のメモリ アクセスを意味します。2 レベルのページ テーブルがあります。したがって、2M + 2*2M = 6M のメモリ アクセスが TLB なしで行われます。

しかし、TLBを含むメモリアクセスを計算する方法がわかりません。

誰か私にそれを説明してもらえますか? それはとても役に立ちます。

4

1 に答える 1

1

アクセス パターンはストリーミング アクセスであるため、各 TLB エントリはページ全体の 4 バイトごとに 1 回のアクセスに使用され、再使用されることはありません。これは、各 TLB エントリが 1023 回再利用されることを意味するため、ページごとに 1023 回のルックアップ (2046 回のメモリ アクセス) が回避されます。(異なる翻訳の使用の重複はなく、完全にローカライズされた再利用のみであるため、単一エントリのデータ TLB は、2048 エントリの TLB と同等のパフォーマンスを持つことになります。)

2 エントリのダイレクト マップ データ TLB で何が起こっているかについての次の説明を検討してください (仮想アドレスの最下位 12 ビット (ページ内のオフセット) は TLB では無視され、仮想アドレスの 1 ビットは無視されることに注意してください)。 TLB へのインデックス付けに使用されます):

load 0x0100_0000; // TLB entry 0 tag != 0x0800 (page # 0x0_1000) [miss]
                  // 2 memory accesses to fill TLB entry 0
load 0x0100_0004; // TLB entry 0 tag == 0x0800 [hit]
load 0x0100_0008; // TLB entry 0 tag == 0x0800 [hit]
...               // 1020 TLB hits in TLB entry 0
load 0x0100_0ffc; // TLB entry 0 tag == 0x0800 [hit]; last word in page
load 0x0100_1000; // TLB entry 1 tag != 0x0800 (page # 0x0_1001) [miss]
                  // 2 memory accesses to fill TLB entry 1
load 0x0100_1004; // TLB entry 1 tag == 0x0800 [hit]
load 0x0100_1008; // TLB entry 1 tag == 0x0800 [hit]
...               // 1020 TLB hits in TLB entry 1
load 0x0100_1ffc; // TLB entry 1 tag == 0x0800 [hit]; last word in page
load 0x0100_2000; // TLB entry 0 tag (0x0800) != 0x0801 (page # 0x0_1002) [miss]
                  // 2 memory accesses to fill TLB entry 0
load 0x0100_2004; // TLB entry 0 tag == 0x0801 [hit]
load 0x0100_2008; // TLB entry 0 tag == 0x0801 [hit]
...               // 1020 TLB hits in TLB entry 0
load 0x0100_2ffc; // TLB entry 0 tag == 0x0801 [hit]; last word in page
load 0x0100_3000; // TLB entry 1 tag (0x0800) != 0x0801 (page # 0x0_1003) [miss)
                  // 2 memory accesses to fill TLB entry 1
load 0x0100_3004; // TLB entry 1 tag  == 0x0801 [hit]
load 0x0100_3008; // TLB entry 1 tag  == 0x0801 [hit]
...               // 1020 TLB hits in TLB entry 1
load 0x0100_3ffc; // TLB entry 1 tag  == 0x0801 [hit]; last word in page
...               // repeat the above 510 times
                  // then the last 4 pages of the 8 MiB stream
load 0x017f_c000; // TLB entry 0 tag (0x0bfd) != 0x0bfe (page # 0x0_17fc) [miss]
                  // 2 memory accesses to fill TLB entry 0
load 0x017f_c004; // TLB entry 0 tag == 0x0bfe [hit]
load 0x017f_c008; // TLB entry 0 tag == 0x0bfe [hit]
...               // 1020 TLB hits in TLB entry 0
load 0x017f_cffc; // TLB entry 0 tag == 0x0bfe [hit]; last word in page
load 0x017f_d000; // TLB entry 1 tag (0x0bfd) != 0x0bfe (page # 0x0_17fd) [miss]
                  // 2 memory accesses to fill TLB entry 1
load 0x017f_d004; // TLB entry 1 tag == 0x0bfe [hit]
load 0x017f_d008; // TLB entry 1 tag == 0x0bfe [hit]
...               // 1020 TLB hits in TLB entry 1
load 0x017f_dffc; // TLB entry 1 tag == 0x0bfe [hit]; last word in page
load 0x017f_e000; // TLB entry 0 tag (0x0bfe) != 0x0bff (page # 0x0_17fe) [miss]
                  // 2 memory accesses to fill TLB entry 0
load 0x017f_e004; // TLB entry 0 tag == 0x0bff [hit]
load 0x017f_e008; // TLB entry 0 tag == 0x0bff [hit]
...               // 1020 TLB hits in TLB entry 0
load 0x017f_effc; // TLB entry 0 tag == 0x0bff [hit]; last word in page
load 0x017f_f000; // TLB entry 1 tag (0x0bfe) != 0x0bff (page # 0x0_17ff) [miss]
                  // 2 memory accesses to fill TLB entry 1
load 0x017f_f004; // TLB entry 1 tag  == 0x0bff [hit]
load 0x017f_f008; // TLB entry 1 tag  == 0x0bff [hit]
...               // 1020 TLB hits in TLB entry 1
load 0x017f_fffc; // TLB entry 1 tag  == 0x0bff [hit]; last word in page

各ページは 1024 回 (4 バイト要素ごとに 1 回) 順番に参照され、その後は二度と参照されません。

(ここで、4 つの TLB エントリとページ ディレクトリ エントリをキャッシュする 2 つのエントリ [それぞれがページ テーブル エントリのページへのポインタを持つ] を持つ設計を考えます。キャッシュされた各 PDE は 1023 ページのルックアップに再利用され、1 つのメモリに削減されます。 [8 MiB のストリーミング アクセスが内部ループとして繰り返され、4 MiB で整列された場合、2 エントリの PDE キャッシュは最初の反復後に完全にウォームアップされ、その後のすべてのページ テーブル ルックアップは 1 つのメモリしか必要としません。参照。])

于 2014-03-11T21:56:14.487 に答える