V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tsohgdivil
V2EX  ›  Apple

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

  •  1
     
  •   tsohgdivil · 88 天前 · 3717 次点击
    这是一个创建于 88 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    48 条回复    2024-02-01 16:39:53 +08:00
    beijing999923
        1
    beijing999923  
       88 天前 via Android   ❤️ 1
    个人不认为虚拟内存有用,安卓的内存扩展都是面子工程
    ShadowPower
        2
    ShadowPower  
       88 天前   ❤️ 13
    让用户用得太舒服会影响新款销量
    Worldispow
        3
    Worldispow  
       88 天前   ❤️ 6
    你应该这么问:
    为什么 mac os 支持虚拟内存,ios 不支持虚拟内存?
    mac os 的虚拟内存是不是面子工程?
    shenjinpeng
        4
    shenjinpeng  
       88 天前
    感觉还是国产 App 普遍更加臃肿吧,外国佬体会不到 舍不得加内存
    wclebb
        5
    wclebb  
       88 天前
    我第一个想法是:交换内存会不会耗电。
    july1995
        6
    july1995  
       88 天前 via Android
    ios 应该是支持虚拟内存的,杀后台应该和策略有关,内存吃紧的时候,苹果觉得你一个第三方 app ,我内存不足,我就要把你杀掉,对于一些优先级高的系统应用,实在是不能杀了,我就虚拟内存应个急。通常情况下,苹果会优先杀掉第三方 app ,提升自己的流畅度。 毕竟虚拟内存 速度还是要差得多。
    ShadowPower
        7
    ShadowPower  
       88 天前
    @wclebb 会,但是比重新启动应用的耗电低
    yyzh
        8
    yyzh  
       88 天前
    看网上拆解苹果有些型号的 iphone 用的是 qlc 储存芯片.如果开启虚拟内存的话性能不行的.
    darkengine
        9
    darkengine  
       88 天前
    我有一台 iPhone X 测试机,没有微信支付宝,现在还纵享丝滑
    LUO12826
        10
    LUO12826  
       88 天前
    稍微纠正一下,op 想说的其实是 swap ,硬盘交换区,而不是虚拟内存。
    听说配备 M 系芯片的 iPad 已经有 swap 了。早前也有人说越狱后发现 iPhone 也有 swap ,不过不知真伪。
    wangsd
        11
    wangsd  
       88 天前
    苹果没有吗?我的 iPhone 容量快用完就会很卡,我一直以为有的呢。
    RickRobust
        12
    RickRobust  
       88 天前   ❤️ 7
    其实是有的,最大是 640MB ,路径在/var/vm/swapfile[0-4],具体见 https://github.com/apple/darwin-xnu/blob/main/osfmk/vm/vm_compressor_backing_store.c#L138
    他是写死在 kernel 的,可能内核级越狱也许可以改,所以就是几乎不可能(除非还在用 a11 之前的设备)。
    1014982466
        13
    1014982466  
       88 天前
    iOS 一直是有 swap 的,我没记错 iOS4 时代就有了吧,当时越狱后还可以改大小
    superrichman
        14
    superrichman  
       88 天前
    会影响库克割韭菜
    podel
        15
    podel  
       88 天前
    映像中不知道什么地方看到说 iphone 有冻结机制来着。会把内存里面的后台程序直接冻结保存到机器的存储里面。
    恢复的时候 在载入回去。
    tsohgdivil
        16
    tsohgdivil  
    OP
       88 天前
    @podel 这个好像是需要应用主动去支持的。但是只能回复那些好序列化的状态,像视频通话,游戏这些肯定没法通过这种机制去恢复
    123test1010
        17
    123test1010  
       88 天前
    你是不是对虚拟内存有什么误解,直接问 GPT ,都告诉你 IOS15 开始就引入了类似 macros 的内存交换。但是参考 macOS 的活动监视器-内存信息,内存分了很多种,实际内存、实际专用内存、实际共享内存、可清除内存等。只关心实际专业内存即可,这个是 app 自身必须占用的物理内存,其它内存的数据可以用来被随便释放,而不会导致 app 本身程序崩溃。你以为的虚拟内存就是替代物理内存,来供 app 当作物理内存用呢?本质上虚拟内存只能用来存放一些不重要的数据,可以理解为可持久化的非重要数据,用作交换。
    benjaminliangcom
        18
    benjaminliangcom  
       88 天前
    安卓很多也是 ZRAM 吧,iOS 应该是有对应的内存压缩技术的
    vcn8yjOogEL
        19
    vcn8yjOogEL  
       88 天前
    储存 Swap 比内存慢得多, 只适合存放长期冻结的 App, ZRAM 早就在用了

    正常情况下 App 是应该记录当前状态的, 就算被杀掉也可以返回上次所在页面, 游戏则应该持续自动存档, 确保随时可以中断
    wanguorui123
        20
    wanguorui123  
       88 天前
    主要还是耗电,其次是虚拟内存只能作为应急不能作为首选
    jeesk
        21
    jeesk  
       88 天前 via Android
    被杀主要是优先级不高。
    bkmi
        22
    bkmi  
       88 天前 via Android   ❤️ 1
    @beijing999923 细说一下面子工程?
    shutongxinq
        23
    shutongxinq  
       87 天前 via iPhone
    @yyzh iPhone 现在为止还没用 qlc
    ShadowPower
        24
    ShadowPower  
       87 天前
    @wanguorui123
    两个问题:
    如果内存足够用,以至于从未发生过缺页中断,那么耗电从何而来?
    如果内存不够用,为什么重新启动应用比换页省电?
    noahhhh
        25
    noahhhh  
       87 天前 via Android
    iPadOS 支持 swap ,iOS 只有 zram 。
    With Virtual Memory Swap, iPad storage can be used to expand the available memory for all apps, and delivers up to 16 gigabytes of memory for the most demanding apps, helping to make multitasking absolutely seamless.

    https://www.apple.com/hk/en/newsroom/2022/10/ipados-16-is-available-today/
    noahhhh
        26
    noahhhh  
       87 天前 via Android
    我是觉得手机上 swap 是没什么意义,大部分手机都是在内存不够用前处理器就该淘汰了。唯独苹果设备比较奇葩,苹果设备高 U 低内存的配置,
    noahhhh
        27
    noahhhh  
       87 天前 via Android
    @noahhhh 手滑。swap 增加的额外耗电和性能损耗非常不划算,影响用户体验,内存大一点对成本也没什么影响。只是 iOS 设备刚发布时候内存就是将将够用的状态,发布会大吹特吹的 3A 游戏如果画质稍高点就会因为内存不足而闪退,现在流行的原神和星铁在 4G 内存设备上也是会闪退。与其问为什么不支持 swap 不如骂内存扣扣搜搜。
    wanguorui123
        28
    wanguorui123  
       87 天前
    @ShadowPower Mac 和 iPad 正常内存不够时才会大量使用 swap ,平时非常冷的数据也会用 Swap 作为冷内存使用,你要明白 Swap 只能作为应急(紧急)内存而不是常驻活动内存,因为频繁使用 Swap 非常影响性能导致系统卡顿,手机上频繁调用硬盘 Swap 比较费电,看看 iPhone 的电池容量就知道了 iPhone 的电池容量相对都很小,iOS 应用切换到后台休眠时也没有完全 Swap 掉这部分休眠 App 的内存到硬盘而是保留在内存,导致低内存 iPhone 一开相机就杀掉,其实也是为了省电和减少电池容量,其实 iOS 提供一套后台恢复机制保证用户体验但是国内的 App 大部分都没采用。
    wanguorui123
        29
    wanguorui123  
       87 天前
    @ShadowPower Android 手机就不一样了,力大砖飞,内存不够就加到 24G ,电池不够就加到 5000mA ,如果还是耗电就强制 App 休眠对齐唤醒,推送也耗电那就统一推送服务
    ShadowPower
        30
    ShadowPower  
       87 天前
    @wanguorui123 不是 Swap 不耗电,只是凡事都需要对比,哪种方案更耗电。

    如果内存不足以维持前台应用正常运行,那么其实已经完全没法用了,就像当年 iPhone 6 玩王者荣耀结算界面闪退,iPhone 8 玩原神玩一半闪退( 1.0 版本还不给玩,1.1 给了)
    这是更糟糕的用户体验……

    这时候如果有 Swap 可以用,至少能维持应用正常运行。

    如果只是用来存储后台应用,那么,内存不足的场景下(充足的时候就没有区别了),如果有 Swap ,应用的内存会存储到 SSD 里,如果没有,应用就会被杀掉。

    有 Swap 的时候,当你切换回这个应用,系统只需要从硬盘里读取数据到内存中,然后一切状态都恢复了。程序本身不需要做任何初始化工作,约等于给所有应用都适配了状态恢复。

    如果没有 Swap ,考虑当下现实情况,比如你切换到微信,却发现还需要看地球。
    这时候应用还要额外做初始化工作,加载本地存储的持久化数据,创建各种对象,生成界面元素等等。此过程不但需要从硬盘读取数据,还需要做不少计算。完毕之后,用户还要操作 APP ,点开之前使用的界面。
    耗电只会比有 Swap 的情况更多。

    还有,你所谓的后台恢复机制,实际上也许和你想象中有出入。如果你想象中就像 Swap 那种样子,应用的内存全部保存起来,下次打开就会读取,那它还真不是这样。
    iOS 6 之前没有这个东西,不过有墓碑机制。iOS 6 之后有个 UI 状态读取和恢复的 API ,但是其他应用数据都要自己保存。
    后来苹果还改过这套 API 。后面我不做 iOS 开发了,不太熟悉……

    其实并不是那种“整个 APP 数据完整保存下来”的机制。

    只不过它可以缩短初始化的流程,能用之前的数据直接去创建应用界面和各种对象,还能让用户省去打开之前使用的界面的操作。让用户感觉“一点开应用就接着上次没看完,没用完的地方继续操作”,就像现在的 VSCode 、JetBrains IDE 那样。


    最后,在 Android 上开启和关闭这玩意很简单,虽然代码实现不太一样,但是目的基本一样。我并没有发现它会造成可感知的续航缩短。比如开启之前我能用一天半,开了之后只能勉强用一天。实际上没这个现象。
    wanguorui123
        31
    wanguorui123  
       87 天前
    @ShadowPower 切换到后台后应用整体 Swap 缓存下来意义不大,如果用户频繁切换应用,卡顿感非常明显,不如重新加载,至少用户感觉 App 在动,就像开车一样,车子在动总比堵车感受要好点
    wanguorui123
        32
    wanguorui123  
       87 天前
    @ShadowPower 像微信/美团这种体量 App ,如果内存要 Swap 4G 以上,Swap 恢复估计要 7-8 秒吧,主屏卡顿无法操作 7-8 秒,用户肯定忍受不了,而低内存占用的 App 可以做 Swap 估计 1-3 秒就恢复现场,但是 Apple 并没有针对性的优化,可能 Apple 觉得这部分 App 不如重新加载来的快
    ShadowPower
        33
    ShadowPower  
       87 天前
    @wanguorui123 不会有那么夸张,原神占用的内存大小都没有 4GB……
    如果 APP 真的占用了 4GB ,当前任务所需要的活跃内存也不会达到 4GB 。

    还有大多数程序内存数据,除非是图片、音频等资源,其实都很容易压缩。其实可以设计成两级,先进入内存压缩,再进入闪存。

    对于难压缩的数据(可以试着压缩开头的一小块,算一下压缩率)可以直接进闪存。

    实际上不用等待 7~8 秒。如果真的要那么久,往往应用从头加载也会那么久……
    SenLief
        34
    SenLief  
       87 天前
    请直接购买 pro max 并每年一更新手机。
    GPT9
        35
    GPT9  
       87 天前   ❤️ 1
    @Worldispow 笑死,一楼 CPU 烧了。
    wanguorui123
        36
    wanguorui123  
       87 天前
    @ShadowPower 即便是 2G 占用也很花时间而且部分是内存泄露这么大的,其次内存是碎片化的读取到硬盘和重新恢复到内存都花时间和电量,远远没你想的那么简单,操作系统一次恢复这么大的内存也是负担
    ShadowPower
        37
    ShadowPower  
       87 天前
    @wanguorui123 内存泄漏的部分其实永远都只会在闪存里,平时看起来就像普通的文件一样。

    既然是泄漏的内存,那就是程序没有办法访问或者有办法但代码逻辑里却不用的。
    不读写这块内存,就不会发生缺页中断,不会发生换页操作。

    我没有说换页不需要时间和电量,但是禁用 Swap 把应用杀了只会花费更多的时间(包括展示广告、用户操作的时间)和电量。

    如果用户体验真的更好,这个帖子就不会存在了。
    ShadowPower
        38
    ShadowPower  
       87 天前
    @wanguorui123 内存碎片也不会延长 Swap 的时间,那些不能利用的内存空间实际上也不会访问到,不访问的页面都不会触发 Swap 。

    只考虑当前的问题时,和内存泄漏可以一块讨论,它们都只是看起来大(向系统申请的内存多,用任务管理器看着大),实际用的小而已。

    当前任务真正用的那部分实际有多大,才决定对性能的影响有多大。
    iOCZS
        39
    iOCZS  
       87 天前
    iOS 上没有 Swap 机制.(1.移动设配的闪存容量有限 2.闪存的写次数有限,频繁写会降低寿命)
    当然目前 1 已经不是什么大问题了,想当年 8g,16g 的确膈应人
    geeksammao
        40
    geeksammao  
       87 天前 via iPhone
    @ShadowPower 其实你应该问的是为什么两大移动端 OS 在设计之初都没考虑采用 swap 机制,而且到了今天也只有个别国产厂商开始采用。
    ShadowPower
        41
    ShadowPower  
       87 天前
    @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
        42
    Hsinyao  
       87 天前 via iPhone
    虚拟内存( virtual memory )和 swap 是两个东西
    ShadowPower
        43
    ShadowPower  
       87 天前
    @Hsinyao
    英文版 Windows 的 Swap 还真叫 Virtual Memory……
    不过无所谓了,已经能根据语境来区分它的含义了。
    wanguorui123
        44
    wanguorui123  
       87 天前
    @ShadowPower
    我总结下 Apple 可能不在 iPhone 上用 Swap 的原因:
    1. 占用内存小的 App 不需要 Swap 恢复 App ,Swap 效率可能不如直接重新初始化 App 快
    2. 占用内存大的 App 不需要 Swap 恢复 App ,Swap 压缩内存可能更慢更费电,恢复时申请大内存可能导致系统内存爆掉出现申请失败的问题,部分泄漏内存也不好处理加不加载到物理内存中是个问题
    3. Swap (虚拟内存)适合低频率高负载下应急场景而不是作为 App 的运行时的必要选项,像 iPhone 这样的设备不会优先考虑,那不如直接加 RAM 或者 电池,但 Apple 又舍不得加这些,这些一旦加上去苹果的利润可能又要缩水,变成新一代钉子户,你看哪代加内存的 iPhone 不是钉子户
    neiltroyer849
        45
    neiltroyer849  
       87 天前
    @RickRobust 长知识了。原来 XNU kernel 里还有这个 trick 。感谢
    RickRobust
        46
    RickRobust  
       87 天前   ❤️ 2
    @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
        47
    cpper  
       86 天前
    1 ios 上有虚拟内存;只不过没有 swap ,只有 compress 。
    2 不仅 ios 这样,安卓也是这样,移动端之所以不 swap ,最主要的原因就是频繁 io 会增加带宽和耗电,这是移动端最敏感的。
    vhwwls
        48
    vhwwls  
       86 天前
    岔个题,我看到标题还在想现在还有操作系统不支持虚拟内存机制的吗,点进来才发现果然说的是 swap ,这个严格来说不叫虚拟内存
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   907 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:08 · PVG 06:08 · LAX 15:08 · JFK 18:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.