2013-07-09 2 views
0

Мы столкнулись с какой-то странной проблемой с некоторыми нашими встроенными приложениями и подумали, что это что-то глубоко в коде, но затем мы написали быстрый образец для тестирования, мы столкнулись с той же проблемой.Память не указана до тех пор, пока файлы не будут удалены?

Вот код для образца:

#include <stdio.h> 

int main(void) 
{ 
    int i; 
    int j; 
    int COUNT = 750000; 

    double x[100]; 
    double y[100]; 

    FILE *OutputFile1; 
    FILE *OutputFile2; 
    FILE *OutputFile3; 
    FILE *OutputFile4; 
    FILE *OutputFile5; 
    FILE *OutputFile6; 
    FILE *OutputFile7; 
    FILE *OutputFile8; 
    FILE *OutputFile9; 

    OutputFile1 = fopen("Output_file_1.dat","w"); 
    OutputFile2 = fopen("Output_file_2.dat","w"); 
    OutputFile3 = fopen("Output_file_3.dat","w"); 
    OutputFile4 = fopen("Output_file_4.dat","w"); 
    OutputFile5 = fopen("Output_file_5.dat","w"); 
    OutputFile6 = fopen("Output_file_6.dat","w"); 
    OutputFile7 = fopen("Output_file_7.dat","w"); 
    OutputFile8 = fopen("Output_file_8.dat","w"); 
    OutputFile9 = fopen("Output_file_9.dat","w"); 

/* Do stuff in here */ 
    /* Initialize the arrays */ 
    for(i = 0; i < 100; i++) 
    { 
     x[i] = 2.50 * (double)i; 
     y[i] = 10.0 * (double)i; 
    } 
    printf("Initialized the x and y arrays\n"); 
    /* Write junk to files */ 
    for(i = 0; i < COUNT; i++) 
    { 
     printf("Outer loop %d\n", i); 
     for(j = 0; j < 100; j++) 
     { 
     fprintf(OutputFile1," %e", x[j]); 
     fprintf(OutputFile2," %e", x[j]); 
     fprintf(OutputFile3," %e", x[j]); 
     fprintf(OutputFile4," %e", x[j]); 
     fprintf(OutputFile5," %e", x[j]); 
     fprintf(OutputFile6," %e", y[j]); 
     fprintf(OutputFile7," %e", y[j]); 
     fprintf(OutputFile8," %e", y[j]); 
     fprintf(OutputFile9," %e", y[j]); 
     } 
     fprintf(OutputFile1,"\n"); 
     fprintf(OutputFile2,"\n"); 
     fprintf(OutputFile3,"\n"); 
     fprintf(OutputFile4,"\n"); 
     fprintf(OutputFile5,"\n"); 
     fprintf(OutputFile6,"\n"); 
     fprintf(OutputFile7,"\n"); 
     fprintf(OutputFile8,"\n"); 
     fprintf(OutputFile9,"\n"); 
    } 

/* End doing stuff here */ 
    fflush(OutputFile1); 
    fclose(OutputFile1); 
    fflush(OutputFile2); 
    fclose(OutputFile2); 
    fflush(OutputFile3); 
    fclose(OutputFile3); 
    fflush(OutputFile4); 
    fclose(OutputFile4); 
    fflush(OutputFile5); 
    fclose(OutputFile5); 
    fflush(OutputFile6); 
    fclose(OutputFile6); 
    fflush(OutputFile7); 
    fclose(OutputFile7); 
    fflush(OutputFile8); 
    fclose(OutputFile8); 
    fflush(OutputFile9); 
    fclose(OutputFile9); 

    return(0); 
} 

Итак, вот что происходит, когда вы запускаете это. Если вы запустите это в одном окне терминала и запустите верх над другим во время его работы, вы заметите, что ваша память будет съедена. Для его запуска требуется около 8 минут, и когда он будет завершен, система не вернет память, пока файлы не будут удалены. После удаления файлов вся память возвращается в систему.

Это просто C с последним компилятором gcc, CentOs 6.3.

Мы что-то упускаем?

Спасибо!

ответ

0

"Система не дает память обратно". Откуда вы знаете? Существует различие между «памятью, зарегистрированной как top», и «памятью, которую вы можете использовать». Это связано с тем, что дисковый ввод-вывод хранится в кеше, когда это возможно - таким образом, если вам нужно снова использовать тот же файл, информация уже доступна в памяти - быстрее для доступа. Как только вы удаляете файл, его больше не нужно хранить в кеше, поэтому кеш очищается.

Другой способ взглянуть на это - использовать команду free. Делать это на моей коробке Linux, я вижу следующее:

   total  used  free shared buffers cached 
Mem:  66005544 65559292  446252   0  199832 60332160 
-/+ buffers/cache: 5027300 60978244 
Swap:  1044216  1884 1042332 

Ключ линии является тот, который говорит «-/+ buffers/cache». Вы можете видеть, что первая строка говорит мне «446M бесплатно» - не много на машине 64G. Но вторая строка говорит «только шутит, у вас есть 60 G бесплатно». Это real «Свободная память».

Посмотрите, может ли эта строка «вернуть память» без необходимости удаления файлов. Я думаю, вы найдете его.

+0

имеет прекрасный смысл, спасибо! – speedpacer

0

Система кэширует эти файлы для быстрого доступа в следующий раз. Поскольку память не используется приложением, она используется для кэширования. Кэш освобождается, если файлы ушли, или для другого приложения требуется больше памяти для запуска.

См: Linux Memory Management

+0

Благодарю вас за внимание! – speedpacer

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