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里面存儲嗎?看下面的舉例

圖中各個區並不連續

程序運行舉例(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然后解碼播放

編程注意

當一個app啟動后,代碼區,常量區,全局區地址已固定,因此指向這些區的指針不會為空而產生崩潰性的錯誤。而堆區和棧區是時時刻刻變化的(堆的創建銷毀,棧的彈入彈出),所以當使用一個指針指向這兩個區里面的內存時,一定要注意內存是否已經被釋放,否則會產生程序崩潰(編程中很常見)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM