2013-09-26 51 views
4

我正在分析跨越虛擬頁面的分配效果,同時創建維度爲PageSize x PageSize的2維數組。我的機器的頁面大小是4096.我有一個4096個整數指針(列)的數組,指向4096個整數(行)。如何從C中的新虛擬頁面分配內存?

我想在新的虛擬頁面開始分配第一個整型指針。如何識別當前內存位置是否爲新頁面? 有一次,我發現,我相信我可以寫一些垃圾值並將指針移動到新的虛擬頁面。 這是我如何分配數組。

array = malloc(ncolumns * sizeof(int *)); 
    for(j = 0; j < ncolumns; j++) 
    { 
     array[j] = malloc(nrows * sizeof(int)); 
     if(array[j] == NULL) 
     { reportError(8);} 
    } 
+0

你說你「分析效果」。你想實現什麼目標? –

+0

@KirillKobelev,我試圖說明,當我有這樣一個數組時,按列訪問數組變量將比訪問每行數組變量要慢。每列訪問完成後,需要觸摸多個頁面,但每行只需要一個頁面。 – user1736947

+0

我也意識到,這種分析需要數組是一個連續的內存塊,所以我沒有將它作爲一個指向整數指針的指針來代替,而是將它作爲一個連續的內存集合使用#define ARR(i,j) (array [COLUMNS * i + j]) – user1736947

回答

4

如果你知道你的頁面大小,您可以分配的內存足夠大的部分,這將保證新分配的內存的某些部分是頁邊界上對齊。您將需要分配至少8192個字節的內存,以確保您將在4096字節邊界上對齊4096個字節。

例如,如果你調用malloc並返回給你一個偏移對準0xDEAD1001(4097),則需要進入下一個頁面,在內存地址0xDEAD2000得到一個4096字節對齊。然後,你至少需要4096字節的連續空間。因此,需要分配8192字節。

要獲得一個4k字節對齊的內存位置,可以將4095添加到由malloc返回的地址並屏蔽最後3個字節。

void *mem = malloc(8192); 
void *ptr = ((void *)mem+0x0FFF) & ~ (void *)0x0FFF; 

編輯:確保指針保持到分配的原裝內存,以便以後可以回過頭來用它來打電話free()

假設這次,malloc返回0xDEAD000F

0xDEAD000F + 0x0000FFF = 0xDEAD100E 
0xDEAD100E & ~0x0000FFF = 0xDEAD1000 

如果你不想做的這一切混亂的指針運算,我覺得你可以只使用posix_memalign。檢查出來here。如果你在不同的平臺上,我確定有類似的內存對齊服務可用。

+0

另一方面,我希望每個內存分配器都會自動執行此操作以分配幾頁內容。我知道MSVC的確如此。 –

2

僅使用C語言的功能,您無法在頁面邊界上調整您的分配(即從malloc返回的內容)。你的示例代碼只是分配指向數組的指針數組。他們的位置可以在虛擬地址空間的任何地方。確切位置取決於編譯器/庫/操作系統等。

操作系統通常具有允許執行此類操作的功能。在Windows上,您可以使用VirtualAlloc函數。