iOS技术帖

关于iOS内存优化--虚拟内存概览

2016-05-31  本文已影响608人  梦里落花Daniel

虚拟内存允许操作系统避开物理RAM的限制。虚拟内存管理器为每个进程创建一个逻辑地址空间(或者虚拟地址空间)并且将它分配为相同大小的内存块(可称为页)。处理器与内存管理器单元(MMU)维持一个页表来映射程序逻辑地址空间到计算机RAM的硬件地址。当程序的代码访问内存中的一个地址时,MMU利用页表将指定的逻辑地址转换为真实的硬件内存地址。这种转换自动发生并且对于运行的应用是透明的。

就程序而言,在它逻辑地址空间的地址永远可用。然而,当应用访问一个当前并没有在物理RAM中的内存页的地址时,就会发生页错误。当这种情况发生时,虚拟内存系统调用一个专用的页错误处理器来立即响应错误。页错误处理器停止当前执行的代码,定位到物理内存的一个空闲页,从磁盘加载包含必要数据的页,更新页表,之后返回对程序代码的控制,程序代码就可以正常访问内存地址了。这个过程被称为分页。

如果在物理内存中没有空闲页,页错误处理器必须首先释放一个已经存在的页从而为新页提供空间。由系统平台决定系统如何释放页。在OS X,虚拟内存系统常常将页写入备份存储。备份存储是一个基于磁盘的仓库,包含了给定进程内存页的拷贝。将数据从物理内存移到备份存储被称为页面换出;将数据从备份存储移到物理内存被称为页面换入。在iOS,没有备份存储,所以页面永远不会换出到磁盘,但是只读页仍可以根据需要从磁盘换入。

在OS X and iOS中,页大小为4kb。因此,每次页错误发生时,系统会从磁盘读取4kb。当系统花费过度的时间处理页错误并且读写页,而并不是执行代码时,会发生磁盘震荡(disk thrashing)。

无论页换出/换入,磁盘震荡会降低性能。因为它强迫系统花费大量时间进行磁盘的读写。从备份存储读取页花费相当长的时间,并且比直接从RAM读取要慢很多。如果系统从磁盘读取另一个页之前,不得不将一个页写入磁盘时,性能影响会更糟。

上一篇下一篇

猜你喜欢

热点阅读