2013-07-25 2 views
0

Im работает над распределением памяти по времени, используя Calloc() с некоторым временем, программа должна попытаться выделить 50 мегабайт и повторить еще 50 мегабайт каждый раз, пока не будет выделено 1500 мегабайт бара. Цель 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

Это вполне ожидаемое поведение:

  • Вы запрашиваете один мебибайт из ядра системы один раз (внутри calloc()), это занимает много времени (оно не должно до 220 мс, хотя).

  • Вы освобождаете эту память, сообщая libc (а не ядру), что вам больше не нужно. Libc не вернет память в систему в большинстве случаев, поэтому она по-прежнему является частью вашего виртуального адресного пространства.

  • Вы снова сообщите libc, что вам нужен один мебибайт ОЗУ, а libc говорит: «О, здорово, у меня все еще есть один большой подходящий блок. Возьми это! Он также удалит его содержимое, потому что вы используете calloc(), но это не займет много времени в миллисекундах.

Также обратите внимание, что ваш код разницы во времени округляется до любой временной разницы ниже одной миллисекунды. Возможно, вы захотите изменить его для печати прошедших микросекунд.

Смежные вопросы