gpt4 book ai didi

c - 如何理解进程的 Linux top 命令结果?

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:50 25 4
gpt4 key购买 nike

我试图在运行我的程序时对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com