我正在尝试在运行程序时对linux top命令中的内存字段进行一般性了解。它是一个简单的c程序,在分配内存和释放内存之后,在动态分配内存之前,我在批处理模式下使用其进程ID打印我的程序的最高结果。这是我在shell中使用的top命令:
top -p my_pid -b -n 1
我正在使用以下函数动态创建一个二维数组
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;
}
as
int* int_array1;
int** int_ptr_array1 = Create2DArray(n, &int_array1);
其中n = 64,因此数组大小为(4096 * size(int)= 16kb)+ 64 * size(int *)= 16.25kb,并使用以下代码释放内存。
free(int_array1);free(int_ptr_array1);
我从top命令获得的输出,分配之后和释放内存后的输出如下:
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。我希望匿名内存在allcation后为16.5kb但是(RES - SHR)*(pagesize)=(616 - 524)* 4096 = 376.832Kb,尽管匿名内存应该代表malloc命令根据此{{3}创建的内存}}。
感谢任何帮助。 感谢
答案 0 :(得分:1)
您没有说是否已触及任何已分配的内存。 Linux(默认情况下)有一个稍微不寻常的内存分配策略:当你调用malloc
时,呼叫总是成功。 “但如果没有记忆怎么办?”你问。好malloc
没有为您提供物理内存页面,只是虚拟地址空间中的页面(基本上是无限的)。当您尝试访问任何这些页面时,您将收到页面错误,此时内核将为您找到一个内存的物理页面。
因此,我们留下以下内容:
Q1)RES没有变化,因为你没有通过分配
来使用更多的内存Q2)由于您分配了虚拟内存,因此VIRT(分配给任务的虚拟内存)增加了。在你释放它之后它仍然存在,但由于它没有物理内存的支持,所以无关紧要。
我认为我没有足够的信息来回答Q3。