? ? 今天又看了一下linux 內(nèi)核slab分配器的內(nèi)容,腦中產(chǎn)生了一個(gè)疑問: linux系統(tǒng)內(nèi)核使用了buddy算法處理內(nèi)存頁的管理闸准,使用slab分配器對(duì)小容量內(nèi)存的分配凿歼,那么一個(gè)應(yīng)用程序會(huì)經(jīng)常使用到如malloc這樣的內(nèi)存請(qǐng)求,它是怎么工作的呢崭别?
? ? 原先我認(rèn)為可能和這個(gè)slab分配器機(jī)制相關(guān)送朱,或者使用了slab。但又一想,slab分配器有兩種機(jī)制:普通高速緩存和專用高速緩存臀晃,即前者是系統(tǒng)啟動(dòng)時(shí)建立的,且每個(gè)slab都管理固定大小的空間(2的冪次為單位的字節(jié)數(shù));后者slab分配大小可由開發(fā)定制介劫,系統(tǒng)提供了接口徽惋。
? ? 如果用戶內(nèi)存請(qǐng)求使用第一種slab分配,申請(qǐng)空間隨機(jī)不可能那么湊巧是2的冪次座韵。豈不是浪費(fèi)內(nèi)存险绘?這種可能性可以否定踢京。采用第二種方式,slab分配定制在內(nèi)核態(tài)調(diào)用宦棺,且系統(tǒng)調(diào)用不會(huì)調(diào)用它的接口瓣距,所以也可以否定。第二種應(yīng)該是提供給內(nèi)核態(tài)程序的代咸。
? ? 想到這里蹈丸,意識(shí)里slab是這樣一種機(jī)制,它為申請(qǐng)固定大小內(nèi)存的結(jié)構(gòu)呐芥,且批量的頻繁使用提供了便利逻杖,是內(nèi)核和底層行為。
? ? 那么用戶態(tài)的內(nèi)存請(qǐng)求是怎么工作的呢思瘟?那就要研究malloc系統(tǒng)調(diào)用了荸百。其實(shí)是請(qǐng)求內(nèi)存時(shí)內(nèi)核去分配內(nèi)存,比如要分配一個(gè)虛擬地址空間滨攻,要產(chǎn)生缺頁請(qǐng)求够话,獲取物理內(nèi)存,并映射進(jìn)頁表光绕,返回的虛擬地址供程序調(diào)用女嘲。釋放內(nèi)存時(shí)則標(biāo)記此段虛擬地址空間為未使用,在適當(dāng)?shù)臅r(shí)候釋放整個(gè)頁奇钞。
? ? kmalloc調(diào)用使用了slab分配機(jī)制澡为,vmalloc調(diào)用則是和malloc相似的分配機(jī)制,通過內(nèi)核頁表來請(qǐng)求內(nèi)存景埃。在頁表或slab分配表中查詢不到空閑空間則請(qǐng)頁異常中斷處理媒至。