計算機是由CPU卿捎、內(nèi)存和外部設(shè)備組成的。CPU負(fù)責(zé)數(shù)據(jù)處理径密,內(nèi)存負(fù)責(zé)存儲午阵,外部設(shè)備負(fù)責(zé)數(shù)據(jù)的輸入和輸出,它們之間通過總線連接在一起享扔。CPU主要是由控制器底桂、運算器和寄存器組成的∥焙埽控制器負(fù)責(zé)指令的讀取和調(diào)度戚啥,運算器負(fù)責(zé)指令的運算執(zhí)行,寄存器負(fù)責(zé)數(shù)據(jù)的存儲锉试,它們之間通過CPU內(nèi)的總線連接在一起猫十。
疑問一 : 內(nèi)存作為數(shù)據(jù)存儲的場所,那么為什么還要有寄存器呆盖?
CPU的運算速度是非惩显疲快的,如果把運算的數(shù)據(jù)都放到內(nèi)存里面的話那將大大降低整個系統(tǒng)的性能应又。解決的辦法是在CPU內(nèi)部開辟一小塊臨時存儲區(qū)域宙项,并在進(jìn)行運算時先將數(shù)據(jù)從內(nèi)存復(fù)制到這一小塊臨時存儲區(qū)域中,運算時就在這一小快臨時存儲區(qū)域內(nèi)進(jìn)行株扛。我們稱這一小塊臨時存儲區(qū)域為寄存器尤筐。因為寄存器和運算器以及控制器是非常緊密的聯(lián)系在一起的,它們的頻率一致洞就,所以運算時就不會因為數(shù)據(jù)的來回傳輸以及各設(shè)備之間的頻率差異導(dǎo)致系統(tǒng)性能的整體下降盆繁。
疑問二 :為什么不把整個內(nèi)存都集成進(jìn)CPU?
寄存器的制作難度大旬蟋,選材精油昂,而且是集成到芯片內(nèi)部,所價格高。而內(nèi)存的成本則相對低廉冕碟,而且從工藝上來說拦惋,我們不可能在CPU內(nèi)部集成大量的存儲單元。
疑問三 : 高速緩存的功能安寺?
程序在運行時是要將所有可執(zhí)行的二進(jìn)制指令代碼都裝載到內(nèi)存里面去厕妖,CPU每執(zhí)行一條指令前都需要從內(nèi)存中將指令讀取到CPU內(nèi)并執(zhí)行。如果按這樣每次都從內(nèi)存讀取一條指令來依次執(zhí)行的話我衬,那還是存在著CPU和內(nèi)存之間的處理瓶頸問題叹放,從而造成整體性能的下降,所以就出現(xiàn)了高速緩存挠羔。當(dāng)程序在運行時井仰,就可以預(yù)先將部分在內(nèi)存中要執(zhí)行的指令代碼以及數(shù)據(jù)復(fù)制到高速緩存中去,而CPU則不再每次都從內(nèi)存中讀取指令而是直接從高速緩存依次讀取指令來執(zhí)行破加,從而加快了整體的速度俱恶。
虛擬內(nèi)存 : 當(dāng)我們向系統(tǒng)申請內(nèi)存時,系統(tǒng)并不會給你返回物理內(nèi)存的地址范舀,而是給你一個虛擬內(nèi)存地址合是。每個進(jìn)程都擁有相同大小的虛擬地址空間,只有我們開始使用申請到的虛擬內(nèi)存時锭环,系統(tǒng)才會將虛擬地址映射到物理地址上聪全,從而讓程序使用真實的物理內(nèi)存。
棧區(qū)(stack):由系統(tǒng)去管理辅辩。地址從高到低分配难礼。先進(jìn)后出。會存一些局部變量玫锋,函數(shù)跳轉(zhuǎn)地址蛾茉、對象指針 。
堆區(qū)(heap):需要我們自己管理內(nèi)存撩鹿,alloc申請內(nèi)存release釋放內(nèi)存谦炬。創(chuàng)建的對象也都放在這里。 地址是從低到高分配节沦。堆是所有程序共享的內(nèi)存键思,當(dāng)N個這樣的內(nèi)存得不到釋放,堆區(qū)會被擠爆甫贯,程序立馬癱瘓吼鳞。這就是內(nèi)存泄漏。
全局區(qū)/靜態(tài)區(qū)(staic):全局變量和靜態(tài)變量的存儲是放在一塊的获搏,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后有系統(tǒng)釋放常熙。
常量區(qū):常量字符串就是放在這里的纬乍,還有const常量。
代碼區(qū):存放App代碼裸卫。