Linux內(nèi)存分布
如32位系統(tǒng),下面的3G是用戶(hù)空間,上面的1G是內(nèi)核空間,每個(gè)虛擬內(nèi)存中的內(nèi)核地址,其實(shí)關(guān)聯(lián)的都是相同的物理內(nèi)存
Linux中內(nèi)存分布,從地位到高位分別是程序文件、以初始化數(shù)據(jù)、未初始化數(shù)據(jù)、堆、文件映射、棧,內(nèi)核空間,堆和內(nèi)存映射區(qū)域少動(dòng)態(tài)分配的,一般分配內(nèi)存就是指在這兩個(gè)區(qū)域分配
malloc是如何分配內(nèi)存的(分配的是虛擬內(nèi)存)
1、分配內(nèi)存小于128KB的時(shí)候,通過(guò)brk() 函數(shù)將堆頂指針向高位移動(dòng),獲得新的內(nèi)存空間,通過(guò)brk函數(shù)分配的內(nèi)存,釋放掉后并不會(huì)立即歸還給操作系統(tǒng),而是放入內(nèi)存池中,待下次使用,這樣下次分配的時(shí)候就不需要進(jìn)行系統(tǒng)調(diào)用,也不會(huì)觸發(fā)缺頁(yè)中斷,這將大大減少CPU的消耗,但是這樣會(huì)產(chǎn)生很多的小內(nèi)存碎片,導(dǎo)致內(nèi)存泄漏
2、分配內(nèi)存大于128KB的時(shí)候,通過(guò)mmap函數(shù),在文件映射區(qū)域偷了一塊內(nèi)存,通過(guò)mmap函數(shù)申請(qǐng)的內(nèi)存,在free釋放掉后,會(huì)立即將內(nèi)存歸還給操作系統(tǒng),內(nèi)存得到真正的釋放,但是下次分配的時(shí)候,還是會(huì)進(jìn)行系統(tǒng)調(diào)用,觸發(fā)缺頁(yè)中斷,導(dǎo)致CPU的消耗過(guò)大,優(yōu)點(diǎn)是不會(huì)出現(xiàn)內(nèi)存碎片
malloc(1)會(huì)分配多大的內(nèi)存?
不會(huì)只分配1字節(jié),一般會(huì)分配多一點(diǎn),可能睡132K字節(jié)的內(nèi)存