Linux内存分配机制之伙伴系统和SLAB
轉(zhuǎn)載請(qǐng)注明原文地址:http://www.cnblogs.com/ygj0930/p/6539590.html?
??? 內(nèi)核內(nèi)存管理的一項(xiàng)重要工作就是如何在頻繁申請(qǐng)釋放內(nèi)存的情況下,避免碎片的產(chǎn)生。這就要求內(nèi)核采取靈活而恰當(dāng)?shù)膬?nèi)存分配策略。通常,內(nèi)存分配一般有兩種情況:大對(duì)象(大的連續(xù)空間分配)、小對(duì)象(小的空間分配)。針對(duì)不同的需求,Linux分別采取了伙伴系統(tǒng)算法和SLAB進(jìn)行內(nèi)存分配。
??? 伙伴系統(tǒng):把所有的空閑頁框分為11個(gè)塊鏈表,每個(gè)塊鏈表中的結(jié)點(diǎn)分別是大小為1,2,4,8,16,32,64,128,256,512和1024個(gè)連續(xù)頁框的頁框塊。最大的頁框塊包含1024個(gè)連續(xù)頁框,對(duì)應(yīng)4MB大小的連續(xù)內(nèi)存。假設(shè)要申請(qǐng)一個(gè)256個(gè)頁框的塊,則先從結(jié)點(diǎn)為256個(gè)連續(xù)頁框塊的鏈表中查找空閑塊,如果沒有,就去512個(gè)頁框的鏈表中找,找到了則將頁框塊分為2個(gè)256個(gè)頁框的塊,一個(gè)分配給應(yīng)用,另外一個(gè)移到256個(gè)頁框的鏈表中。如果512個(gè)頁框的鏈表中仍沒有空閑塊,繼續(xù)向1024個(gè)頁框的鏈表查找—分割—分配和轉(zhuǎn)移。如果仍然沒有,則返回錯(cuò)誤。使用過的頁框塊在釋放時(shí),會(huì)主動(dòng)將兩個(gè)連續(xù)的頁框塊合并為一個(gè)較大的頁框塊,然后作為結(jié)點(diǎn)插入相應(yīng)規(guī)格的鏈表中。
??? 伙伴系統(tǒng)很好地解決了外部碎片(頁框之間的碎片)問題:
??? 如圖,當(dāng)前內(nèi)存段中空閑的頁框最大不過連續(xù)3個(gè)頁框。如果此時(shí)申請(qǐng)4個(gè)連續(xù)頁框大小的內(nèi)存則只能去更大的空閑內(nèi)存處截取了,久而久之,這些頁框之間留下的空隙就成為了外部碎片。而伙伴系統(tǒng)對(duì)這些外部碎片進(jìn)行管理(分配、合并),使得內(nèi)存中的頁框能盡量得到使用。
??
??? SLAB:伙伴系統(tǒng)分配內(nèi)存時(shí)是基于頁框?yàn)閱挝坏?#xff0c;比較大。如果是幾十個(gè)字節(jié)的小內(nèi)存分配怎么辦呢?此時(shí)就需要用SLAB機(jī)制。slab分配器是基于對(duì)象進(jìn)行管理的,所謂的對(duì)象就是內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)(例如:task_struct,file_struct 等)。相同類型的對(duì)象歸為一類,每當(dāng)要申請(qǐng)這樣一個(gè)對(duì)象時(shí),slab分配器就從一個(gè)slab列表中分配一個(gè)這樣大小的單元出去,而當(dāng)要釋放時(shí),將其重新保存在該列表中,而不是直接返回給伙伴系統(tǒng),從而避免內(nèi)部碎片。slab分配器并不丟棄已經(jīng)分配的對(duì)象,而是釋放并把它們保存在內(nèi)存中。slab分配對(duì)象時(shí),會(huì)使用最近釋放的對(duì)象的內(nèi)存塊,因此其駐留在cpu高速緩存中的概率會(huì)大大提高。也就是說:在內(nèi)存中維護(hù)一個(gè)slab列表,列表項(xiàng)對(duì)應(yīng)這各種數(shù)據(jù)結(jié)構(gòu)大小的內(nèi)存塊;當(dāng)有小對(duì)象申請(qǐng)內(nèi)存時(shí),直接從slab列表中找到對(duì)象類型的列表項(xiàng),把相應(yīng)大小的內(nèi)存分配出去;對(duì)象用完后,釋放掉對(duì)象并把對(duì)象所占的內(nèi)存塊歸還到slab列表以供下一個(gè)同類型的對(duì)象使用。
???? 同理,由于SLAB是對(duì)于小對(duì)象的內(nèi)存分配,很好地解決了頁框內(nèi)部的內(nèi)存分配產(chǎn)生的碎片(內(nèi)部碎片)問題。
?????????????
總結(jié)
以上是生活随笔為你收集整理的Linux内存分配机制之伙伴系统和SLAB的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到别人家砌墙啥意思
- 下一篇: web管理