0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

top命令中VIRT、RES和SHR的含义

我快闭嘴 来源:OSC开源社区 作者:OSC开源社区 2022-09-16 11:25 次阅读

理解virt、res、shr之间的关系(linux系统篇)

前言

想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?

通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表什么意思呢?

这是本文需要跟大家一起探讨的问题。当然如果更加深入一点,你可能会问进程所占用的那些物理内存都用在了哪些地方?这时候top命令可能不能给到你你所想要的答案了,不过我们可以分析proc文件系统提供的smaps文件,这篇文章详尽地列出了当前进程所占用物理内存的使用情况。

本文将分为三个部分:

1、分简要阐述虚拟内存和驻留内存这两个重要的概念;

2、解释top命令中VIRT、RES以及SHR三个参数的实际参考意义;

3、向大家介绍一下smaps文件的格式,通过分析smaps文件我们可以详细了解进程物理内存的使用情况,比如mmap文件占用了多少空间、动态内存开辟消耗了多少空间、函数调用栈消耗了多少空间等等。

01关于内存的两个概念

要理解top命令关于内存使用情况的输出,我们必须首先搞清楚虚拟内存(Virtual Memory)和驻留内存(Resident Memory)两个概念。

(1)虚拟内存

首先需要强调的是虚拟内存不同于物理内存,虽然两者都包含内存字眼但是它们属于两个不同层面的概念。进程占用虚拟内存空间大并非意味着程序的物理内存也一定占用很大。虚拟内存是操作系统内核为了对进程地址空间进行管理(process address space management)而精心设计的一个逻辑意义上的内存空间概念。

我们程序中的指针其实都是这个虚拟内存空间中的地址。比如我们在写完一段C++程序之后都需要采用g++进行编译,这时候编译器采用的地址其实就是虚拟内存空间的地址。因为这时候程序还没有运行,何谈物理内存空间地址?凡是程序运行过程中可能需要用到的指令或者数据都必须在虚拟内存空间中。

既然说虚拟内存是一个逻辑意义上(假象的)的内存空间,为了能够让程序在物理机器上运行,那么必须有一套机制可以让这些假象的虚拟内存空间映射到物理内存空间(实实在在的RAM内存条上的空间)。这其实就是操作系统中页映射表(page table)所做的事情了。

内核会为系统中每一个进程维护一份相互独立的页映射表。页映射表的基本原理是将程序运行过程中需要访问的一段虚拟内存空间通过页映射表映射到一段物理内存空间上,这样CPU访问对应虚拟内存地址的时候就可以通过这种查找页映射表的机制访问物理内存上的某个对应的地址。“页(page)”是虚拟内存空间向物理内存空间映射的基本单元。

下图演示了虚拟内存空间和物理内存空间的相互关系,它们通过Page Table关联起来。其中虚拟内存空间中着色的部分分别被映射到物理内存空间对应相同着色的部分。而虚拟内存空间中灰色的部分表示在物理内存空间中没有与之对应的部分,也就是说灰色部分没有被映射到物理内存空间中。这么做也是本着“按需映射”的指导思想,因为虚拟内存空间很大,可能其中很多部分在一次程序运行过程中根本不需要访问,所以也就没有必要将虚拟内存空间中的这些部分映射到物理内存空间上。

8158a178-34f7-11ed-ba43-dac502259ad0.png

虚拟内存空间到物理内存空间映射

到这里为止已经基本阐述了什么是虚拟内存了。

总结一下就是,虚拟内存是一个假象的内存空间,在程序运行过程中虚拟内存空间中需要被访问的部分会被映射到物理内存空间中。虚拟内存空间大只能表示程序运行过程中可访问的空间比较大,不代表物理内存空间占用也大。

(2)驻留内存

驻留内存,顾名思义是指那些被映射到进程虚拟内存空间的物理内存。上图中,在系统物理内存空间中被着色的部分都是驻留内存。比如,A1、A2、A3和A4是进程A的驻留内存;B1、B2和B3是进程B的驻留内存。

进程的驻留内存就是进程实实在在占用的物理内存。一般我们所讲的进程占用了多少内存,其实就是说的占用了多少驻留内存而不是多少虚拟内存。因为虚拟内存大并不意味着占用的物理内存大。

02top命令中VIRT、RES和SHR

关于虚拟内存和驻留内存这两个概念我们说到这里。下面一部分我们来看看top命令中VIRT、RES和SHR分别代表什么意思。

top命令中VIRT、RES和SHR的含义

