iOS 之苹果运行机制总结

2023-11-06


解释一下iOS内存机制,为什么iOS的RAM一直都是最少的但iOS却又是最最流畅的。

大神请直接忽略此帖,仅希望小白们看过后不会再因为担心iPad内存不足而到处纠结1G RAM 2G RAM了那档子事了...这些帖子楼主看得眼睛都疼了......

楼主不会搬一堆名词术语贴出来吓唬人,各位注意几个关键名词与概念就行:
1.活跃内存
2.非活跃内存
3.墓碑机制
4.RAM是内存,储存空间是外存

注意这些这些就够了,好了楼主要开始吹牛了。


先明白一个基本概念,iOS和Mac OS都是基于UNIX开发的系统,这和windows有着很大的不同,包括内存机制,这便是为何不能拿windows的使用习惯来看待iOS。另外要注意,iOS没有系统缓存。

首先看看内存的意义何在。内存的介质就是高速闪存,它比外存的速度要快不少。通过将程序加载到内存后让处理器在一个更快的读写环境下处理数据,从而提升系统性能。
还要先明白的是内存仅是让软件流畅运行的条件之一,处理器才是决定性因素。内存就好比瓶子的容量,处理器就是瓶颈,瓶子里装再多水瓶口不够大那水流的依旧很慢。


在iOS中,撇开联动内存和可用内存不讲,所有在内存里的程序都是被标记为活跃内存或者非活跃内存的。

活跃内存可以先简单理解为正在前台运行的软件以及刚退出不久的软件所占用的内存,这些数据是当前最活跃的(读写频率最高的)。
而非活跃内存即是系统记录的你经常使用的软件所占用的内存,当前处理器并没有读取它们,但它们仍然被放在内存里处于“待命”状态,方便你下一次使用这些软件时处理器能直接从内存读取数据,而不必花费更多时间先从外存调到内存再读取。




重点在这,当iOS检测到你当前运行的软件需要更多活跃内存时(实际上软件向处理器请求更多内存),系统会选择性地释放掉后台软件占用的非活跃内存,转而提供给当前软件。如何释放是根据你的使用习惯来定,比如你经常用QQ,其次是微信。那么当前台内存不足时系统会优先释放掉微信占用的内存,若还不够则继续释放QQ所占用的内存。

可以假设,如果有个软件占用的内存大到要占满整个RAM,那么系统则会释放掉所有非活跃内存全部提供给这个软件使用。这便是为何你不用担心玩游戏什么的会因为内存不足而卡顿了,因为只要这个游戏有需要,就算是需要所有内存系统都会马上提供给你,不过你若不玩这游戏了那这些内存又会马上提供给其他程序。

这种内存释放机制是有“预见性”的,并非只在内存不足时临时释放。iOS会根据你的使用习惯等数据来分析,在你打开一个软件时立即准备足够内存供其使用,若该软件运行时又需要更多内存才会临时释放更多。iOS7甚至能根据你的使用习惯来预先加载常用软件,所以iOS用的时间越长就越顺手。(当然,记录用户使用习惯这种特性并不是只有苹果才有)

而且iOS的内存管理十分严格,任何第三方App都没有权限直接调用设备上的硬件,也就是说内存分配与释放都是处理器说了算,任何第三方软件都没有权限去占用固定内存(除非越狱),不会出现例外。自然就不会像windows里一些不规范软件那样,程序已经关闭连但内存还一直占着。

这便是区别所在,iOS里所有第三方程序都不可能一直占用内存,一旦系统需要更多的活跃内存,就会强制释放后台非活跃内存提供给前台。而windows不同,一个在运行的软件你若不关闭它就会一直在内存里运行。



既然iOS里的程序不可能一直占着内存,那iOS岂不是没有“后台运行”这一说法了么?iOS也的确不能后台,不像windows那样能一边前台看着电影一边后台干着其他事情。

事实上,在iOS内,当一个软件从前台转入后台后5秒内便会完全停止运行,极少数特殊软件能运行10秒,某些需要后台下载功能的软件在转入后台后也最多继续下载10分钟。这就是某种意义上所谓的的“伪后台”。

我们现在用着的后台功能大概就是这么个尿性。这里楼主要借用一下Windows phone里的一个名词——墓碑机制。

