17.虚拟内存
一、物理内存
早期计算机系统的内存地址都是物理地址。
1.1 内存不够用
应用程序会被完整加载到内存中,大量浪费空间。
1.2 物理地址不安全
可以直接访问内存地址实现跨进程,访问其他应用程序的进程。
物理内存中的数据不会清除,只覆写:这个过程是系统控制的,新的需要存进物理内存的数据,会被写入最不活跃的区域中。应用在后台可能被kill掉的原因之一就是被覆写了。
二、虚拟内存
2.1 虚拟页表
应用程序进程内拿到的地址并不是真实的地址,会通过虚拟页表
映射到物理内存。
iOS
一页数据16kb
Mac
4K
,可以在终端中使用PAGESIZE
,命令获取
2.2 内存优化
应用程序不会完整的加载,当用到某一页数据的时候,才会被加载到物理内存中。
流程:
系统和CPU配合进行地址翻译
硬件中MMU(内存管理单元)进行地址翻译
非常快
高速缓存
映射过的会被缓存不会重复翻译
找到物理地址
将数据加载进物理内存或读取
2.3 ASLR
ASLR
每次启动为 虚拟页表
添加随机的偏移值,已获得更高的安全性。
三、 缺页中断
由于 虚拟页表
的存在,在我们代码访问的数据 page
没有被加载进内存的时候,就会出现 PageFault
缺页中断
。而大量的缺页中断会影响应用的启动速度。
而我们可以通过 二进制重排
对数据在 MachO
中的分页布局进行优化,使启动时相关的数据尽量在连续的 page
中,来减少 Page Fault
的次数。
这里我有进行一次相关的实战:二进制重排实践
Last updated