Linux 性能分析总结之 内存工做原理(三)

0x00 前言

在写完了 CPU 的的性能分析笔记后,接下来是分析内存的性能问题,在分析内存的性能问题以前,确定是须要了解内存的原理,这里的原理指的是内存软件层面的原理,如内存如何进行分配、释放等等,而不是说内存的硬件结构、内存寄存器、TLB 等等。算法

0x01 内存映射

经常咱们在买电脑前,咱们都关心一个参数:内存大小,这直接关系到咱们电脑的性能,但这里的大小指的是物理内存的大小,而在操做系统上,咱们的程序在运行的过程当中并非直接使用物理内存的,而是用到了虚拟内存,即经过将物理内存映射成虚拟内存供进程使用,这也正是计算机世界的规则之抽象和分层。缓存

当程序被执行的时候,全部用到的内存地址都是虚拟内存的地址,而后再由操做系统将虚拟地址转换成物理地址,这样程序便无需关心真正的物理地址是什么,从而在程序编译的时候无需知道真正的物理地址,同时不一样的进程之间也起到的隔离的做用。ide

具体的内存映射能够总结出如下几点:函数

  1. 虚拟地址分为内核空间和用户空间,同时虚拟内存模型是一个倒着的栈,栈底是高地址。以下所示:
    clipboard.png
  2. 虚拟地址和物理地址之间是要经过一个东西关联的,就像一个索引,而这个东西就是页表,Linux 用的是四级页表

0x02 内存分配与回收

分配

C 标准库使用 malloc 函数提供内存分配,有两种实现方式:性能

  1. brk():分配小于 128k 的内存,经过移动堆顶的位置
  2. mmap():分配大于 128k 的内存,在文件映射段找一块空闲的内存分配出去
  3. slab 分配器: 分配小于 1k 的内存,用的内存是 blk 释放的被缓存起来的内存

优缺点

  1. brk(): 频繁内存分配会形成内存碎片
  2. mmap:内存用完了会放掉,而后再次申请会有缺页异常,使内核的负担增大

释放

  1. 回收缓存: LRU算法
  2. 回收不常访问的内存,swap 到磁盘:可能会致使性能问题
  3. OOM:使用 oom_score 的权重杀进程

0x03 内存参数

free(全局)

clipboard.png

  1. total: 总内存
  2. used: 已使用内存
  3. free: 未使用内存
  4. shared: 共享
  5. buff/cache: 缓存和缓冲
  6. available: 新进程

top (单个进程)

clipboard.png

  1. VIRT(Virtual): 进程虚拟内存,只要申请过就会计算,即便没分配物理内存,因此会比实际的物理内存大不少
  2. RES(Resident): 常驻内存,即实际物理内存,不包括 swap
  3. SHR(Shared): 共享内存,好比根据前面的虚拟内存图所示,动态库段和程序代码段都属于共享内存,但也不是全部 Shared 都是共享的,有些非共享的动态库也算在了里面
  4. MEM%: 物理内存的占用百分比了

0x04 总结

今天的笔记总结下来就是,先不讨论内存的物理结构(或许后续会总结下计算机原理的内存硬件结构~),在软件层面使用内存:spa

  1. 不直接使用物理内存,进程是使用虚拟内存,这也是计算机抽象的一种体现
  2. 内存的分配和回收的方式的种类和方式
  3. 在 Linux 上如何查看内存的参数

在了解了内存的基本一些原理后,咱们即可以进行深刻的内存性能分析了。操作系统

相关文章
相关标签/搜索