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

标签 c linux memory-leaks process dynamic-memory-allocation

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

相关文章:

c - 为什么函数会根据容量返回不同的值

linux - Sed 命令。在每行末尾添加文本,并从每行下面复制文本。之后删除添加的行

ios - 内存泄漏 - NSString 和 NSURL

c - 有没有办法验证我的程序没有内存泄漏?

c - 内存分配头是否需要对齐 union ?

c - 如何自动检查 C 函数库是否符合可重入性?

c - C 中基于正则表达式的 strstr 函数

php - "php_connect_nonb() failed: Operation now in progress (115)"间歇性发生

c++ - 将一个程序的输出通过管道传输到另一个程序不适用于该特定程序

c - Valgrind 内存泄漏这是什么错误?