我试图在运行我的程序时对 linux top 命令中的内存字段有一个大概的了解。它是一个简单的 c 程序,在动态分配内存之前、分配内存之后和释放内存之后,我在批处理模式下使用其进程 ID 为我的程序打印最佳结果。这是我在 shell 中使用的顶级命令:
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;
}
作为
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。我期望匿名内存在分配后为 16.5kb,但 (RES - SHR)*(pagesize) = (616 - 524)*4096 = 376.832Kb 尽管匿名内存应该表示由 malloc 命令根据此 article 创建的内存.
感谢任何帮助。 谢谢
最佳答案
你不会说你是否触及了任何分配的内存。 Linux(默认情况下)有一个稍微不寻常的内存分配策略:当您调用 malloc
时,调用总是成功的。 “可是如果没有内存呢?”你问。好吧,malloc
不会让您获得物理内存页面,只是虚拟地址空间中的页面(基本上是无限的)。当您尝试访问这些页面中的任何一个时,您将遇到页面错误,此时内核将为您找到一个物理页面作为您的内存。
因此,我们有以下内容:
Q1) RES 没有改变,因为你没有通过分配使用更多的内存
Q2) VIRT(分配给任务的虚拟内存)增加了,因为你分配了虚拟内存。即使在您释放它之后它仍然存在,但由于它没有物理内存支持,所以这真的无关紧要。
我认为我没有足够的信息来回答问题 3。
关于c - 如何理解进程的 Linux top 命令结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27092493/