何为墓碑机制?好比大家能从楼主的墓碑上了解到楼主活着时是个什么鸟样,但楼主这个鸟人其实已经挂了。也就是说当一个程序被系统从内存移除后,系统允许这个程序给自己立个“墓碑”,记录自己“生前”的样子,等你要让这些程序“复活”的时候,系统会照着它墓碑上那鸟样给他重新加载到内存里去。“墓碑”状态下的程序们不会占用CPU,不会占用内存,甚至不会产生功耗。你们也能称之为“后台挂起”,差不多那个意思。

这就是为什么你长时间不用浏览器后再打开它时,你会发现页面重新加载了一次但网页并没有刷新,也是为什么iOS的后台功能需要软件的支持才能实现。iOS就是用这种方式实现的后台,同时又保证内存的。




综上所述,在iOS这样的内存管理机制下,你完全不必担心软件会因为分配到的内存不足而卡顿,因为任何软件被放在前台时都有权限向处理器要求尽量多的内存。

所以在iOS里,你完全没有必要去手动清理后台程序来释放内存,iOS会自动释放。相反iOS比你更“聪明”,它知道该释放哪些程序的内存,何时释放,释放多少,而自己手动清理内存完全是多此一举。

至于那些所谓的内存清理软件所列出的后台程序所占内存,那也并不是实际被占用的内存,多数都是那些程序所请求的内存大小。
楼主前面也说了,iOS里的软件是没有权限直接调用硬件的,那么内存清理软件又是如何实现清理内存功能的?当你使用内存清理功能时,它会一直向处理器请求尽量多的内存,处理器便尽量将后台里的内存释放出来供它使用,等它最大限度的获得了内存后,再自己释放掉自己占用的这些内存......这就完了。本质上讲,iOS的内存清理软件并不是“清理”了内存,而是先将其他软件“挤出”内存后再把内存让出来。

我们再反观内存的意义:是为了让CPU能更高效的读取数据,才将程序直接存放在内存里的。而你却秉着“让系统更快”的原则隔三差五把内存里的程序全抹掉,等你要用那些程序时系统还得先从外存调到内存然后才能开始读写,你说这是快了还是慢了?



最后可能有人会问楼主:虽然iOS这种机制能保证每个软件都最大限度地使用内存,但如果有个游戏所需要的运存超过了设备所配备的RAM那怎么办?
楼主要说的是,你觉得苹果会批准一个他们设备带不动的软件上架App Store么?

最后的最后,大的内存对于iOS来说也并非完全没有意义,起码这能为设备一个运行更大型的软件创造一些条件。但内存不是决定性条件,若苹果让iPad具备了运行更大型软件的处理能力,那自然会给它一个够用的内存。

如今的手机软件还没有哪个能一口气占满1G内存的。电脑上显卡的显存大家都知道吧?一个独立显卡,就算才512M的显存对90%的人来说都够了,而且电脑跑的还是x86游戏,ARM上的软件能占不了多少内存。

还有人一定肯定准备回楼主说:如果苹果加大内存然后换真后台的话不是更好吗?楼主只能说,安卓就是真后台,你可以同时运行几个软件,但你不得不牺牲一些流畅度。并且安卓给软件提供的权限太高,你在享受高度“自由”的同时却得防着流氓软件霸着你的内存不让。
所以在苹果有办法不影响到现在流畅度的同时提供真后台之前,你就只能接受这种后台。既然目前只能是伪后台那你觉得大内存的作用能多大呢。

楼主并没有说安卓和windows不好,而是说不同的机制都有不同的好处,但同时又有他们相对应的弊端。这些问题不是简单的好或不好就能评价的。

楼主是在解释为什么一味加大内存对iOS意义并不大,不是说让各位将就用久得了,在意配置的朋友要先了解哪些才是该在意。


iOS 7中,实际上APP拥有四种后台模式,无论是哪一种后台机制,均需要利用苹果给予的相应后台接口实现。新系统中,开发者可以灵活利用多种后台接口(API)实现更加智能的应用操作。

无后台仅推送

第一种后台方式为传统的无后台操作,仅有苹果推送机制,这种方式出现在iOS 3.x以下的大部分系统版本上。这个方式下,应用在按下Home键后即会关闭退出,其数据通过苹果搭建的推送服务器传输,并不需要应用后台运行。这种方式不太好的原因在于,每次推出后,重新进入均需要重新加载,虽然推送能够统一解决数据和信息的传输,但遇到需要频繁进入应用(如聊天APP)的时候便会显得体验不好。

