文章转自微信公众号“麻辣软硬件”:https://www.toutiao.com/i6704524697280709133/
- 操作系统中的内存管理是怎样的
- 物理内存的性能指标的影响因素
从free说起
以centos7为例,free命令结果如下:
[root@lh ~]# free -w
total used free shared buffers cache available
Mem: 24473612 482400 23777212 17532 2108 211892 23665672
Swap: 12320764 0 12320764
从结果中,我们可以看出:
total = used + free + buffers + cache
total、used自不必说,其他字段意义如下:
shared:多进程共享内存数
buffers/cache:缓存内存数,物理内存不足时,系统会释放一部分缓存
free:空余内存数
available:可用内存数
swap: 交换分区,将不常用的数据置换到磁盘
为了进一步理解这几个概念,就从内存的空间模型说起。
操作系统中的内存
内存的空间模型
在内存中运行的每个进程都需要使用到内存,但是不是每个进行都需要每时每刻都使用系统分配的内存空间。
当系统所需内存超过实际的物理内存时,内核会释放某些进程所"占用但未使用"的物理内存,把这些资料存储在磁盘上,并将释放出来的内存提供给有需要进程使用。
进程的空间模型展示的是进程所使用的逻辑内存。换句话说,如果你的程序每sleep一段时间后打印一次内存的地址空间,就会发现,进程的地址空间并未改变,但对应的物理内存的地址可能已经改变很多次了。
虚拟内存管理与周边系统关系
- 内存管理系统负责文件 Cache 的分配和回收,同时虚拟内存管理系统(VMM)则允许应用程序和文件 Cache 之间通过 memory map的方式交换数据
- 虚拟文件系统VFS负责在应用程序和文件 Cache 之间通过 read/write 等接口交换数据
- 具体文件系统,如 ext2/ext3、jfs、ntfs 等,负责在文件 Cache和存储设备之间交换数据
Cache、文件及磁盘间关系
- 文件Cache分为两个层面,Page Cache和Buffer Cache,每一个 Page Cache 包含若干 Buffer Cache。
- 内存管理系统和 VFS 只与 Page Cache 交互,内存管理系统负责维护每项 Page Cache 的分配和回收,同时在使用 memory map 方式访问时负责建立映射;VFS 负责 Page Cache 与用户空间的数据交换。
- 具体文件系统一般只与 Buffer Cache 交互,它们负责在外围存储设备和 Buffer Cache 之间交换数据。
交换分区
为了满足物理内存不足而利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的空间。
交换机制如下:- Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么需要内存,Linux也会交换出暂时不用的内存页面,这样的可以避免等待交换所需的时间。
- Linux内存管理中,通过调页paging和交换swapping来完成上述的内存调度。调页算法是把内存中最近不常使用的页面换到磁盘中,把活动页面保留在内存中供进程使用。
- 分页写入磁盘的过程为:page-out,分页从硬盘重新回到内存的过程被称为page-in,内核需要一个分页的时候,发现此分页不再内存中,就会发生page fault。
内存性能指标
内存容量
容量越大,性能越好。但也需要和主板、操作系统等配套。
在Windows中我们可以通过命令行查看出当前系统支持的最大内存是多少:
C:\Users\SOMEONE>wmic memphysical get maxcapacity
MaxCapacity
16777216
命令结果的单位为KB,因此,此电脑支持的最大内存为16GB
内存等待时间
内存等待时间,表示系统进入数据存取操作就绪状态前等待内存响应的时间。
目前业界优化的方式有:- 多级缓存和预取技术
- 多线程及乱序执行技术
- 集成式内存控制器
- 内存集成到处理器中
内存带宽
内存带宽=(传输倍率×总线位宽×工作频率)÷8
内存总线位宽:受内存引脚数量的限制,可将内存集成到处理器中,摆脱限制
内存工作频率:受芯片发热和工艺限制
内存传输倍率:DDR是SDRAM的2倍
目前各代内存的指标如下:
总结
从开发角度看
在性能要求高的情况下编程,我们应该注意:- 尽量使用内存池,避免频繁地申请和释放内存;
- 热度比较高的内容应缓存在内存中,避免频繁地从磁盘中读取。
从测试的角度看
磁盘的性能测试过程中,进程读取的数据有可能在磁盘,也有可能在内存,导致测试结果时好时坏,所以在测试过程中应该注意:- 在不要求精确的情况下,尽量让读写的数据大小远大于内存容量;
- 在要求精确的情况下,应使用特定的工具如iozone、fio等,开启从磁盘直接读取的模式进行测试;
- 在进行分布式系统的性能测试时,应该注意分析清楚服务端和客户端双方的内存缓存带来的影响,然后再设置相应的测试方案。