2014-11-23 2 views
0

Я пытаюсь получить общее представление о полях памяти в команде linux top во время запуска моей программы. Его простая программа c, где я печатаю лучшие результаты для своей программы, используя ее идентификатор процесса в пакетном режиме перед динамическим распределением памяти, после выделения памяти и освобождения памяти. Вот топ команды я использую в скорлупе:Как понять результат командной строки Linux для процесса?

top -p my_pid -b -n 1 

Я использую следующие функции для создания 2D-массива динамически

int** Create2DArray(unsigned int size, int** addr_of_ptr_to_ints_array){ 

    int** int_ptrs_array = (int**)malloc(size * sizeof(int*)); 
    *addr_of_ptr_to_ints_array = (int*)malloc(size * size * sizeof(int)); 
    for (int i = 0; i < size; i++) { 
     int_ptrs_array[i] = *addr_of_ptr_to_ints_array + (i * size); 
    } 

    return int_ptrs_array; 
} 

как

int* int_array1; 
int** int_ptr_array1 = Create2DArray(n, &int_array1); 

где п = 64 так массива size (4096 * size (int) = 16kb) + 64 * size (int *) = 16.25kb и используя следующий код для освобождения памяти.

free(int_array1);free(int_ptr_array1); 

Выход я получаю от верхней команды до, после выделения и после освобождения памяти имеет следующий вид:

EDIT: 
Pagesize: 4096 

--- Before Array Allocation. 
top - 17:45:01 up 17:39, 3 users, load average: 0.36, 0.26, 0.34 
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie 
%Cpu(s): 15.4 us, 2.5 sy, 0.0 ni, 81.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st 
KiB Mem: 2065072 total, 1675324 used, 389748 free, 48344 buffers 
KiB Swap: 1046524 total, 25168 used, 1021356 free, 485028 cached 

    PID VIRT RES SHR %CPU %MEM SWAP CODE DATA COMMAND 
14606 10756 616 524 0.0 0.0 0 8 8508 mx 

--- Array Allocated. 
top - 17:45:03 up 17:39, 3 users, load average: 0.36, 0.26, 0.34 
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie 
%Cpu(s): 15.4 us, 2.5 sy, 0.0 ni, 81.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st 
KiB Mem: 2065072 total, 1675364 used, 389708 free, 48344 buffers 
KiB Swap: 1046524 total, 25168 used, 1021356 free, 485028 cached 

    PID VIRT RES SHR %CPU %MEM SWAP CODE DATA COMMAND 
14606 11780 616 524 0.0 0.0 0 8 9532 mx 

--- Array Updated. 
top - 17:45:06 up 17:39, 3 users, load average: 0.49, 0.29, 0.35 
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie 
%Cpu(s): 15.4 us, 2.5 sy, 0.0 ni, 81.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st 
KiB Mem: 2065072 total, 1675348 used, 389724 free, 48344 buffers 
KiB Swap: 1046524 total, 25168 used, 1021356 free, 485028 cached 

    PID VIRT RES SHR %CPU %MEM SWAP CODE DATA COMMAND 
14606 11784 616 524 0.0 0.0 0 8 9536 mx 

Вопросы:

Q1. Почему RES является константой до и после распределения массива?

Q2. Почему VIRT увеличился после того, как массив был освобожден?

Q3. Я ожидал, что анонимная память будет равна 16.5kb после allcation, но (RES-SHR) * (pagesize) = (616 - 524) * 4096 = 376.832Kb, хотя анонимная память должна представлять память, созданную командами malloc, в соответствии с этим article.

Любая помощь приветствуется. Спасибо

ответ

1

Вы не говорите, если вы коснулись какой-либо выделенной памяти или нет. Linux (по умолчанию) имеет немного необычную стратегию распределения памяти: при вызове malloc вызов всегда преуспевает. «Но что, если нет памяти?» ты спрашиваешь. Ну malloc не дает вам страницу физической памяти, просто страницу в вашем виртуальном адресном пространстве (что в основном безгранично). При попытке доступа к любой из этих страниц вы получите ошибку страницы, и в этот момент ядро ​​найдет физическую страницу для вашей памяти.

Так что оставляет нам следующее:

Q1) RES остается неизменным, потому что вы никогда не использовать больше памяти, выделяя

Q2) ВИРТ (виртуальная память, выделенная для задания) увеличилось, потому что вы выделили виртуальную память. Это остается даже после того, как вы освободите его, но поскольку он не поддерживается физической памятью, это действительно не имеет значения.

Я не думаю, что у меня достаточно информации, чтобы ответить на вопрос Q3.

+0

благодарит за ваш ответ. Я отредактировал свой ответ, чтобы включить «верхние» результаты после обновления всех элементов массива до постоянного значения. Тем не менее, я не вижу никаких изменений в полях памяти. Я хочу знать, какие поля будут затронуты при распределении, обновлении и освобождении динамической памяти? – shaffooo

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