2010-07-09 68 views
0

我在採訪中被問到這個問題Plz告訴我答案: -如何獲取頁面大小

您沒有內核的文檔。你只知道你的內核支持分頁。 如何找到頁面大小?沒有可以告訴你頁面大小的標誌或宏。

我被給了提示,因爲你可以用時間來得到答案。我仍然沒有線索。

回答

1

運行如下代碼:

for (int stride = 1; stride < maxpossiblepagesize; stride += searchgranularity) { 
    char* somemem = (char*)malloc(veryverybigsize*stride); 
    starttime = getcurrentveryaccuratetime(); 
    for (pos = somemem; pos < somemem+veryverybigsize*stride; pos += stride) { 
     // iterate over "veryverybigsize" chunks of size "stride" 
     *pos = 'Q'; // Just write something to force the page back into physical memory 
    } 
    endtime = getcurrentveryaccuratetime(); 
    printf("stride %u, runtime %u", stride, endtime-starttime); 
} 

圖形與Y軸與X軸和運行時步幅的結果。在stride = pagesize應該有一個點,表現不再下降。

這是通過引起一系列頁面錯誤而起作用的。一旦跨越頁面大小,錯誤的數量不再增加,所以程序的性能不再顯着降低。

如果你想變得更聰明,你可以利用這個事實,即mprotect系統調用必須在整個頁面上工作。嘗試使用更小的東西,你會得到一個錯誤。我相信也有這樣的其他「漏洞」 - 但上面的代碼可以在任何支持分頁的系統上工作,而且磁盤訪問比RAM訪問要昂貴得多。那將是每一個正常的現代系統。

+0

mprotect對於Unix系統來說是個不錯的選擇,但它不是通用的。 @Borealid @Jon 我已經給出了類似的答案,正如你們在這裏解釋的基於頁面錯誤和性能基礎。 即使我試圖將讀/寫操作和時間聯繫起來,但是看起來這些人並沒有留下深刻的印象。 :( – Arpit 2010-07-09 12:36:52

0

它在我看來像是一個關於'如何實現分頁'的問題 他們希望你解釋一下改變頁面大小對系統執行的影響。

我對這個東西有點生疏,但是當頁面已滿時,系統啓動頁面交換,這會降低一切。所以你想運行一些能夠將內存填充到不同大小的東西,並測量執行任務所需的時間。在某個時刻,會有一個跳躍,這個任務所花的時間會突然跳躍。

就像我說過的,我對這樣做的實施有點生疏。但我很確定那是他們之後答案的形狀。

+1

在其最基本的分頁與交換無關。它將物理內存分成固定大小的塊,以便每個塊都可以擁有自己的屬性(例如可寫,可執行),並且可以在虛擬內存(而不是物理內存)中不連續地重新排列它們。然後,我們可以利用頁面錯誤來實現交換。 – wj32 2010-07-09 11:09:19

+0

請注意,系統在物理RAM已滿(或更早)時開始交換,而不是單個頁面時。 – Borealid 2010-07-09 11:30:42

0

無論他們期待什麼答案,幾乎肯定會是一個脆弱的解決方案。一方面,您可以擁有多個頁面大小,因此您爲一個小分配而獲得的任何答案可能與下幾兆字節的分配無關(請參閱Linux的Large Page支持)。

我懷疑這個問題更多的目的是看你是如何處理問題的,而不是你想出的最終解決方案。

順便說一句,這個問題不是關於Linux,因爲你有文檔以及POSIX合規性,你只需要調用sysconf(_SC_PAGE_SIZE)。

+0

Stsquad可能是你是對的。 – Arpit 2010-07-13 05:19:16