如何理解进程的Linux顶级命令结果?

时间:2014-11-23 18:13:49

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

我正在尝试在运行程序时对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}创建的内存}}。

感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:1)

您没有说是否已触及任何已分配的内存。 Linux(默认情况下)有一个稍微不寻常的内存分配策略:当你调用malloc时,呼叫总是成功。 “但如果没有记忆怎么办?”你问。好malloc没有为您提供物理内存页面,只是虚拟地址空间中的页面(基本上是无限的)。当您尝试访问任何这些页面时,您将收到页面错误,此时内核将为您找到一个内存的物理页面。

因此,我们留下以下内容:

Q1)RES没有变化,因为你没有通过分配

来使用更多的内存

Q2)由于您分配了虚拟内存,因此VIRT(分配给任务的虚拟内存)增加了。在你释放它之后它仍然存在,但由于它没有物理内存的支持,所以无关紧要。

我认为我没有足够的信息来回答Q3。