机器人车技术开发分享网
内存管理统计的一些知识
  • 首页 > Linux
  • 作者:小v
  • 2020年9月28日 14:29 星期一
  • 浏览:50
  • 字号:
  • 评论:0
  • Linux可以通过查看 /proc/pid/status 来查看某个进程的 内存信息。

    下面的试我么你的arm板中,monserver的 proc  status的信息打印。

    Name:   monserver
    State:  S (sleeping)
    Tgid:   517
    Pid:    517
    PPid:   179
    TracerPid:      0
    Uid:    0       0       0       0
    Gid:    0       0       0       0
    FDSize: 32
    Groups: 0
    VmPeak:    16792 kB
    VmSize:    10312 kB
    VmLck:         0 kB
    VmPin:         0 kB
    VmHWM:      7124 kB
    VmRSS:       644 kB
    VmData:     8360 kB
    VmStk:       136 kB
    VmExe:       180 kB
    VmLib:      1512 kB
    VmPTE:        12 kB
    VmSwap:        0 kB
    Threads:        1
    SigQ:   0/3120
    SigPnd: 0000000000000000
    ShdPnd: 0000000000000000
    SigBlk: 0000000000000000
    SigIgn: 0000000000000004
    SigCgt: 0000000180000000
    CapInh: 0000000000000000
    CapPrm: ffffffffffffffff
    CapEff: ffffffffffffffff
    CapBnd: ffffffffffffffff
    Cpus_allowed:   3
    Cpus_allowed_list:      0-1
    voluntary_ctxt_switches:        25
    nonvoluntary_ctxt_switches:     3


    第一列数字(RUID):实际用户ID,指的是进程执行者是谁.

    第二列数字(EUID):有效用户ID,指进程执行时对文件的访问权限.

    第三列数字(SUID):保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID.

    第四列数字(FSUID):目前进程的文件系统的用户识别码.一般情况下,文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的.

    FDSize: 32

    解释:

    FDSize是当前分配的文件描述符,这个值不是当前进程使用文件描述符的上限.

    我们看到这里是32,但实际并没有分配32个文件,

    Groups: 0

    解释:

    这里的groups表示启动这个进程的用户所在的组.

    接下里的是 内存占用的关键分析。

    VmPeak:     kB

    解释:这里的VmPeak代表当前进程运行过程中占用内存的峰值.

    我们用下面的程序申请内存,然后释放内存,最后通pause()函数中止程序的运行,程序源码如下:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    int main (int argc, char *argv[])
    {
        if (argc != 2)
            exit (0);
        size_t mb = strtoul(argv[1],NULL,0);
        size_t nbytes = mb * 0x100000;
        char *ptr = (char *) malloc(nbytes);
        if (ptr == NULL){
            perror("malloc");
            exit (EXIT_FAILURE);
        }
        printf("allocated %d mb\n", mb);
        free(ptr);
        pause();
        return 0;
    }

    gcc callmem.c -o callmem

    ./callmem 10

    allocated 10 mb

     

    终端2

    我们打开status文件,查看VmPeak值,如下:

    cat /proc/`pgrep callmem|grep -v grep`/status

    Name:   callmem

    State:  S (sleeping)

    Tgid:   2930

    Pid:    2930

    PPid:   2831

    TracerPid:      0

    Uid:    1002    1002    1002    1002

    Gid:    1002    1002    1002    1002

    FDSize: 256

    Groups: 1000 1002 

    VmPeak:    11852 kB

    VmSize:     1608 kB

    VmLck:         0 kB

    VmHWM:       396 kB

    VmRSS:       396 kB

    VmData:       28 kB

    VmStk:        84 kB

    VmExe:         4 kB

    VmLib:      1468 kB

    VmPTE:        12 kB

    下面略

    注:我们看到程序申请了10240kb(10MB)的内存,VmPeak的值为11852kb,为什么不是10MB呢,因为除了我们申请的内存外,程序还会为加载动态链接库而占用内存.

    VmSize:    kB

    解释:VmSize代表进程现在正在占用的内存

    这个值与pmap pid的值基本一致,如果略有不同,可能是内存裂缝所造成的.

     

    VmLck:         0 kB

    解释:VmLck代表进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘.

    注意:分配的最少单位是4KB,以后每次递增都是4KB的整数倍.

    VmHWM:      1432 kB

    VmRSS:      1420 kB

    解释:

    VmHWM是程序得到分配到物理内存的峰值.

    VmRSS是程序现在使用的物理内存.

    VmData:表示进程数据段的大小.

    VmStk:表示进程堆栈段的大小.

    VmExe:表示进程代码的大小.

    VmLib:表示进程所使用LIB库的大小.

    关于代码段,堆栈段,数据段:

    代码段可以为机器中运行同一程序的数个进程共享

    堆栈段存放的是子程序(函数)的返回地址、子程序的参数及程序的局部变量

    数据段则存放程序的全局变量、常数以及动态数据分配的数据空间(比如用malloc函数申请的内存)

    与代码段不同,如果系统中同时运行多个相同的程序,它们不能使用同一堆栈段和数据段.

    注意:

    堆栈段代表的是程序中的堆区(stack),堆区一般是编译器自动分配释放的.

    我们用malloc申请的内存,它占用的其实是栈区(heap),栈区一般是程序员自已分配释放的,而栈区在这里属于数据段,所以我们看到上面测试程序通过调用malloc函数后,VmData一值有了很大的变化.

    VmPTE:        56 kB

    解释:占用的页表的大小.

    VmSwap: 0 kB

    解释:进程占用Swap的大小.

    Threads:        

    解释:表示当前进程组有3个线程.

    SigQ:   1/7954

    解释:表示当前待处理信号的个数,我们用下面和程序进行测试,如下:

    Linux在内存使用上的原则是:如果内存充足,不用白不用,尽量使用内存来缓存一些文件,从而加快进程的运行速度,而当内存不足时,会通过相应的内存回收策略收回cache内存,供进程使用。本文通过对proc下进程相关的文件进行分析,精确评估系统消耗内存的大小,还可以对内存泄露类问题的解决提供一种定位手段。

    可以从proc目录下的meminfo文件了解到当前系统内存的使用情况汇总,其中可用的物理内存=memfree+buffers+cached,当memfree不够时,内核会通过回写机制(pdflush线程)把cached和buffered内存回写到后备存储器,从而释放相关内存供进程使用,或者通过手动方式显式释放cache内存:

    https://blog.csdn.net/ibless/article/details/85123386

      您阅读这篇文章共花了:  
     本文无需标签!
    二维码加载中...
    本文作者:小v      文章标题: 内存管理统计的一些知识
    本文地址:http://blog.cvosrobot.com/?post=541
    版权声明:若无注明,本文皆为“机器人车技术开发分享网”原创,转载请保留文章出处。

    返回顶部| 首页| 手气不错| 捐赠支持| 自定义链接| 自定义链接| 自定义链接| 手机版本|后花园

    Copyright © 2014-2017 机器人车技术开发分享网   京ICP备14059411 Copyright 2014-2019 小v工作室 版权所有 All Rights Reserved

    sitemap