2016-11-29 22 views
0

我創建了使用malloc()分配50Mb內存的小波包程序,然後使用一個循環來「觸摸」每一頁以使其處於居住狀態。過程中的駐留內存不斷增加但沒有主要頁面錯誤

int main() 
{ 
    // Map 50M to RAM 
    unsigned char *p = malloc(52428800); 
    sleep(5); 

    // Touch every page 
    for (int i = 0; i< 52428800; i+=4096) 
    p[i] = 1;  
    sleep(100000); 
} 

事實上,程序似乎工作,這意味着前5秒的睡眠後,在「靠前指揮」開始輸出的駐留內存填滿並最終分配所有虛擬內存RAM。

PID %MEM VIRT RES CODE DATA SHR            
32486 0.6 55396 52360  4 51528 1104 

我注意到程序的頁面錯誤而只有較小的差異:

ps -ef -o min_flt,maj_flt 32486 

MINFL MAJFL 
12879  0 

不應該有大的頁面錯誤?據我瞭解,當我使用malloc()時,創建了一個50Mb的虛擬地址空間。在每個虛擬頁面上寫入之前,實際的居所大小非常小,但是之後等於所請求的虛擬內存。

當我「觸摸」頁面(爲了讓它們居住),那麼每個頁面從磁盤移動到DRAM,對吧?爲什麼沒有主頁錯誤呢?

此外,當你malloc()爲50米,你注意到在住宅的大小,只有幾個字節,其餘的頁面在哪裏?他們在磁盤上?

回答

0

操作系統可能會創建零需求頁面以支持您的malloc調用。你在這裏完成了強制從磁盤讀取數據的操作。

您可能想要在修改頁面後嘗試第二個循環,以查看是否會導致頁面錯誤。

相關問題