@
neiltroyer849 谢谢
我再补充一下,不管是 apple 怎么称呼扩展内存的技术(毕竟 apple 在 m 系列的 ipad 才在正式引入“swap”这个词),在内核层面所有的 ios 设备都跟 macos 一样存在 swap 这个东西的,对应 vm swap subsystem ,可以直接去看源码。
从中可以清晰看到 ios 最多创建 5 个 swapfile ,每个 128MB ,也就是最高 640MB ;而 macos 可以创建 100 个,也就是 12800MB 。考虑到 apple 声称自己的内存压缩技术可以达到两倍的效率,上面的数字可以乘 2 。从代码看虽然二者的 vm swap subsystem 实现逻辑存在一定的差异,我毫不怀疑 ios 同样可以实现 macos 所谓 8g 当 16g 使用的体验的,但实际上 apple 只是把它当成了一个 backup ( 640M 实在是太小了),功耗可能是一个考量,更重要的我觉得还是刀法,毕竟安卓已经用了好几年了(至少五年或更早前就存在了,只是当时还没有被厂商作为宣传噱头),也很少有 report 讲 swap 开启前后功耗开销问题,这个东西如果做大对 apple 来说就是改个宏的事儿,大不了做个开关也行,但事实上他们没有。
至于 m 系列 ipad 引入的所谓 swap ,我没有深入了解,看起来是为了管理应用对大内存的需求而独立设计的另一套系统,有专门的 api ,比如所有应用内存管理本身还是受 jetsam 监督,而走这个 api 就可以 bypass 掉,以及专用 api 可以实现更灵活的内存管理,带来更好的能效收益。
总之,内核的 swap 和 apple 最近 claim 的 swap 我觉得还是两码事儿,前者强调的是应用内存数据的留存,可以理解为后台挂更多的应用,但每个应用能管理的内存还是有限的;后者强调单个 app 可以管理更多内存,比如剪辑视频,在管理过程中当然同样允许换出到外存。
手里有一台 2 代 ipad pro 12.9 ,强开了台前调度体验还是很不错,美中不足的就是后台的问题,过年回家无事我打算研究一下怎么基于 checkra1n 修改 xnu 破掉这个限制,比如在 kernel 启动前覆盖
https://github.com/apple/darwin-xnu/blob/main/osfmk/vm/vm_compressor_backing_store.c#L138 这个宏对应的值;或者启动后找机会覆盖 vm_num_swap_files_config 这个值。。
个人见解,欢迎大佬纠错补充。