主存
物理内存,计算机的高速数存储区域,动态随机访问内存(DRAM)。
常驻内存
当前处于主存中的内存。
虚拟内存
一个抽象的主存概念,它几乎是无限的和非竞争性的。虚拟内存不是真实的内存。他向每个进程和内核提供巨大的、线性的而且私有的地址空间。它简化了软件开发,把物理内存的分配交给操作系统管理。它也支持多任务,因为虚拟地址空间被设计成分离的,而且可以超额订购,即使用中的内存可以超出主内存的容量。
过度提交
允许分配超过系统可以存储的内存————超过物理内存与交换设备的总和。它依赖于按需换页以及程序通常不会使用分配给它们的大部分内存。有了过度提交,应用程序提交的内存请求会成功。应用程序开发人员能够慷慨地分配内存并按需稀疏使用,而不是谨慎地分配内存以控制在虚拟内存的限额内。
段
标记为特殊用途的一块内存区域。
匿名内存
无文件系统位置或者路径名的内存,它包括进程地址空间的工作数据,称作堆。
地址空间
内存上下文。每个进程和内核都有对应的虚拟内存地址空间
页
操作系统和CPU使用的内存单位。它一直以来是4KB或8KB,现代处理器允许多种页大小以支持更大的页面尺寸
缺页
无效的内存访问。使用按需虚拟内存时,这是正常事件。
严重缺页
需要访问存储设备的缺页,例如访问未缓存映射到内存的文件
换页
将页面换入和调出内存,它们分别被称为页面换入和页面换出。与交换整个程序不同,由于页的尺寸相对较小,换页是精确管理和释放主存的手段
-
运行部分载入的程序
-
运行大于主存的程序
-
高效地在主存和存储设备间迁移
文件系统换页:
文件系统换页由读写位于内存中的映射文件页引起。对于使用文件内存映射(mmap())的应用程序和使用了页缓存的文件系统,这是正常行为,被称为“好的”换页,需要时,内核可以调出一些页释放内存。如果一个文件系统页在主存修改过(脏的),页面换出要求将该页写回磁盘。如果文件系统页没有修改过(干净的),因为磁盘已经存在一份副本,页面换出仅仅释放这些内存。匿名换页:
匿名换页牵涉进程的私有数据:进程堆和栈。匿名是由于它在操作系统中缺乏有名字的地址(例如,没有文件系统路径)。匿名换页要求迁移数据到物理交换设备或者交换文件。在Linux中用交换(swapping)来命名这种类型的换页。
匿名换页拖累性能,被称为“坏的”换页。当应用程序访问被调出的页时,会被读页的磁盘IO阻塞。这就是匿名页面换入,他给程序带来同步的延时。匿名页面的换出可能不会直接影响程序性能,因为它由内核异步执行。
性能在有没匿名换页(交换)的情况下处于最佳状态。可以通过配置应用常驻内存并且监控页面扫描、内存使用率和匿名换页,来确保不存在内存短缺的迹象
按需换页
按需换页的操作系统将虚拟内存按需映射到物理内存。这会把CPU创建映射的开销推迟到实际需要或者访问时,而不是初次分配这部分内存时。
虚拟内存和按需换页的结果是任何虚拟内存页都可能处于如下状态:
A:未分配
B:已分配,未映射(未填充并且未缺页)
C:已分配,已映射到内存(RAM)
D:已分配,已映射到物理交换空间(磁盘)
如果系统内存压力而换出页就会到达状态D
状态B到C就是缺页
如果需要读写磁盘就是严重缺页。否则轻微缺页
常驻内存大小(RSS):已经分配到主页C的大小
虚拟内存大小:B + C + D
字长
处理器可能会支持多种字长,例如32位和64位,这样两种应用程序可以运行。地址空间受限于字长的寻址空间,因此32位地址放不下需要4GB以上的应用程序,必须用64位或更大的字长来编译。
交换
Linux中交换指页面转移到交换设备(迁移交换页)。
交换出一个进程,要求进程的所有私有数据必须被写入交换设备,包括线程结构和进程堆(匿名数据)。源于文件系统而且没有被修改的数据可以被丢弃,需要的时候再从原来的位置读取。
由于进程的一小部分元数据总是常驻于内核内存中,内核仍然能知道已交换出的进程。至于将要哪个进程交换回来,内核会优先考虑线程优先级、磁盘等待时间以及进程的大小。长期等待和较小的进程享有更高优先级。
交换严重影响性能,因为已经交换出的进程需要很多磁盘IO才能重新运行
分配器
当虚拟内存处理多任务物理内存时,在虚拟地址空间中实际分配和内存堆放通常由分配器来处理。用户态库或者内核程序向程序员提供简单的内存使用接口。分配器对性能有显著明显的影响,一个系统通常会提供多个可选择的用户态分配器库。分配器可以利用包括线程级别对象缓存在内的技术以提高性能,但是如果分配器变碎并且损耗变高,它们也会损耗性能。
参考书籍:《性能之巅 洞悉系统、企业与云计算》