【iOS】内存五大分区

目录

    • 堆(Heap)是什么
    • 五大分区
      • 栈区
      • 堆区
      • 全局/静态区
      • 常量区(即.rodata)
      • 代码区(.text)
    • 函数栈
    • 堆和栈的区别和联系
    • 图解


OC语言是C语言的超集,所以先了解C语言的内存模型的内存管理会有很大帮助。C语言的内存模型分为5个区:栈区堆区全局/静态区常量区代码区

一般情况下程序存放在ROM(只读内存,比如硬盘)或Flash中,运行时需要拷到RAM(随机存储器RAM)中执行,RAM会分别存储不同的信息,如下图所示:

【iOS】内存五大分区_第1张图片

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

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

ROM(read only memory):存储性内存,可以掉电存储,eg:SD卡、Flash(机械磁盘也可以简单的理解为ROM)。用的多的:NandFlash(空间大,便宜),还有NorFlash(直接运行程序,读取速度快)
|_|
由于RAM类型不具备掉电存储能力(即一停止供电数据全没了,从新上电后全是乱码,所以需要初始化),所以app程序一般存放于ROM中。RAM的访问速度要远高于ROM,价格也要高
由于RAM不能掉电存储,所以我们的APP程序,刷机包,下载的文件等等,都是在ROM里面存储的

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

下面先了解一下堆是怎么存放和操作数据的

堆(Heap)是什么

堆是计算机科学中一类特殊的数据结构的统称。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构
|_|
堆(Heap)又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。在堆中,我们不是按照元素进入队列的先后顺序取出元素的,而是按照元素的优先级取出元素

这就好像候机的时候,无论谁先到达候机厅,总是头等舱的乘客先登机,然后是商务舱的乘客,最后是经济舱的乘客。每个乘客都有头等舱、商务舱、经济舱三种个键值(key)中的一个。头等舱->商务舱->经济舱依次享有从高到低的优先级

总的来说,堆是一种数据结构,数据的插入和删除是根据优先级定的,他有几个特性:

  • 任意节点的优先级它的子节点
  • 每个节点值都它的子节点
  • 主要操作是插入和删除最小元素(元素值本身为优先级键值,小元素享有高优先级)

举个例子,就像叠罗汉,体重大(优先级低、值大)的站在最下面,体重小的站在最上面(优先级高,值小)。 为了让堆稳固,我们每次都让最上面的参与者退出堆,也就是每次取出优先级最高的元素

【iOS】内存五大分区_第2张图片

五大分区

栈区

  • 栈是一块连续的内存区域高地址向低地址进行存储,遵循先进后出(FILO)原则

  • 栈区由操作系统在运行时自动分

你可能感兴趣的:(iOS日常学习,ios,macos,xcode,objective-c)