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啓動後,代碼區,常量區,全局區地址已固定,所以指向這些區的指針不會爲空而產生崩潰性的錯誤。而堆區和棧區是時時刻刻變化的(堆的建立銷燬,棧的彈入彈出),因此當使用一個指針指向這兩個區裏面的內存時,必定要注意內存是否已經被釋放,不然會產生程序崩潰(編程中很常見)。