Я пытаюсь получить общее представление о полях памяти в команде 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.
Любая помощь приветствуется. Спасибо
благодарит за ваш ответ. Я отредактировал свой ответ, чтобы включить «верхние» результаты после обновления всех элементов массива до постоянного значения. Тем не менее, я не вижу никаких изменений в полях памяти. Я хочу знать, какие поля будут затронуты при распределении, обновлении и освобождении динамической памяти? – shaffooo