iOS内存压缩换出专题1-总览
背景:
在手机、平板、智能手表、电脑等嵌入式设备中,更大的内存通常意味着更强的应用保活能力,能够减少后台应用被查杀概率,从而带来更好的用户体验。然而,内存是一种宝贵的有限资源,更大的内存也通常意味着更高的成本。那么如何利用更少的内存获取更强的应用保活能力呢? 在现代智能消费电子产品的操作系统中,无论是iOS、Android或者鸿蒙,在其内存子系统中都有一个压缩换出模块,其目的就是使用更少的内存获取更流畅的体验或者说更强的应用保活能力。
压缩:
当设备内存不足时,系统会将部分不活跃的匿名内存页进行压缩并存储到压缩池中,在需要时再由缺页路径将其解压恢复。压缩后存放在压缩池中的匿名压缩页还是存储在内存中,只是占用空间更小,从而实现节约内存的目的。
换出:
设备可以把已压缩的匿名页内存页进一步换出到外部磁盘如UFS中,以进一步腾出可用的内存空间。结合前面的压缩,总的来说压缩换出的路径可以总结为:不活跃匿名页->压缩,存储在压缩池中->将已压缩内存块换出到磁盘中。
iOS内存子系统压缩换出机制:
iOS的压缩换出主要通过内核的6类线程协作完成:VM_compressor线程、VM_Freezer线程、VM_swapout线程、VM_cswap_trigger线程、VM_swapfile_create线程和VM_swapfile_gc线程。它们的协作关系如图,其中各个线程的作用如下:
(1)VM_compressor:通用压缩线程,压缩不活跃匿名页,通过该线程压缩的匿名页在iOS上通常不会被换出;
(2)VM_Freezer线程:应用冻结压缩线程,选择后台应用将其匿名页压缩到连续的压缩段中并放入换出队列,随后被VM_swapout线程换出,此外应用冻结后还会提升应用的优先级以减少被查杀的概率;
(3)VM_swapout线程:负责将换出队列上的压缩段换出到磁盘;
(4)VM_cswap_trigger线程:对压缩池中压缩段进行空洞整理以及合并压缩段;
(5)VM_swapfile_create线程:在交换文件或空间不足时创建交换文件,同时兼顾批量释放交换文件槽位的功能;
(6)VM_swapfile_gc:对已换出到磁盘中的稀疏段进行碎片整理,实际是将稀疏段换入到压缩池然后调用minor_compaction进行空洞挤压,此外也进行swapfile中压缩段的合并,将存放较少换出压缩段数量的swapfile中的压缩段迁移到其它swapfile中从而释放空闲的swapfile;


浙公网安备 33010602011771号