为什么 iOS 不支持虚拟内存?

2024 年 1 月 30 日
 tsohgdivil

iPhone 那么小的内存,最近几个 iOS 更新以后杀后台现象越来越严重,有时候我后台挂个视频通话切到其他应用,都能把我视频通话给杀了。相机应用更是重量级,基本上进个相机可以把所有其他后台应用都杀掉。

MacBook 8G 尊享版好歹还能用 SSD 寿命换一下使用体验,为啥 iPhone 又不给大内存,也不支持虚拟内存呢?

6576 次点击
所在节点    Apple
48 条回复
ShadowPower
2024 年 1 月 31 日
@geeksammao
其实还真有,以前 HTC 的系统就默认开启 Swap ,虽然只有 16MB 。
以前的第三方 ROM 里,有一个叫乐蛙的 ROM ,默认还给了 32MB 的 Swap 。
印象中当时我手头的 Android 设备内存容量是:128MB 、256MB 。内部存储空间 4GB 、8GB 。
这个大小今天看起来小,不过在当时还算可以。

其他的系统我没怎么用过,那些长得太像原生 Android 的估计还真没有,而那些宣称“深度优化”的估计有。

iOS 早期版本有墓碑机制,虽然不是同一种东西,但其实理念比较相似。
iOS 会限制一个 APP 只能用系统总内存的 1/4 ,超过就干掉。如今也有,但是限制放得很宽,iPadOS 限制非常宽。

所以前台应用都用不到 Swap 。
后台应用的内存数据其实会保存到闪存上,切换时再加载到内存。

后来大家都有了内存压缩,于是内存压缩就成了主流了。

如今的各厂商的“内存扩展”背后的技术其实是 zRAM Writeback ,在 Android 上可以 root 之后用 Scene 4 看到。
Hsinyao
2024 年 1 月 31 日
虚拟内存( virtual memory )和 swap 是两个东西
ShadowPower
2024 年 1 月 31 日
@Hsinyao
英文版 Windows 的 Swap 还真叫 Virtual Memory……
不过无所谓了,已经能根据语境来区分它的含义了。
wanguorui123
2024 年 1 月 31 日
@ShadowPower
我总结下 Apple 可能不在 iPhone 上用 Swap 的原因:
1. 占用内存小的 App 不需要 Swap 恢复 App ,Swap 效率可能不如直接重新初始化 App 快
2. 占用内存大的 App 不需要 Swap 恢复 App ,Swap 压缩内存可能更慢更费电,恢复时申请大内存可能导致系统内存爆掉出现申请失败的问题,部分泄漏内存也不好处理加不加载到物理内存中是个问题
3. Swap (虚拟内存)适合低频率高负载下应急场景而不是作为 App 的运行时的必要选项,像 iPhone 这样的设备不会优先考虑,那不如直接加 RAM 或者 电池,但 Apple 又舍不得加这些,这些一旦加上去苹果的利润可能又要缩水,变成新一代钉子户,你看哪代加内存的 iPhone 不是钉子户
neiltroyer849
2024 年 1 月 31 日
@RickRobust 长知识了。原来 XNU kernel 里还有这个 trick 。感谢
RickRobust
2024 年 1 月 31 日
@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 这个值。。


个人见解,欢迎大佬纠错补充。
cpper
2024 年 2 月 1 日
1 ios 上有虚拟内存;只不过没有 swap ,只有 compress 。
2 不仅 ios 这样,安卓也是这样,移动端之所以不 swap ,最主要的原因就是频繁 io 会增加带宽和耗电,这是移动端最敏感的。
vhwwls
2024 年 2 月 1 日
岔个题,我看到标题还在想现在还有操作系统不支持虚拟内存机制的吗,点进来才发现果然说的是 swap ,这个严格来说不叫虚拟内存

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1012768

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX