<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > iOS開(kāi)發(fā)中的內存分配與分區

iOS開(kāi)發(fā)中的內存分配與分區

作者: 時(shí)間:2018-08-08 來(lái)源:網(wǎng)絡(luò ) 收藏

關(guān)于RAMROM

本文引用地址:http://dyxdggzs.com/article/201808/385952.htm

RAM與ROM就是具體的存儲空間,統稱(chēng)為存儲器。

RAM(random access memory):運行內存,CPU可以直接訪(fǎng)問(wèn),讀寫(xiě)速度非???,但是不能掉電存儲。它又分為:

動(dòng)態(tài)DRAM,速度慢一點(diǎn),需要定期的刷新(充電),我們常說(shuō)的內存條就是指它,價(jià)格會(huì )稍低一點(diǎn),手機中的運行內存也是指它。

靜態(tài)SRAM,速度快,我們常說(shuō)的一級緩存,二級緩存就是指它,當然價(jià)格高一點(diǎn)。

ROM(read only memory):存儲性?xún)却?,可以掉電存儲,例如SD卡、Flash(機械磁盤(pán)也可以簡(jiǎn)單的理解為ROM)。用的多的:NandFlash,還有NorFlash,現在用的已經(jīng)比較少了(兩者主要區別是前者空間大,便宜,后者可以直接運行程序,讀取速度快)。

由于RAM類(lèi)型不具備掉電存儲能力(即一停止供電數據全沒(méi)了,從新上電后全是亂碼,所以需要初始化),所以app程序一般存放于ROM中。RAM的訪(fǎng)問(wèn)速度要遠高于ROM,價(jià)格也要高。

RAM與ROM協(xié)同工作

由于RAM不能掉電存儲,所以我們的APP程序,刷機包,下載的文件等等,都是在ROM里面存儲的。

手機里面使用的ROM基本都是NandFlash,CPU是不能直接訪(fǎng)問(wèn)的,而是需要文件系統/驅動(dòng)程序(嵌入式中的EMC)將其讀到RAM里面,CPU才可以訪(fǎng)問(wèn)。另外,RAM的速度也比NandFlash快。

內存分區:可以分為5個(gè)區

說(shuō)到內存分區,內存即指的是RAM。

棧區(stack): 這個(gè)一般由編譯器操作,或者說(shuō)是系統管理,會(huì )存一些局部變量,函數跳轉跳轉時(shí)現場(chǎng)保護(寄存器值保存于恢復),這些系統都會(huì )幫我們自動(dòng)實(shí)現,無(wú)需我們干預。 所以大量的局部變量,深遞歸,函數循環(huán)調用都可能耗盡棧內存而造成程序崩潰 。

堆區(heap): 一般由程序員管理,比如alloc申請內存,free釋放內存。我們創(chuàng )建的對象也都放在這里。

全局區(靜態(tài)區 static):全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區域。程序結束后有系統釋放。注意:在嵌入式系統中全局區又可分為未初始化全局區:.bss段和初始化全局區:data段。舉例:int a;未初始化的。int a = 10;已初始化的。

常量區:常量字符串就是放在這里的,還有const常量。

代碼區:存放代碼,app程序會(huì )拷貝到這里,程序不是在ROM里面存儲嗎?看下面的舉例

圖中各個(gè)區并不連續

memZonepic01.png

程序運行舉例(CPU RAM ROM之間協(xié)同)

首先了解下:虛擬內存與物理內存。

手機上的所有程序都是依托操作系統,運行在虛擬內存上的,每一個(gè)APP都會(huì )以為自己擁有所有的虛擬內存。比如一個(gè)手機,它是32位操作系統(一般也是32位總線(xiàn)),真實(shí)的物理內存為2G,那么他的尋址空間為4G(2的32次方),對于A(yíng)PP來(lái)說(shuō),它覺(jué)得自己擁有4G的內存,雖然這是不可能的(或者說(shuō)同一時(shí)間是不可能的),但是,操作系統只要保證APP當時(shí)用到的地址空間有真實(shí)的物理地址對應就可以,APP也不需要知道那對應的2G真實(shí)物理內存具體在哪里。不要求4G的虛擬內存同一時(shí)間都有真實(shí)的物理內存相對應,當然那也是不可能的,因為只有2G物理內存。

在下面的舉例中,只考慮虛擬內存

當我們點(diǎn)擊手機屏幕APP的Icon啟動(dòng)一個(gè)APP(例如微信)時(shí),操作系統會(huì )為微信開(kāi)辟4G的虛擬內存空間(開(kāi)辟真實(shí)的物理內存,對應一部分到4G的虛擬內存),操作系統會(huì )把存儲在ROM里面微信的部分代碼(受空間所限,不可能全部拷貝),拷貝到上一步開(kāi)辟的4G內存空間的代碼區,如上圖,然后CPU就可以訪(fǎng)問(wèn)RAM來(lái)運行微信的程序了 。

假設通過(guò)微信我們下載了一個(gè)100M的視頻,那么會(huì )從服務(wù)器一點(diǎn)一點(diǎn)的下載到RAM,然后再從RAM寫(xiě)到ROM存儲。這樣才能保證,我們關(guān)掉微信并再次打開(kāi)時(shí)視頻還在。假設隔一段時(shí)間,我們要看視頻,程序會(huì )將它從ROM讀到RAM然后解碼播放。

memZonepic002.png

編程注意

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



關(guān)鍵詞: iOS 內存分配

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>