zoukankan      html  css  js  c++  java
  • top显示的内存各项参数解析

    top观察进程数据时,会有如下几个内存参数(可以用f选择显示哪些参数):

    VIRT, RES, SHR, SWAP, CODE, DATA

    top实际上是从/proc/<pid>/statm文件中读取这些信息,/proc/<pid>/smaps文件是进程虚拟内存映射的详细数据,我们知道内核的struct page结构有引用计数,如果>1,表示是shared page,否则是private page

    VIRT对应于内核的mm->total_vm,包括了进程代码段,数据段所有申请过的虚拟内存,后面会详细阐述

    SHR对应于内核的mm->file_rss,代表进程可能是与其他进程共享的内存(不一定是真的共享了,比如打开动态库占用的虚存,未必这个动态库就被其他人也用到)。网上查阅了资料,记入mm->file_rss的内存包括,

    程序和动态库代码段的内存,从pmap的结果看,和程序文件大小没啥关系,估计是因为指令不是一次全部加载到代码段里的缘故

    通过mmap做的文件映射

    通过mmap做的匿名映射,但指明了MAP_SHARED属性

    通过shmget申请的共享内存

    RES对应于mm->file_rss + mm->anon_rss,我们知道虚拟内存一共有两类,文件页和匿名页,mm->anon_rss就是进程匿名页的大小,匿名页可以是进程独占的,也可以是共享的,比如fork之后COW的那些页就是父子进程共享的,但这些都不会记入SHR,因此可以看出,SHR的大小和共不共享没有半毛钱关系

    SWAP表示进程被交换到swap分区的虚拟内存,VIRT = SWAP + RES

    CODE表示进程代码段占用的虚拟内存

    DATA表示进程数据段占用的虚拟内存

    内核通过一个task_statm函数来返回进程内存的使用状况,

    int task_statm(struct mm_struct *mm, int *shared, int *text,
                   int *data, int *resident)
    {
            *shared = get_mm_counter(mm, file_rss);
            *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
                                                               >> PAGE_SHIFT;
            *data = mm->total_vm - mm->shared_vm;
            *resident = *shared + get_mm_counter(mm, anon_rss);
            return mm->total_vm;
    }

    shared是mm->file_rss的内存,这个值是mmap创建但还没有swap出去的虚拟内存页个数

    text是进程代码段的虚拟内存页个数,代码段的页是不会被swap出去的

    resident包括了shared和mm->anon_rss的虚拟内存页个数,这里的mm->anon_rss是那些未被swap的匿名页。注意进程有可能通过malloc分配的一段内存,但是还没有使用,因此这段虚拟内存还不会map到匿名页上,这段内存的值会被计算到mm->total_vm,但是不会在mm->anon_rss中

    data就是进程数据段的虚拟内存页个数,包括swap出去的

    关于匿名页,之前的理解有误,确切的说,虚拟内存实际分为匿名页和文件页,文件页包括mmap打开的文件,文件的page cache等,这些页不会被换页算法交换到swap上,因为如果不是脏页,那么可以直接释放,如果是脏页,则直接回写文件;匿名页包括栈堆上面分配的页,以及mmap匿名打开的文件产生的页,这些页是会交换到swap分区的

    swap会判断页是否是dirty,只有dirty页才会被回写到磁盘,clean页直接就释放掉了

  • 相关阅读:
    年报统计系统—基本信息模块的目标文档
    用户分析
    第一周第三天
    第一周第二天
    第一周第一天
    学习进度条第三周
    学习进度表第二周
    四则运算2
    构建之法阅读笔记 01
    软件工程概论学习进度表第一周
  • 原文地址:https://www.cnblogs.com/cp-miao/p/6282580.html
Copyright © 2011-2022 走看看