专栏首页人人都是极客Linux用户态进程的内存管理

Linux用户态进程的内存管理

上一篇我们了解了内存在内核态是如何管理的,本篇文章我们一起来看下内存在用户态的使用情况,如果上一篇文章说是内核驱动工程师经常面对的内存管理问题,那本篇就是应用工程师常面对的问题。

相信大家都知道对用户态的内存消耗对象是进程,应用开发者面对的所有代码操作最后的落脚点都是进程,这也是说为什么内存和进程两个知识点的重要性,理解了内存和进程两大法宝,对所有软件开发的理解都会有了全局观(关于进程的知识以后再整理和大家分享)。

下面闲话少说,开始本篇的内容——进程的内存消耗和泄漏

进程的虚拟地址空间VMA(Virtual Memory Area)

在linux操作系统中,每个进程都通过一个task_struct的结构体描叙,每个进程的地址空间都通过一个mm_struct描叙,c语言中的每个段空间都通过vm_area_struct表示,他们关系如下 :

上图中,task_struct中的mm_struct就代表进程的整个内存资源,mm_struct中的pgd为页表,mmap指针指向的vm_area_struct链表的每一个节点就代表进程的一个虚拟地址空间,即一个VMA。一个VMA最终可能对应ELF可执行程序的数据段、代码段、堆、栈、或者动态链接库的某个部分。

VMA的分布情况可以有通过pmap命令,及maps,smaps文件查看,如下图:

另,VMA的具体内容可参考下图。

page fault的几种可能性

我们先来看张图:

(此图来源于宋宝华老师)

  • 如,调用malloc申请100M内存,IA32下在0~3G虚拟地址中立刻就会占用到大小为100M的VMA,且符合堆的定义,这一段VMA的权限是R+W的。但由于Lazy机制,这100M其实并没有获得,这100M全部映射到一个物理地址相同的零页,且在页表中记录的权限为只读的。当100M中任何一页发生写操作时,MMU会给CPU发page fault(MMU可以从寄存器读出发生page fault的地址;MMU可以读出发生page fault的原因),Linux内核收到缺页中断,在缺页中断的处理程序中读出虚拟地址和原因,去VMA中查,发现是用户程序在写malloc的合法区域且有写权限,Linux内核就真正的申请内存,页表中对应一页的权限也修改为R+W。
  • 如,程序中有野指针飞到了此程序运行时进程的VMA以外的非法区域,硬件就会收到page fault,进程会收到SIGSEGV信号报段错误并终止。如,程序中有野指针飞到了此程序运行时进程的VMA以外的非法区域,硬件就会收到page fault,进程会收到SIGSEGV信号报段错误并终止。
  • 如,代码段在VMA中权限为R+X,如果程序中有野指针飞到此区域去写,则也会发生段错误。(另,malloc堆区在VMA中权限为R+W,如果程序的PC指针飞到此区域去执行,同样发生段错误。)
  • 如,执行代码段时会发生缺页,Linux申请1页内存,并从硬盘读取出代码段,此时产生了IO操作,为major主缺页。如,执行代码段时会发生缺页,Linux申请1页内存,并从硬盘读取出代码段,此时产生了IO操作,为major主缺页。

(此图来源于宋宝华老师)

综上,page fault后,Linux会查VMA,也会比对VMA中和页表中的权限,体现出VMA的重要作用。

malloc分配的原理

malloc的过程其实就是把VMA分配到各种段当中,这时候是没有真正分配物理地址的。malloc 调用后,只是分配了内存的逻辑地址,在内核的mm_struct 链表中插入vm_area_struct结构体,没有分配实际的内存。当分配的区域写入数据是,引发页中断,建立物理页和逻辑地址的映射。下图表示了这个过程。

从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。

  • malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系)
  • malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0)

内存的消耗VSS RSS PSS USS

首先,我们评估一个进程的内存消耗都是指用户空间的内存,不包括内核空间的内存消耗 。这里我们用工具 procrank先来看下Linux进程的内存占用量 。

  • VSS -Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
  • RSS -Resident Set Size 实际使用物理内存(包含共享库占用的内存)
  • PSS -Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  • USS -Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

下面再用一张图来更好的解释VSS,RSS,PSS,USS之间的区别:

有了对VSS,RSS,PSS,USS的了解,我们趁热打铁来看下内存在进程中是如何被瓜分的:

(此图来源于宋宝华老师)

1044,1045,1054三个进程,每个进程都有一个页表,对应其虚拟地址如何向real memory上去转换。

process 1044的1,2,3都在虚拟地址空间,所以其VSS=1+2+3。

process 1044的4,5,6都在real memory上,所以其RSS=4+5+6。

分析real memory的具体瓜分情况:

4 libc代码段,1044,1045,1054三个进程都使用了libc的代码段,被三个进程分享。

5 bash shell的代码段,1044,1045都是bash shell,被两个进程分享。

6 1044独占

所以,上图中4+5+6并不全是1044进程消耗的内存,因为4明显被3个进程指向,5明显被2个进程指向,衍生出了PSS(按比例计算的驻留内存)的概念。进程1044的PSS为4/3 +5/2 +6。

最后,进程1044独占且驻留的内存USS为 6。

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

【部分内容整理于宋宝华老师课程】

本文分享自微信公众号 - 人人都是极客(rrgeek)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux用户态进程的内存管理

    上一篇我们了解了内存在内核态是如何管理的,本篇文章我们一起来看下内存在用户态的使用情况,如果上一篇文章说是内核驱动工程师经常面对的内存管理问题,那本篇就是应用工...

    刘盼
  • Linux内核内存管理算法Buddy和Slab

    有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page...

    刘盼
  • Linux内核内存管理算法Buddy和Slab

    有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page...

    刘盼
  • Linux用户态进程的内存管理

    上一篇我们了解了内存在内核态是如何管理的,本篇文章我们一起来看下内存在用户态的使用情况,如果上一篇文章说是内核驱动工程师经常面对的内存管理问题,那本篇就是应用工...

    刘盼
  • 我和面试官之间关于操作系统的一场对弈!写了很久,希望对你有帮助!

    大家好,我是 Guide哥!很多读者抱怨计算操作系统的知识点比较繁杂,自己也没有多少耐心去看,但是面试的时候又经常会遇到。所以,我带着我整理好的操作系统的常见问...

    Guide哥
  • Linux vmstat命令详解

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进...

    用户5807183
  • Linux监控指令

    说到监控CPU,目前主要是监控CPU的使用率,以及每一个进程占用CPU资源,Linux系统中主要使用 top、vmstat、pstree 三个命令。

    木可大大
  • 快速定位手游内存占用过高问题

    为了避免手机性能成为游戏选择时的壁垒,游戏厂商必须进行更好的游戏性能优化。本文利用WeTest平台的Cube工具,通过三步完成游戏内存检测与分析的过程,希望为游...

    WeTest质量开放平台团队
  • MySQL并不孤单的存在—硬件环境的限制与优化

    之所以写这篇文章也是因为前几天出的一个问题,当时业务感觉到卡顿,并且伴随着锁超时的报错。最后通过分析发现是由于磁盘I/Q繁忙导致SQL耗时增加,部分锁竞争激烈的...

    MySQL数据库技术栈
  • 3D-BoNet:3D 点云实例分割的新框架 | NeurIPS 2019

    本文对牛津大学、DeepMind 等单位合作完成的论文《Learning Object Bounding Boxes for 3D Instance Segme...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券