17.虚拟内存
一、物理内存
早期计算机系统的内存地址都是物理地址。
1.1 内存不够用
应用程序会被完整加载到内存中,大量浪费空间。

1.2 物理地址不安全
可以直接访问内存地址实现跨进程,访问其他应用程序的进程。

物理内存中的数据不会清除,只覆写:这个过程是系统控制的,新的需要存进物理内存的数据,会被写入最不活跃的区域中。应用在后台可能被kill掉的原因之一就是被覆写了。
二、虚拟内存
2.1 虚拟页表
应用程序进程内拿到的地址并不是真实的地址,会通过虚拟页表映射到物理内存。
iOS一页数据16kb
Mac4K,可以在终端中使用PAGESIZE,命令获取
2.2 内存优化
应用程序不会完整的加载,当用到某一页数据的时候,才会被加载到物理内存中。

流程:
- 系统和CPU配合进行地址翻译 - 硬件中MMU(内存管理单元)进行地址翻译 - 非常快 
- 高速缓存 - 映射过的会被缓存不会重复翻译 
 
 
- 找到物理地址 
 
- 将数据加载进物理内存或读取 
2.3 ASLR
ASLR 每次启动为 虚拟页表 添加随机的偏移值,已获得更高的安全性。
三、 缺页中断
由于 虚拟页表 的存在,在我们代码访问的数据 page 没有被加载进内存的时候,就会出现 PageFault 缺页中断。而大量的缺页中断会影响应用的启动速度。
而我们可以通过 二进制重排 对数据在 MachO 中的分页布局进行优化,使启动时相关的数据尽量在连续的 page 中,来减少 Page Fault 的次数。
这里我有进行一次相关的实战:二进制重排实践
Last updated
Was this helpful?