RAM与ROM就是具体的存储空间,统称为存储器程序员
因为RAM类型不具有掉电存储能力(即一中止供电数据全没了,重新上电后全是乱码,因此须要初始化),因此app程序通常存放于ROM中。RAM的访问速度要远高于ROM,价格也要高。编程
因为RAM不能掉电存储,因此咱们的APP程序,刷机包,下载的文件等等,都是在ROM里面存储的。缓存
手机里面使用的ROM基本都是NandFlash,CPU是不能直接访问的,而是须要文件系统/驱动程序(嵌入式中的EMC)将其读到RAM里面,CPU才能够访问。另外,RAM的速度也比NandFlash快。服务器
说到内存分区,内存即指的是RAM微信
栈区(stack): 这个通常由编译器操做,或者说是系统管理,会存一些局部变量,函数跳转跳转时现场保护(寄存器值保存于恢复),这些系统都会帮咱们自动实现,无需咱们干预。 因此大量的局部变量,深递归,函数循环调用均可能耗尽栈内存而形成程序崩溃 app
堆区(heap): 通常由程序员管理,好比alloc申请内存,free释放内存。咱们建立的对象也都放在这里dom
全局区(静态区 static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另外一块区域。 - 程序结束后有系统释放。注意:在嵌入式系统中全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。举例:int a;未初始化的。int a = 10;已初始化的。函数
常量区:常量字符串就是放在这里的,还有const常量操作系统
代码区:存放代码,app程序会拷贝到这里,程序不是在ROM里面存储吗?看下面的举例指针
图中各个区并不连续
手机上的全部程序都是依托操做系统,运行在虚拟内存上的,每个APP都会觉得本身拥有全部的虚拟内存。好比一个手机,它是32位操做系统(通常也是32位总线),真实的物理内存为2G:
那么他的寻址空间为4G(2的32次方),对于APP来讲,它以为本身拥有4G的内存,虽然这是不可能的(或者说同一时间是不可能的),可是,操做系统只要保证APP当时用到的地址空间有真实的物理地址对应就能够,APP也不须要知道那对应的2G真实物理内存具体在哪里。不要求4G的虚拟内存同一时间都有真实的物理内存相对应,固然那也是不可能的,由于只有2G物理内存
在下面的举例中,只考虑虚拟内存
假设经过微信咱们下载了一个100M的视频,那么会从服务器一点一点的下载到RAM,而后再从RAM写到ROM存储。这样才能保证,咱们关掉微信并再次打开时视频还在
假设隔一段时间,咱们要看视频,程序会将它从ROM读到RAM而后解码播放
当一个app启动后,代码区,常量区,全局区地址已固定,所以指向这些区的指针不会为空而产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的建立销毁,栈的弹入弹出),因此当使用一个指针指向这两个区里面的内存时,必定要注意内存是否已经被释放,不然会产生程序崩溃(编程中很常见)。