墓碑式

第二种方式为墓碑式的后台机制,这在iOS 4后被大量采用,也就是人们所说的伪多任务。这方式相比较第一种改进的地方在于,按下Home键至主界面后,应用随即进入后台,但其被冻结,并不能进行任何操作。

智能调度后台

第三种为系统智能调度的后台,iOS 7新增的background fetch,这个后台接口在苹果WWDC 2013上有提及,其会根据用户行为自动调整达到效率最优的后台模式,能够处理不是很有时效性的信息获取。例如一些社交、新闻类的应用的后台信息更新,iOS系统便会根据应用启动频率、时间和当前网络和电量的状况来智能分配每个应用的后台获取频率和启动时长。

新闻类APP

由于拥有该接口的应用的数据后台刷新操作是统一调度的,因此系统可以在一个进程里面获得多个应用的数据,类似统一的推送机制,这样就能够最大限度地省电。不过这个方式也有一个缺点,那便是开发者不能设定数据具体什么时候更新,因此这个后台方式只能应用在一些时效性和敏感度不高的地方。

【iOS7后台机制详细解析】真后台

第四种方式便是真后台机制,但iOS的真后台与Android的后台机制是不一样的,为了兼顾系统体验和统一进程管理,iOS在这上面加入了众多的限制。大致拥有以下几个后台接口模式:

1、Background Audio,这是后台的音频,这个很早之前便有,也是iOS设备中用得最多的后台应用,调用这个接口可以实现后台的音乐播放。

2、Location Services,这是后台的定位,系统会拥有统一页面进行管理。

3、VoIP,后台语音服务,类似Skype通话应用需要调用,可进行后台的语音通话。

4、Newsstand,报刊杂志后台自动下载更新,其能够自动实时更新。