搞清楚了虚拟内存的概念之后解释VIRT的含义就很简单了。VIRT表示的是进程虚拟内存空间大小。对应到图1中的进程A来说就是A1、A2、A3、A4以及灰色部分所有空间的总和。也就是说VIRT包含了在已经映射到物理内存空间的部分和尚未映射到物理内存空间的部分总和。

RES的含义是指进程虚拟内存空间中已经映射到物理内存空间的那部分的大小。对应到图1中的进程A来说就是A1、A2、A3以及A4几个部分空间的总和。所以说,看进程在运行过程中占用了多少内存应该看RES的值而不是VIRT的值。

最后来看看SHR所表示的含义。

SHR是share(共享)的缩写,它表示的是进程占用的共享内存大小。在上图中我们看到进程A虚拟内存空间中的A4和进程B虚拟内存空间中的B3都映射到了物理内存空间的A4/B3部分。咋一看很奇怪。

为什么会出现这样的情况呢?

其实我们写的程序会依赖于很多外部的动态库(.so),比如libc.so、libld.so等等。这些动态库在内存中仅仅会保存/映射一份,如果某个进程运行时需要这个动态库,那么动态加载器会将这块内存映射到对应进程的虚拟内存空间中。多个进展之间通过共享内存的方式相互通信也会出现这样的情况。

这么一来,就会出现不同进程的虚拟内存空间会映射到相同的物理内存空间。这部分物理内存空间其实是被多个进程所共享的,所以我们将他们称为共享内存,用SHR来表示。

某个进程占用的内存除了和别的进程共享的内存之外就是自己的独占内存了。所以要计算进程独占内存的大小只要用RES的值减去SHR值即可。

03进程的smaps文件

通过top命令我们已经能看出进程的虚拟空间大小(VIRT)、占用的物理内存(RES)以及和其他进程共享的内存(SHR)。但是仅此而已,如果我想知道如下问题:

进程的虚拟内存空间的分布情况,比如heap占用了多少空间、文件映射(mmap)占用了多少空间、stack占用了多少空间?

进程是否有被交换到swap空间的内存,如果有,被交换出去的大小?

mmap方式打开的数据文件有多少页在内存中是脏页(dirty page)没有被写回到磁盘的?

mmap方式打开的数据文件当前有多少页面已经在内存中,有多少页面还在磁盘中没有加载到page cahe中?

等等

以上这些问题都无法通过top命令给出答案,但是有时候这些问题正是我们在对程序进行性能瓶颈分析和优化时所需要回答的问题。所幸的是,世界上解决问题的方法总比问题本身要多得多。linux通过proc文件系统为每个进程都提供了一个smaps文件,通过分析该文件我们就可以一一回答以上提出的问题。

在smaps文件中,每一条记录(如下图所示)表示进程虚拟内存空间中一块连续的区域。其中第一行从左到右依次表示地址范围、权限标识、映射文件偏移、设备号、inode、文件路径。详细解释可以参见understanding-linux-proc-id-maps。

接下来8个字段的含义分别如下:

• Size:表示该映射区域在虚拟内存空间中的大小。

•Rss:表示该映射区域当前在物理内存中占用了多少空间

•Shared_Clean:和其他进程共享的未被改写的page的大小

•Shared_Dirty:和其他进程共享的被改写的page的大小

•Private_Clean:未被改写的私有页面的大小。

•Private_Dirty:已被改写的私有页面的大小。

•Swap:表示非mmap内存(也叫anonymous memory,比如malloc动态分配出来的内存)由于物理内存不足被swap到交换空间的大小。

•Pss:该虚拟内存区域平摊计算后使用的物理内存大小(有些内存会和其他进程共享,例如mmap进来的)。比如该区域所映射的物理内存部分同时也被另一个进程映射了,且该部分物理内存的大小为1000KB,那么该进程分摊其中一半的内存,即Pss=500KB。

816f9be4-34f7-11ed-ba43-dac502259ad0.jpg

smaps文件中的一条记录

有了smap如此详细关于虚拟内存空间到物理内存空间的映射信息,相信大家已经能够通过分析该文件回答上面提出的4个问题。

04最后希望大家能够通过阅读本文对进程的虚拟内存和物理内存有一个更加清晰认识,并能更加准确理解top命令关于内存的输出,最后可以通过smaps文件更进一步分析进程使用内存的情况。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209537
  • 内存
    +关注

    关注

    8

    文章

    3025

    浏览量

    74060
  • Virt
    +关注

    关注

    0

    文章

    2

    浏览量

    6938

