iOS 中的虚拟内存和物理内存
2020-12-28 本文已影响0人
just东东
iOS 中的虚拟内存和物理内存
1. 虚拟内存和物理内存
1.1 起源
在早期的计算机中我们使用的都是物理内存。
- 但是随着应用的强大,软件发展的迅速,应用所需要的内存越来越大,但是用户不一定用到应用的所有功能,把整个应用加载到内存会浪费很多内存。
- 另外我们直接访问物理内存也造成了很多安全隐患,容易引起不同进程之间的不安全访问,比如修改其他进程的数据,读取其他进程的数据进行数据窃取。
- 还有程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32,也就是4G。
所以我们引入了虚拟内存的概念。
- 通过映射表对虚拟内存和物理内存进行映射,从而达到访问内存的目的。CPU的Memory Management Unit(MMU)硬件 进行虚拟内存和物理内存的映射。此操作由操作系统管理。
- 内存映射表,一个表16k(iOS),MacOS是4k,Linux也是4k。可通过终端输入PAGESIZE进行查看。输出为字节数。
- 缺页中断(Page Fault),当虚拟内存访问的数据不再内存时,操作系统会阻塞当前进程把需要访问的数据加载到物理内存上。当物理内存不足操作系统就会覆盖其他进程的内存段来存放当前需要访问的数据。不同操作系统有不同的算法来实现该机制。iOS在把数据加载到当前页的时候还需要签名校验,每一次缺页中断的时间时0.6-0.8(抖音团队测试的结果),0.1-1(来自Hank大佬的测试) 单位:ms(毫秒)。
所以虚拟内存就解决了内存安全和内存不够用的问题
ASLR(Address space layout randomization)
虚拟内存把程序的运行地址都固定了,从而造成了有一个安全隐患,所以就引入了ASLR技术,在程序运行前给其分配一个随机的起始地址,经过计算得到实际内存地址。程序每次启动都不一样,所以就更加安全了。
虚拟内存工作原理图:
内存分页原理图: