当前位置: 首页 > news >正文

iOS开发中的内存分配与分区

iOS开发中的内存分配与分区 

关于RAM&ROM

RAM与ROM就是具体的存储空间,统称为存储器。

RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储。它又分为:

  • 动态DRAM,速度慢一点,需要定期的刷新(充电),我们常说的内存条就是指它,价格会稍低一点,手机中的运行内存也是指它。

  • 静态SRAM,速度快,我们常说的一级缓存,二级缓存就是指它,当然价格高一点。

ROM(read only memory):存储性内存,可以掉电存储,例如SD卡、Flash(机械磁盘也可以简单的理解为ROM)。用的多的:NandFlash,还有NorFlash,现在用的已经比较少了(两者主要区别是前者空间大,便宜,后者可以直接运行程序,读取速度快)。

由于RAM类型不具备掉电存储能力(即一停止供电数据全没了,从新上电后全是乱码,所以需要初始化),所以app程序一般存放于ROM中。RAM的访问速度要远高于ROM,价格也要高。

RAM与ROM协同工作
由于RAM不能掉电存储,所以我们的APP程序,刷机包,下载的文件等等,都是在ROM里面存储的。

手机里面使用的ROM基本都是NandFlash,CPU是不能直接访问的,而是需要文件系统/驱动程序(嵌入式中的EMC)将其读到RAM里面,CPU才可以访问。另外,RAM的速度也比NandFlash快。

内存分区:可以分为5个区

说到内存分区,内存即指的是RAM。

栈区(stack): 这个一般由编译器操作,或者说是系统管理,会存一些局部变量,函数跳转跳转时现场保护(寄存器值保存于恢复),这些系统都会帮我们自动实现,无需我们干预。 所以大量的局部变量,深递归,函数循环调用都可能耗尽栈内存而造成程序崩溃 。

堆区(heap): 一般由程序员管理,比如alloc申请内存,free释放内存。我们创建的对象也都放在这里。

全局区(静态区 static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。注意:在嵌入式系统中全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。举例:int a;未初始化的。int a = 10;已初始化的。

常量区:常量字符串就是放在这里的,还有const常量。

代码区:存放代码,app程序会拷贝到这里,程序不是在ROM里面存储吗?看下面的举例

图中各个区并不连续

701177-1e5ef45ec9480700.png

memZonepic01.png

程序运行举例(CPU RAM ROM之间协同)

首先了解下:虚拟内存与物理内存。

手机上的所有程序都是依托操作系统,运行在虚拟内存上的,每一个APP都会以为自己拥有所有的虚拟内存。比如一个手机,它是32位操作系统(一般也是32位总线),真实的物理内存为2G,那么他的寻址空间为4G(2的32次方),对于APP来说,它觉得自己拥有4G的内存,虽然这是不可能的(或者说同一时间是不可能的),但是,操作系统只要保证APP当时用到的地址空间有真实的物理地址对应就可以,APP也不需要知道那对应的2G真实物理内存具体在哪里。不要求4G的虚拟内存同一时间都有真实的物理内存相对应,当然那也是不可能的,因为只有2G物理内存。

在下面的举例中,只考虑虚拟内存

当我们点击手机屏幕APP的Icon启动一个APP(例如微信)时,操作系统会为微信开辟4G的虚拟内存空间(开辟真实的物理内存,对应一部分到4G的虚拟内存),操作系统会把存储在ROM里面微信的部分代码(受空间所限,不可能全部拷贝),拷贝到上一步开辟的4G内存空间的代码区,如上图,然后CPU就可以访问RAM来运行微信的程序了 。

假设通过微信我们下载了一个100M的视频,那么会从服务器一点一点的下载到RAM,然后再从RAM写到ROM存储。这样才能保证,我们关掉微信并再次打开时视频还在。假设隔一段时间,我们要看视频,程序会将它从ROM读到RAM然后解码播放。

701177-4e31e3404a0b5d0c.png

memZonepic002.png

编程注意

当一个app启动后,代码区,常量区,全局区地址已固定,因此指向这些区的指针不会为空而产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(编程中很常见)。

转载于:https://www.cnblogs.com/ruixin-jia/p/5943251.html

相关文章:

  • 第一个微信项目
  • web服务
  • 编程思想之多线程与多进程系列
  • aop 简单运用,traceId 简单实现,访问日志拦截,ip黑名单
  • MySQL学习笔记 初学基础篇
  • Linux磁盘及文件系统的管理
  • PC端和移动端测试区别
  • Zabbix 3.0 主备模式 [八]
  • 如何接入新连接
  • centos7 firewall操作
  • vscode 终端下载vue
  • ./和../以及/和~之间的区别
  • 2016.8.17服务器端数据库用户导入导出方法 expdp和impdp
  • 十年码农建议:写代码时应该反复问自己8个问题
  • quartz学习
  • [nginx文档翻译系列] 控制nginx
  • 【mysql】环境安装、服务启动、密码设置
  • export和import的用法总结
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • java8 Stream Pipelines 浅析
  • js递归,无限分级树形折叠菜单
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Linux链接文件
  • Python十分钟制作属于你自己的个性logo
  • Sequelize 中文文档 v4 - Getting started - 入门
  • sessionStorage和localStorage
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从零开始的无人驾驶 1
  • 给github项目添加CI badge
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 前端工程化(Gulp、Webpack)-webpack
  • 区块链将重新定义世界
  • 再谈express与koa的对比
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 积累各种好的链接
  • 组复制官方翻译九、Group Replication Technical Details
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (3)nginx 配置(nginx.conf)
  • (31)对象的克隆
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (排序详解之 堆排序)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)基于IDEA的JAVA基础10
  • .apk 成为历史!
  • .net 验证控件和javaScript的冲突问题
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ 数据结构 - C++]红黑树RBTree
  • [\u4e00-\u9fa5] //匹配中文字符
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [BUUCTF 2018]Online Tool
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [C#基础]说说lock到底锁谁?