5、Background Task  Completion,这个接口早在iOS 4时候便拥有,其可以供任意类型的APP使用,不过在旧系统中,这个接口的后台限制运行时间仅为10分钟,意味着当应用退至后台,其后台运行仅能持续10分钟便会转至休眠状态。iOS 7中对这个接口作出了改变,原来的为连续10分钟,即不论你这10分钟内用户是否关闭屏幕进入休眠状态,应用仍然会在后台等待10分钟完结后推出,而新的改进为假如遇到关闭屏幕休眠的情况,这后台运行的10分钟便会跟随一同休眠,剩余的后台时间将会留待用户再一次唤醒设备才计算。这样后台运行的时间仍然为10分钟,但并不连续,这样做的优点为省电。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 之苹果运行机制总结 的相关文章

  • 内存的智能管理—智能指针

    前言 我们在使用C和C 进行开发的时候 申请堆区内存是必不可少的 但是很多时候 我们经常忘记释放他导致内存泄漏 从而导致程序崩溃 又或者在尚未使用完成的时候释放 从而导致出现野指针 都是非常危险的现象 所以我们在C 11的标准中提出了智能指
  • 最详细的前端二进制数据流

    一 数据类型 1 ArrayBuffer ArrayBuffer 的基本使用 ArrayBuffer 对象表示存储二进制数据的一段内存 他不能直接读写 只能通过视图 TypedArray 视图和 DataView 视图 来读写 是图的作用就
  • Yast: SSL certificate problem, verify that the CA cert is OK

    用Yast更新软件的时候发现没法更新 发现连不上SMT SERVER 总是报错说 SSL certificate problem verify that the CA cert is OK SSL routines SSL3 GET SER
  • 每天一练——C语言练习(4)

    不要懒 不要停 坚持刷题 目录 1 计算 1 2 1 4 1 n 设n是由键盘输入的正偶数 2 计算 1 1 1 3 1 n 设n是由键盘输入的正奇数 3 从终端输入3个数a b c 按从大到小的顺序输出 4 公安人员审问四名窃贼嫌疑犯 1
  • Flink任务日志写到kafka【最新1.12,1.13】

    这篇文章如果对你有帮助 记得点赞哦 有问题也可以给我评论 一 背景 公司的日志希望能够同一到一个Kibana去做一个同一的展示 那就需要将任务的日志写到kafka Flink1 12开始默认的日志框架就是log4j2 那么配置的方式跟之前l
  • StableLM(stablelm-tuned-alpha-7b)中文能力测试

    模型地址 https huggingface co stabilityai stablelm tuned alpha 7b 基模型 GPT NeoX 环境 2块3090 24G 运行代码 from transformers import A
  • Qt 2D绘图(2):绘制椭圆、弧、弦、扇形、圆角矩形

    Qt 2D绘图 2 绘制椭圆 弧 弦 扇形 圆角矩形 本文为原创文章 转载请注明出处 或注明转载自 黄邦勇帅 原名 黄勇 本文出自本人原创著作 Qt5 10 GUI完全参考手册 网盘地址 https pan baidu com s 1iqa
  • 初学SQL

    SQL是做什么的 SQL Structured Query Language 结构化查询语言 SQL 是用于访问和处理数据库的标准的计算机语言 一般的后台开发 只要是需要操作数据库 就需要用到SQL SQL与MySQL SQL Server
  • XCTF攻防世界web新手练习_ 10_simple_php

    XCTF攻防世界web新手练习 simple php 题目 题目为simple php 根据题目信息 判断是关于php代码审计的 打开题目 得到一串php代码 代码很简单 就是以GET方式获得两个参数a和b 如果a和b满足一定条件 则打印f
  • #css# 超出高度,可上下滚动

    div class test div class item p class title 这是一条数据 p div div 在最大的div里面加入以下代码 test width 200px max height 300px 设置最大的高度 o
  • 老毛桃 重装系统 Windos

    1 准备好系统启动U盘 2 电脑开机时按 F12 看电脑品牌 不同的电脑有不同的U盘启动的按钮 3 选择USB进入 4 回车进入WinPE桌面 5 打开分区工具 6 选择硬盘 使用快速分区 选择分成几个盘 确定 7 打开一键装机 选择映像文
  • 十分钟搞定 C/C++ 项目自动化构建 —— Xmake 入门指南

    上面是一个开发中的经典问题场景 发生的原因通常是 开发者工作机上的某些依赖项没有安装在测试或者客户环境中 导致程序无法运行或者报错 如何有效地避免这个尴尬的场景呢 那就需要一个持续的 可复用的自动构建流程 这样会促使团队保证他们的软件在 I
  • 缘份居在线起名,姓名打分API接口

    接口数据api 接口平台 https api yuanfenju com 开发文档 https doc yuanfenju com 支持格式 JSON 请求方式 HTTP POST 密钥 api secret wD XhOUW pvr 请求
  • 原生js层叠轮播

    轮播图 基本上是每个网页必备的一个模块 那么下面就给大家分享一个层叠样式轮播图 先给大家看一下样式图 首先满足自动轮播 鼠标放上就会停止轮播 移除就会继续 要想写好一个轮播图 首先肯定是要把样式 布局写出来 废话不多说 直接放样式布局 cs
  • ST-Llink与STM32最小系统开发板的线路连接

    ST Llink与STM32最小系统开发板的线路连接 1 ST Llink与STM32最小系统开发板的线路连接 ST Llink SWO STM32 SWDIO ST Llink SWCLK STM32 SWCLK ST Llink GND
  • AndroidTreeView中的列表树形展示 点击弹出树形结构中的某个列表并关闭已经打开的列表

    想看详情 链接如下 https download csdn net download sinat 28238111 10545762 public class MyTestFragment extends Fragment private