原文标题:理解virt、res、shr之间的关系(linux系统篇)

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PADS2007PCB上元件属性的Label 项有5个Res.Des 和Part type

    PADS2007PCB上元件属性的Label 项中有5个Res.Des 和5个Part type ,即Res.Des -1 ,Res.D
    发表于 07-12 18:15

    PCB各层的含义

    PCB有很多的层,初学者在一开始学画板子的时候,很容易被各种各样的层给弄迷,所以在这里我们把所有的层以及含义作一个总结,以帮助大家更好地理解PCB的设计。 英文中文定义Top Layer顶层信号层
    发表于 07-04 07:01

    SHR702P 中继接口电路

    概述 SHR702P 是在SHR202P 基础上将收发时钟和时隙分开,其他性能指标完全相同。 应用专利技术设计,先进新颖。 采用传统变压器藕合方式,抗干扰能力
    发表于 05-06 09:44 16次下载

    PCBTOP PASTE和TOP SOLDER的区别_PCB层的含义详解

    本文首先介绍了PCB的作用及特点,其次阐述了PCBTOP PASTE和TOP SOLDER的区别,最后介绍了PCB层的含义详解,具体的跟随小编一起来了解一下。
    发表于 05-17 18:11 7w次阅读
    PCB<b class='flag-5'>中</b><b class='flag-5'>TOP</b> PASTE和<b class='flag-5'>TOP</b> SOLDER的区别_PCB层的<b class='flag-5'>含义</b>详解

    用30个实例探索top命令的细节

    最全Linux TOP命令使用教程!
    的头像 发表于 05-20 10:20 4305次阅读
    用30个实例探索<b class='flag-5'>top</b><b class='flag-5'>命令</b>的细节

    你会使用top命令了解 Fedora 的内存使用情况

    如果你使用过 top 命令来查看 Fedora 系统的内存使用情况,你可能会惊讶,看起来消耗的数量比系统可用的内存更多。
    发表于 04-22 17:49 1150次阅读

    PADS的快捷命令字符和命令含义及用途的详细说明

    本文档的主要内容详细介绍的是PADS的快捷命令字符和命令含义及用途的详细说明。
    发表于 03-03 08:00 0次下载
    PADS的快捷<b class='flag-5'>命令</b>字符和<b class='flag-5'>命令</b><b class='flag-5'>含义</b>及用途的详细说明

    在Linux系统下使用top命令查看CPU使用情况

    在Linux系统下,使用top命令查看CPU使用情况。
    发表于 07-10 11:46 4409次阅读
    在Linux系统下使用<b class='flag-5'>top</b><b class='flag-5'>命令</b>查看CPU使用情况

    linux的top命令详解

    top命令是UNIX/Linux系统,用于查看系统详情的第一入口,一般我们查看机器运行状态的时候,总是第一个使用top命令,而实际上
    发表于 07-13 11:24 3542次阅读
    linux的<b class='flag-5'>top</b><b class='flag-5'>命令</b>详解

    top命令CPU使用率的意义

    平常我们使用 top 命令来查看系统的性能情况,在 top 命令可以看到很多不同类型的 CPU 使用率,如下图红框中标出部分: 下面,我们
    的头像 发表于 09-01 14:41 4618次阅读

    分享一篇关于讲解top命令的硬核干货

    Linuxtop命令显示系统上正在运行的进程。它是系统管理员最重要的工具之一。被广泛用于监视服务器的负载。
    的头像 发表于 09-13 09:52 731次阅读

    一文讲解Linuxtop命令

    今天浩道跟大家分享一篇关于讲解top命令的硬核干货,个人觉得本文罗列的实例比我平时关注的要详细得多,所以分享给大家学习!
    的头像 发表于 01-30 17:30 5131次阅读

    shell命令提示符的具体含义

    Shell命令提示符的含义因操作系统和Shell类型而异。在Linux系统,Shell命令提示符通常由以下几部分组成: 用户名:显示当前登录用户的用户名。 主机名:显示当前系统的主机
    的头像 发表于 11-08 10:37 1513次阅读

    linuxtop命令详解

    Linux系统top命令是一个非常强大和常用的命令,用于实时监控和管理系统的运行状态。它能够显示系统的整体性能数据,以及各个进程的资源占用情况。在本文中,我们将详细解释
    的头像 发表于 11-17 10:25 2105次阅读

    top命令如何进入选项

    top命令是一个常用的Linux系统性能监控工具,可以实时地监视系统的整体运行情况。通过使用top命令,我们可以查看系统的负载情况、进程的CPU和内存使用情况等。想要进入
    的头像 发表于 11-17 10:27 1459次阅读