2012-10-02 122 views
2

我敲我的頭要解決這個問題,甚至無法進行一步到位,問題是這樣的:虛擬內存系統,頁表和TLB

考慮下面的C程序:

int X[N]; 
int i; 
int step = M; // M is some predefined constant 
for (i = 0; i < N; i += step) X[i] = X[i] + 1; 

如果此程序在具有4 KB頁面大小和64條目TLB的計算機上運行,​​則M和N的哪些值會導致每次執行內部循環時都會丟失TLB?

任何人都可以請給我一些提示如何解決它?

回答

7

這很簡單。首先,您必須瞭解TLB究竟做了什麼? 暗示是它將幫助將virtual address轉換爲physical address。所以你知道頁面大小是4千字節。所以如果有一個數組讓我們說無限長。您正在for循環中從0到無窮大訪問它。數組X [0]的第一次訪問將導致TLB未命中並加載第一個TLB。那麼對於接下來的4095次訪問,它不會被錯過,因爲它存在於TLB中(請記住,這是因爲頁面大小爲4096 = 4KB)。那麼下一個地址是X [4096],這將導致TLB未命中。因此,你會發現每增加4096個地址,你就會有一個TLB缺失。所以我們確信M = 4096/sizeof(int)

現在你也知道你有64條TLB緩存。因此,在加載了64條TLB之後,您將擁有完整的TLB。要加載第65個條目,您必須刪除第一個條目。 (注意可以有不同的替換機制,我們假設它是一個簡單的機制)。因此,在第65個條目加載後,訪問X [0]時的第一個條目已被刪除。因此,如果您嘗試訪問現在的X [0],將會有一個TLB未命中,替換X [4096]所需的條目等等。所以你需要大小爲64 * 4096 = 256 KBytes,以充分利用TLB緩存。但是,您希望每個步驟都有一個TLB緩存未命中。因此,對於64條目的TLB緩存,您需要的數組大小將相當於65個條目。因此N = 65 * 4096/sizeof(int)

希望這給出一些提示!

+0

TLB大小是64頁的條目我猜 –

+0

是的,你是對的。但我正在談論使用65個條目來使TLB緩存未命中。我更新了該說明。 – Raj

+0

看到你的這一行'它不會被錯過,因爲它存在於TLB中(記住這是因爲TLB大小爲4096 = 4KB)' –

2

當頁面的虛擬地址不在TLB中時,發生TLB未命中。

給定一個TLB爲64的條目,如果您完全預填充虛擬地址0 * 4096,1 * 4096,2 * 4096,...,63 * 4096(您可以通過訪問相關內存中的內存來填充它頁),然後請求從64 * 4096到64 * 4096 + 4095的虛擬地址訪問,該訪問將導致TLB未命中(因爲64 * 4096尚未在TLB中)。然後,如果現在存儲了地址64 * 4096的條目(在TLB未命中之後,驅逐64個條目中的一個並用虛擬地址64 * 4096替換它並且與其物理對應地址)先前具有虛擬地址0 * 4096,則在從0到4095的虛擬地址處訪問存儲器將導致另一個TLB未命中(因爲虛擬地址0 * 4096的條目已從TLB中逐出並被VA 64的條目取代* 4096)。

基於TLB的這種行爲,你應該拿出MN滿足要求。