2013-07-25 28 views
0

我正在使用Calloc()計算內存分配的時間, 該程序應該嘗試並分配50megs並每次迭代50個更多megs,直到它分配1500兆內存ram。 createbigthing()的目標就是創建一個大的東西並釋放它。數據分配

.... 
#define oneMeg 1024L*1024L 
#define INCREMENT 50 

int difftod(struct timeval * tv0, struct timeval * tv1){ 
return (tv1->tv_sec - tv0->tv_sec)*1000 + (tv1->tv_usec- tv0->tv_usec)/1000; 
} 


int createbigthing(long int size){ 

int *test = (int*) calloc(size, (size_t) oneMeg); 
if(test == NULL){ 
    return -1; 
} 

free(test); 
return 0; 
} 


int main(){ 
long int i; 
int rtn; 
struct timeval tv0, tv1; 
struct timezone tzp; 
for(i=INCREMENT;i<=1500;i=i+INCREMENT){ 
     rtn = gettimeofday(&tv0, &tzp); /* set timer T0 */ 
     createbigthing(i); 
    rtn = gettimeofday(&tv1, &tzp); /* read time T1 */ 
    printf("%d msec\n",difftod(&tv0,&tv1)); 
} 
return 0; 
} 

唯一的輸出我得到的是第一次迭代是給我大約220毫秒的延遲,然後什麼都沒有,該函數仍返回0,所以內存不應該是滿的。

輸出例如:

220 msec 
0 msec 
0 msec 
0 msec 
0 msec 
... 
+2

嘗試在每個頁面寫入至少一個字節。新的頁面默認爲零,COW,所以如果運氣好的話,你當前的程序根本就什麼也不做。 –

回答

0

這完全是預期的行爲:

  • 您從系統內核中一個請求Mebibyte一次(內calloc()),這需要一定的時間(它不應該儘管)是220毫秒。

  • 你釋放這個內存,告訴libc(而不是內核)你不再需要它了。在大多數情況下,libc不會將內存返回到系統,所以它仍然是虛擬地址空間的一部分。

  • 你再次告訴libc,你需要一個Mebibyte的RAM,libc說:哦,太好了,我還有一個合適的塊。拿去!它也將刪除其內容,因爲您使用calloc(),但在毫秒範圍內不需要時間。

另請注意,您的時間差異代碼將小於1毫秒的任何時間差。您可能想要將其更改爲打印經過的微秒。