3.Linux内存管理----进程中的内存消耗、泄露

一、VMA(virtual memory area)

1.VMA(虚拟内存空间)概述
    一个进程用结构体task_struct结构体描述。task_struct中包含内存结构体mm_struct ;mm_struct 包含虚拟内存结构体vm_area_struct。
    vm_area_struct中,包含虚拟内存的用户空间的地址范围,以及该内存的操作权限(rwx)。

2.查看进程的VMA信息指令

1、pmap ${pid}
2、cat /proc/${pid}/maps
3、cat /proc/${pid}/smaps | more

3、VMA的组成

1.可执行文件的二进制代码,也就是程序的代码段
2.存储全局变量的数据段
3.用于保存局部变量和实现函数调用的栈
4.环境变量和命令行参数
5.程序使用的动态库的代码
6.用于映射文件内容的区域

refence:
Linux的进程地址空间[二] - VMA
Linux 内存管理窥探(15):虚拟内存 VMA 浅析

二、pagefault(缺页中断)

    当进程空间访问一个虚拟地址时,如果mmu页表中记录的该地址的范围以及权限异常时,会产生缺页中断(pagefault)。在缺页中断中,可以获取到进程要访问的地址以及对应的操作。


(1)产生SEGV(segment fault)的缺页中断:
非法区域:当进程空间的访问地址,不在VMA的地址范围内时
非法权限:当进程空间对一个代码段(只有R+X)进行W(写)操作


(2)不产生SEGV的缺页中断:
minor fault:
    当进程在heap申请到一块内存(权限是R+W),在进行首次W时,由于页表权限是R(此时,mmu将该虚拟地址是映射到0页的),发生page fault;page fault中发现该内存的VMA地址合法,权限合法,于是不向cpu发送SEGV,并申请一页实际的物理内存,MMU将虚拟地址和物理地址做映射并修改页表权限为R+W。

major fault
    当进程首次执行代码段时,会访问代码段的内存地址,产生page fault(和minor fault产生page fault的原理是一样的)。此时page fault中发现 地址合法、权限合法,于是申请一页物理内存,并从磁盘中拷贝数据到该内存当中,MMU将虚拟地址和物理地址做映射并修改页表权限为R+X.

    major fault 和 minor fault 最大不同在于 major fault产生是伴随着IO行为的产生。
    所以刚上电后,首次执行程序时,会发现启动时间较长,因为这个过程伴有较多的major fault;当启动过程序一次后,再次执行时,会比之前快,是因为一些文件已经缓存到内存当中,不会产生较多的major fault,所以启动速度较快。
    Linux 中可以同过time或者\time -v指令来运行一个程序,观察程序运行的时间以及产生的major和minor fault的次数。

三、用户空间的虚拟内存在实际物理内存的分布

1、内存被进程的瓜分图
在这里插入图片描述

    进程1045和1046运行的同一个程序,所以他们两共用用同一个代码段;进程1045、1046、1054共用一个动态库libc

    那么进程1044的内存占用情况如下:
    VSS(虚拟内存) = 1 +2 +3
    RSS(驻留内存,实际的物理内存) = 4 + 5 +6
    PSS(比例化的驻留内存) = 4/3 + 5/2 + 6
    USS(独占的驻留内存) = 6

    VSS>=RSS>=PSS>=USS

    所以看一个进程是否有内存泄露观察USS即可:可以通过smem工具来查看一个进程的USS。
    当一个进程,malloc了100M的内存,但是内存还没有被free掉,进程就被kill掉了,那么这100M的内存是不会泄露掉的。当一个进程被杀掉的时候,他申请的所有内存都会释放掉,所以上面说的情况不用担心存在内存泄露的情况。

四、判断内存泄露

1、判断内存泄露的方法:采用连续多点采样法,一段时间内观察uss是否一直增长
2、寻找内存泄露的步骤:

1、首先通过 /proc/meminfo 或者 free指令 来判断内存是否一直减小
2、然后通过 smem 指令来观察相关进程的uss是否一直在增加
3、如果进程的uss随着时间的增长一直增长,那么就说明进程存在内存泄露;如果没有,说明是内核存在内存泄露
4、如果是进程内存泄露,
   可以通过 valgrind或者gcc中的addressanitizer来寻找内存泄露的位置
5、如果是内核泄露内存,
   可以打开编译选项 KMEME_LEAK 选项,
   通过观察 ①/proc/meminfo 中的 slab、vmalloc 的信息、②slabtop指令、③/proc/slabinfo 
   等信息来判断内存泄露的位置
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值