Linux 内存管理三

让人想犯罪 __ 提交于 2020-02-01 19:39:33

本节主要涉及下面这些概念,搞清楚我们在linux下面写一个应用程序究竟耗费了多少内存,也是我们查内核泄漏的指标。

VSS- Virtual Set Size

RSS- Resident Set Size

PSS- Proportional Set Size

USS- Unique Set Size

在linux 里面大量的存在内存共享的概念,比如我们的libc 库,加入我们有100个程序调用了c 库,linux会把代码段再内存里面共享给这个100个进程使用(动态连接库都是这样),我们把一个程序跑两次,程序的代码段也是共享的,当然数据段是写时拷贝的,当我们再评估一个进程耗费多少内存的时候,我们有必要搞清这些虚的,实的,以及共享的,我们说的进程的内存消耗就是指用户空间耗费的内存,内核空间耗费的内存就是内核消耗的,比如我们做了一个系统调用,这个系统调用申请了很多内存,这个写内存也不属于进程消耗

VMA 表面地址的合法性,和权限,不代表页表里面真实的权限,但是linux的页表中发生page fault时会检测vma,确定是否合法访问,如果合法,申请对应的物理地址映射过来。

这些vma 可能来自程序本身的代码段,数据段,或者动态库。

我们一般用如下方法来查看vma

Linux 下各种page fault,通常分为minor page fault ,和major page fault。第一中只是申请一页内存,第二种不仅要申请内存,还需要读取硬盘,所以这种开销是远大于minor page fault的,从硬件MMU 不区分这个,minor和major 是纯软件的概念。

Linux 这么多进程在跑,每个进程都有各自的页表,下面这张图详细的描述了各个进程是如何瓜分内存条的。有一些是被不同进程共享的,描述一个进程有四个概念,一般说一个进程耗费多少内存,pss是最公平的,uss 一般用于观察内存泄漏就可以了,连续多点采用来判断。在linux 我们一般都是使用smem 这个工具比如 smem -P ^a.out 查看a.out内存消耗情况,嵌入式系统一般用smemcap 抓取tar包,在电脑上查看。

对于内核的内存泄漏是查看slab区域,vmalloc区域是不是在不断变大,内核的泄漏不算在进程上。

4.9 之后的gcc 都带有addresssssanitizer(ASAN) ,他会帮你检查内存申请释放的点,这样程序稍微慢几倍就可以检测内存泄漏的问题

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!