0x00前言写完CPU性能分析笔记,接下来就是分析内存的性能了。在分析内存的性能之前,有必要了解一下内存原理,这里的原理指的是内存软件层面的原理,比如内存是如何分配、释放等,而不是内存的硬件结构,内存寄存器,TLB等0x01内存映射往往我们在买电脑之前,都会关心一个参数:内存大小,它直接关系到我们电脑的性能,但这里的大小指的是物理内存的大小,而在操作系统上,我们的程序在运行的过程中,并没有直接使用物理内存,而是使用了虚拟内存,即将物理内存映射为虚拟内存供进程使用,这正是抽象和计算机世界规则的分层。程序执行时,使用的所有内存地址都是虚拟内存的地址,然后操作系统将虚拟地址转换为物理地址,这样程序就不需要关心真正的物理地址,这样程序compiled时时刻刻都不需要知道真实的物理地址,同时也起到了不同进程之间隔离的作用。具体的内存映射可以概括为:虚拟地址分为内核空间和用户空间,虚拟内存模型是倒栈,栈底是高地址。如下图:虚拟地址和物理地址是通过某种东西联系起来的,比如索引,而这个东西就是页表,Linux使用的是四级页表0x02内存分配和回收分配C标准库使用malloc函数提供内存分配,有两种实现方式:brk():分配小于128k的内存,通过移动堆顶的位置mmap():分配大于128k的内存,在文件映射段中寻找空闲内存;allocateittoslaballocationDevice:分配小于1k的内存,使用的内存是blk释放的缓存内存优缺点brk():频繁分配内存会造成内存碎片mmap:内存用完就释放,然后再次申请时会出现pagefault,增加内核负担释放回收缓存:LRU算法回收不常访问的内存,swap到磁盘:可能导致性能问题OOM:使用oom_score的权重杀掉process0x03Memoryparametersfree(global)total:已用内存总量:Usedmemoryfree:未使用内存shared:sharedbuff/cache:cacheandbufferavailable:newprocesstop(singleprocess)VIRT(Virtual):processvirtualmemory,aslong因为是申请的,所以会计算,即使没有分配物理内存,所以会比实际的物理内存大很多。RES(Resident):常驻内存,即实际物理内存,不包括swapSHR(Shared):共享内存。比如根据前面的虚拟内存图,动态库段和程序代码段都属于共享内存,但并不是所有Shared都是共享的。一些非共享的动态库也包含在其中。(也许以后会总结计算机原理的内存硬件结构~),在软件层面使用内存:不直接使用物理内存,进程使用虚拟内存。这也是反映内存分配和回收类型的计算机抽象。如何在Linux上查看内存参数以及如何?了解了内存的基本原理之后,我们就可以进行深入的内存性能分析了。
