什么是 Cache Miss
程序运行的本质是 CPU 读取修改数据,而原始的数据都在磁盘上,你也可以直接在磁盘上执行程序,但是因为硬件原因,速度很慢。
所以有物理内存这一中介,物理内存的读写速度比磁盘快很多,系统会把当前程序需要的数据载入物理内存中,让 CPU 能更快读取。
但是依然不够快,于是有 L1/L2/L3 Cache 这类多级缓存,他们的读写速度更快,但是容量也更小。Cache Miss 就是指的从这里的缓存拿不到需要的数据,导致需要向下一级缓存拿数据,这一来一回必然就有了时间消耗,最差的情况就是需要从磁盘拿数据,所以用固态硬盘的机子会比机械硬盘运行程序来的快。
为什么会 Cache Miss
因为硬件成本的原因,缓存的容量越大,读写的速度也越慢。CPU Cache 的速度是最快的,容量也最小,因此也没法容纳程序需要的所有数据,一次只会缓存程序的部分数据,那就难免会有某些数据没有缓存到,这就造成了 Cache Miss。
怎样尽量避免 Cache Miss,提高 Cache Hit
- 设计内存连续的数据结构。 因为 Cache 是一串一串(Cache Line)的读取的,就是读取某个数据时,会把周围的数据也读取进来,凑成固定的大小(Cache Line)。如果数据存储是连续的,则很有可能刚好把下次要读取的数据也一起读取进来了。比如数组的遍历。ECS 的内存友好也是因为数据结构是多个连续的数组组成,而不是面向对象那种一个 class 包裹各种数据。
延展
什么是缺页中断,内存换页
缺页中断就是 CPU 访问内存中还未加载的数据,内存需要从磁盘加载数据。
访问内存-页面不存在-触发缺页中断-进入中断处理程序-os 检查页面分配情况-从磁盘读取交换文件/交换分区-修改页表并刷新页面缓存-恢复线程运行。
操作系统虚拟内存换页的过程是什么?
什么是虚拟内存
虚拟内存是内存管理的一项技术,使得每个应用程序拥有一样大小的连续完整的内存空间地址(逻辑地址/虚拟地址),并且映射到具体的物理地址。相当于一个中间层,使得应用程序不关心内存怎么分配。虚拟(逻辑)内存地址可能指向物理内存,也可能指向磁盘空间。(对于32位进程,其逻辑内存空间位4G)
虚拟内存
什么是多级页表
多级页表是用于虚拟地址映射到物理地址的数据结构。如果一个应用程序有4G的数据,那么虚拟内存也有4G,但通常不会全用上。假如只用一级页表,那么所有的地址映射都要在主存中,这就很浪费。于是采用了多级页表,就跟文档的目录拆分一样,一级页表是大纲,覆盖了所有的内存段。二级页表就是以及页表定义的内存段的继续细分。也因此二级页表不需要一开始就在主存中,只需要当对应的一级页表被使用到是,再动态从磁盘中载入对应的二级页表。(即二级页表可以不存在主存中,甚至不存在)
操作系统中的多级页表到底是为了解决什么问题?
什么是内存碎片
空闲却使用不了的内存。
外部内存碎片:产生多个不连续的小物理内存,导致新的程序无法装载。
内部内存碎片:程序所有内存都装载到了物理内存,但有部分不使用。
20 张图揭开「内存管理」的迷雾,瞬间豁然开朗