1.5 内存不够怎么办
总结于书中1.5小节
为什么不直接访问物理内存
- 运行地址不稳定
- 内存使用效率低
- 地址空间不隔离
为什么使用虚拟内存
简化读写内存
在程序装入运行时,都需要在内存中分配空闲区域,但空闲区域位置不确定而在程序编写时访问数据和指令跳转的目标地址基本都是确定的,为程序编写造成一定的复杂性,如果有了虚拟内存,我们只需要关心虚拟内存的起始地址,至于虚拟内存映射的物理内存就交给系统管理(CPU中的 mmu单元管理)
隔离地址空间
-
防止bug程序因为意外停止运行就有可能影响到正常运行的其他程序
-
防止恶意程序可以随意修改别的程序
如何提高内存使用效率
分段
将一段程序所需的内存空间大小的虚拟空间映射至物理空间中,此方法可以完成确定运行地址以及隔离地址空间的目的但是在内存的使用效率上并没有提升,换入换出的成本过高,粒度比较大
分页
分页就是将地址空间分配为固定大小的页,每一页的大小由硬件,操作系统来决定大小。硬件决定支持多种大小的页, 操作系统决定具体页的大小。
在早期的Apple设备中,每个页的大小为 4KB;基于 A7 和 A8 处理器的系统为 64 位程序提供了 16KB 的虚拟内存分页和 4KB 的物理内存分页;在 A9 之后,虚拟内存和物理内存的分页大小都达到了 16KB。
在页映射模式下CPU发出的是 Virtrual address (虚拟内存地址)。经过 MMU 转换以后变成了 Physical Address。一般MMU都集成在CPU内部。
遗留问题
- MMU内部是如何工作的
- iOS中是如何管理物理内存的
引用
- 《程序员的自我修养-链接装载与库》