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页直接就释放掉了

top显示的内存各项参数解析的更多相关文章

  1. linux top命令查看内存及多核CPU的使用讲述【转】

    转载一下top使用后详细的参数,之前做的笔记找不见了,转载一下,作为以后的使用参考: 原文地址:http://blog.csdn.net/linghao00/article/details/80592 ...

  2. Hi3359AV100 NNIE开发(1)-RFCN demo LoadModel函数与参数解析

    之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3359AV100 NNIE开发(1)-RFCN demo LoadModel函数与参数解析,通过对LoadModel函数的解析,能够很好理解. ...

  3. Zookeeper + Hadoop2.6 集群HA + spark1.6完整搭建与所有参数解析

    废话就不多说了,直接开始啦~ 安装环境变量: 使用linx下的解压软件,解压找到里面的install 或者 ls 运行这个进行安装 yum install gcc yum install gcc-c+ ...

  4. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  5. Linux TOP命令按内存占用排序和按CPU占用排序

    先输入top 然后 按P – 以 CPU 占用率大小的顺序排列进程列表 按M – 以内存占用率大小的顺序排列进程列表 top命令是Linux下常用的性能分析工具,比如cpu.内存的使用,能够实时显示系 ...

  6. argparse - 命令行选项与参数解析(转)

    argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...

  7. Ubuntu 使用top/free查看内存占用大的原因

    Ubuntu 使用top/free查看内存占用大的原因     linux/ubuntu下free/top查看内存占用大的原因 使用free/top查看内存占用的时候,吓了一大跳,机器4GB的内存,显 ...

  8. /proc/sys/ 下内核参数解析

    http://blog.itpub.net/15480802/viewspace-753819/ http://blog.itpub.net/15480802/viewspace-753757/ ht ...

  9. document.execCommand()函数可用参数解析

    隐藏在暗处的方法-execCommand() 关键字: javascript document document.execCommand()方法可用来执行很多我们无法实现的操作. execComman ...

随机推荐

  1. linux下的静态库和共享库

    转载&&增加:      我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...

  2. Thread 线程池

    Thread 线程池: 当使用多个较短存活期的线程有利时,运用线程池技术可以发挥作用.运用这一技术时,不是为每个任务创建一个全新的线程,而可以从线程池中抽出线程,并分配给任务.当线程完成任务后,再把它 ...

  3. uoj185 [ZJOI2016]小星星 【dp + 容斥】

    题目链接 uoj185 题解 设\(f[i][j]\)表示\(i\)为根的子树,\(i\)号点对应图上\(j\)号点时的方案数 显然这样\(dp\)会使一些节点使用同一个节点,此时总的节点数就不满\( ...

  4. 《R语言实战》读书笔记--第三章 图形初阶(一)

    3.1使用图形 可以使用pdf等函数将图形直接保存在文件中.在运用attach和detach函数的使用中经常出现错误,比如命名重复的问题,所以,应该尽量避免使用这两个函数. plot是一般的画图函数, ...

  5. 结构型设计模式之代理模式(Proxy)

    结构 意图 为其他对象提供一种代理以控制对这个对象的访问. 适用性 在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用P r o x y 模式.下面是一 些可以使用P r o x y 模式常见 ...

  6. sunos 修改shell为bash

    root:x:::Super-User:/:/sbin/sh 改为 root:x:::Super-User:/:/usr/bin/bash 修改/增加 .profile 文件,在¥HOME路径下 ex ...

  7. 【原创】Linux环境下的图形系统和AMD R600显卡编程(8)——AMD显卡DRM驱动初始化过程

    前面几个blog对DRM驱动.显卡的显存管理机制.中断机制都进行了一些描述,现在阅读AMD drm驱动的初始化过程应该会轻松许多. 下面是一AMD的开发人员编写的文章(先暂时放在这里,后续有时间再添加 ...

  8. 两步完美解决 androud 模拟器太慢的问题

    androud 开发环境默认的 avd 管理器下载并启动的模拟器,运行速度非常慢,有时不可忍受,用下面两步可以解决这个问题: 下载 genymotion-2.3.1 (注意,最好是这个版本,试过2.4 ...

  9. 2017网易---Fibonacci数列

    题目描述 Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, ...

  10. 自定义topo文件解析

    from mininet.topo import Topo from mininet.net import Mininet from mininet.util import dumpNodeConne ...