1.1)硬件内存区分
我们的⼿机、电脑、或者智能设备都有随机存储器RAM(运⾏内存/主存)和只读存储器ROM(相当于计算机中的硬盘)。RAM是内部存储,ROM是外部存储。我
们的CPU直接访问的是RAM,如果想访问外部存储,则数据须先从ROM中将数据调度到RAM中才能被CPU访问。也就是说CPU不能直接从内存卡等硬盘⾥⾯读取
数据。
1.2)RAM和ROM的特点和区别
RAM:运⾏内存,CPU可以直接访问,访问速度快,价格⾼。不能够掉电存储,断电会失去数据,不稳定;
ROM:存储型内存,CPU不可以直接访问,访问速度慢,价格低。可以掉电存储,稳定;
1.3)RAM和ROM的协同⼯作
由于RAM不⽀持掉电存储,所以App程序⼀般存储在ROM中。⼿机⾥⾯使⽤的ROM基本都是Nand Flash(闪存),CPU是不能直接访问的,⽽是需要⽂件系
统/驱动程序(嵌⼊式中的EMC)将其读到RAM⾥⾯,CPU才可以访问。另外,RAM的速度也⽐Nand Flash快。
⼆. 内存分区
说到内存分区,内存即指的是RAM,可以分为5个区。所有的进程(执⾏中的程序)都必须占⽤⼀定数量的内存(RAM),它或许是⽤来存放从磁盘(ROM)
载⼊的程序代码,或是存放取⾃⽤户输⼊的数据等等。不过进程对这些内存的管理⽅式因内存⽤途不⼀⽽不尽相同,有些内存是事先静态分配和统⼀回收的,
⽽有些却是按需要动态分配和回收的。
2.1)代码区
代码段是⽤来存放可执⾏⽂件的操作指令(存放函数的⼆进制代码),也就是说它是可执⾏程序在内存中的镜像。代码段需要防⽌在运⾏时被⾮法修改,所以
只允许读取操作,⽽不允许写⼊操作。它是不可写的。
2.2)常量区
常量存储区,这是⼀块⽐较特殊的存储区,⾥⾯存放的是数字/字符常量。编译时分配,APP结束时由系统释放。
2.3)全局(静态)区
编译时分配,APP结束时由系统释放。全局变量和静态变量的存储是放在这⼀块区域,程序退出后⾃动释放。
数据区(全局初始化区),数据段⽤来存放程序中已经初始化的全局变量和静态变量。
BSS区(全局未初始化区),BSS段包含了程序中未初始化的全局变量和未初始化的静态变量。
2.4)堆(heap)区
堆(FIFO)是由程序开发者分配和释放,地址是从低到⾼分配。⽤于存放进程运⾏中被动态分配的内存段,它⼤⼩并不固定,可动态扩张或缩减。当进程调⽤
alloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利⽤release释放内存时,被释放的内存从堆中被剔除(堆被缩减),因为我们现
在iOS基本都使⽤ARC来管理对象,所以不⽤我们程序员来管理,但是我们要知道这个对象存储的位置。
2.5)栈(stack)区
栈(LIFO)是由系统⾃动分配并释放,地址从⾼到低分配。⽤于存放程序临时创建的局部变量,存放函数的参数值,局部变量等。也就是说我们函数括弧“{}”中
定义的变量(但不包括static声明的变量,static意味这在数据段中存放变量)。
另外在函数被调⽤时,其参数也会被压⼊发起调⽤的进程栈中,并且待到调⽤结束后,函数的返回值也会被存放回栈中。由于栈的先进后出(LIFO)特点,所
以栈特别⽅便⽤来保存/恢复调⽤现场。从这个意义上将我们可以把栈看成⼀个临时数据寄存、交换的内存区。函数跳转时现场保护(寄存器值保存于恢复),这
些系统都会帮我们⾃动实现,⽆需我们⼲预。所以⼤量的局部变量,深递归,函数循环调⽤都可能耗尽栈内存⽽造成程序崩溃 。