随机推荐

  • 二进制的简单应用

    include
  • SQL Server 存储过程返回结果集的几种方式

    SQL Server 返回结果集的几种方式 2017年12月18日 21 52 24 xxc1605629895 阅读数 7033更多 分类专栏 sqlserver 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转
  • adc0832工作原理详解_ADC0832芯片介绍

    芯片的应用 模 数 AD 和数 模 DA 转换是模拟 电路和数字电路进行沟通的渠道 从前面的课程我们知道 数字电路里 电平只有 高和低两种状态 比如 5V 和 0V 对应着 1 和 0 模拟电路里 电平则理论上有无数 个状态 比如 0V 0
  • 高德地图报错 Uncaught TypeError: AMap.Geocoder is not a constructor

    原本我是这样写的 但是在谷歌或者其他浏览器的时候就报错了 而且谷歌等浏览器 pc端是只能定位到附近的基站 出现这个报错可以添加 AMap plugin AMap Geocoder function
  • chroot的作用及详解

    什么是 chroot chroot 即 change root directory 更改 root 目录 在 linux 系统中 系统默认的目录结构都是以 即是以根 root 开始的 而在使用 chroot 之后 系统的目录结构将以指定的位
  • 在线机械键盘测试软件,键盘检测软件(DAS G2 104/105 Keyboard Test Tool)

    DAS G2 104 105 Keyboard Test Tool是一款主要针对新老键盘测试的工具 可以测试键盘的连键盘 坏键 按键响应时间 软件相关 根据测试人员从近百次的测试结果 50篇发文反馈来看 我们的硬核测试逐步得到了一些读者的关
  • java 文件pem,在Java中,仅用PEM文件创建SSLContext的最简单方法是什么?

    I used LetsEncrypt s CertBot to generate PEM files for free In other languages it is easy to start an HTTPS server using
  • sparkStreaming中用sparksql时遇到的问题总结

    问题一 今天准备用sparkStreaming接入kafka再写入hive 准备在流里面执行sparksql 按照官网的写法 一开始的代码是这样的 SparkConf sparkConf new SparkConf setMaster lo
  • python3.8静态人脸识别

    一 安装依赖库 pip install dlib pip install numpy pip install face recognition pip install opencv python 二 准备图片 1 已知图片 2 未知图片 三
  • Java中数组的使用

    数组的目的 用于存放多个类型相同的变量 一 1 数组初始化 动态初始化 初始化时只指定数组的长度 初始值由系统自动分配 int a new int 3 说明 左边 在栈内存中 存储局部变量 使用完立即消失 int 说明数据类型为int类型
  • 懒加载lazy

    目录 一 mybatis中的懒加载 二 Bean的懒加载 一 mybatis中的懒加载 一对多查询 mybatis中要不加fetchType默认lazy 即懒加载 问题 我要查询人员记录列表时 用queryRecordByParam时效率慢
  • xml的特殊字符

    在写xml文件的时候 需要注意有5个特殊的字符 分别是 lt gt 如果在文件中需要写入这5个字符的时候 需要转换处理 常用处理方式有转义字符和CDATA 转义字符 在 XML 中有 5 个预定义的实体引用 lt lt 小于 gt gt 大
  • 简单的API服务器搭建

    首先需要下载一个Nginx 高性能的HTTP和反向代理服务器 安装 brew install Nginx Step1 配置conf文件 Mac上默认
  • 路由器修改hosts实现域名劫持

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 我需要将某个网址 劫持到自己的内网某个IP 例如访问www baidu com 实际上要跳转到我内网的192 168 1 1 路由器一般是定制的linux系统 只要想办法打
  • Verilog -- 序列模三(整除3)检测器

    Verilog 序列模三 整除3 检测器 描述 输入口是1bit 每次进来一位数据 检查当前序列是否能整除3 能则输出1 否则输出0 例如 序列 1 out 0 序列 11 out 1 序列 110 out 1 序列 1101 out 0
  • java架构师面试核心问题

    java架构师面试核心问题 源码与视屏讲解同步 但都不是最重要的 具体实现 最重要的是快速过书 然后回退一遍画圈 重思想 一些特别的实现只要是源码能发布就发布 视屏讲解里的和源码配合发布 不是源码的不发布 第一部分 java的高质量编码与性
  • python面试——基础数据类型

    此篇指南是针对python中易混淆的知识点和内置的数据类型 1 python是解释执行的编译语言 相较于c 这类编译后执行的语言效率低一些 a 10 3 3 3 3 3 3 a 10 2 5 0 a 10 3 3 3 3 3 3 b 10
  • java 8集合操作

    1 过滤 过滤出年龄大于30的用户 List
  • Makefile中四种常用等式(= := += ?=)与自动化变量$X的实例说明

    1 引言 在阅读Makefile时经常会碰到一些 奇怪的符号 比如 还有 lt 等 之前也都看过了解 但是时间一长 回过头来看就又忘记了 这里做个简单的记录 方便同样遇到困惑的同学查询 1 四种常用等式 1 1 四种等式的作用 序号 等式
  • iOS 之苹果运行机制总结

    解释一下iOS内存机制 为什么iOS的RAM一直都是最少的但iOS却又是最最流畅的 大神请直接忽略此帖 仅希望小白们看过后不会再因为担心iPad内存不足而到处纠结1G RAM 2G RAM了那档子事了 这些帖子楼主看得眼睛都疼了 楼主不会搬