日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux内存分配机制之伙伴系统和SLAB

發(fā)布時間:2023/11/29 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux内存分配机制之伙伴系统和SLAB 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載請注明原文地址:http://www.cnblogs.com/ygj0930/p/6539590.html?

??? 內(nèi)核內(nèi)存管理的一項重要工作就是如何在頻繁申請釋放內(nèi)存的情況下,避免碎片的產(chǎn)生。這就要求內(nèi)核采取靈活而恰當?shù)膬?nèi)存分配策略。通常,內(nèi)存分配一般有兩種情況:大對象(大的連續(xù)空間分配)、小對象(小的空間分配)。針對不同的需求,Linux分別采取了伙伴系統(tǒng)算法和SLAB進行內(nèi)存分配。

??? 伙伴系統(tǒng):把所有的空閑頁框分為11個塊鏈表,每個塊鏈表中的結(jié)點分別是大小為1,2,4,8,16,32,64,128,256,512和1024個連續(xù)頁框的頁框塊。最大的頁框塊包含1024個連續(xù)頁框,對應(yīng)4MB大小的連續(xù)內(nèi)存。假設(shè)要申請一個256個頁框的塊,則先從結(jié)點為256個連續(xù)頁框塊的鏈表中查找空閑塊,如果沒有,就去512個頁框的鏈表中找,找到了則將頁框塊分為2個256個頁框的塊,一個分配給應(yīng)用,另外一個移到256個頁框的鏈表中。如果512個頁框的鏈表中仍沒有空閑塊,繼續(xù)向1024個頁框的鏈表查找—分割—分配和轉(zhuǎn)移。如果仍然沒有,則返回錯誤。使用過的頁框塊在釋放時,會主動將兩個連續(xù)的頁框塊合并為一個較大的頁框塊,然后作為結(jié)點插入相應(yīng)規(guī)格的鏈表中。

??? 伙伴系統(tǒng)很好地解決了外部碎片(頁框之間的碎片)問題:

??? 如圖,當前內(nèi)存段中空閑的頁框最大不過連續(xù)3個頁框。如果此時申請4個連續(xù)頁框大小的內(nèi)存則只能去更大的空閑內(nèi)存處截取了,久而久之,這些頁框之間留下的空隙就成為了外部碎片。而伙伴系統(tǒng)對這些外部碎片進行管理(分配、合并),使得內(nèi)存中的頁框能盡量得到使用。

??

??? SLAB:伙伴系統(tǒng)分配內(nèi)存時是基于頁框為單位的,比較大。如果是幾十個字節(jié)的小內(nèi)存分配怎么辦呢?此時就需要用SLAB機制。slab分配器是基于對象進行管理的,所謂的對象就是內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)(例如:task_struct,file_struct 等)。相同類型的對象歸為一類,每當要申請這樣一個對象時,slab分配器就從一個slab列表中分配一個這樣大小的單元出去,而當要釋放時,將其重新保存在該列表中,而不是直接返回給伙伴系統(tǒng),從而避免內(nèi)部碎片。slab分配器并不丟棄已經(jīng)分配的對象,而是釋放并把它們保存在內(nèi)存中。slab分配對象時,會使用最近釋放的對象的內(nèi)存塊,因此其駐留在cpu高速緩存中的概率會大大提高。也就是說:在內(nèi)存中維護一個slab列表,列表項對應(yīng)這各種數(shù)據(jù)結(jié)構(gòu)大小的內(nèi)存塊;當有小對象申請內(nèi)存時,直接從slab列表中找到對象類型的列表項,把相應(yīng)大小的內(nèi)存分配出去;對象用完后,釋放掉對象并把對象所占的內(nèi)存塊歸還到slab列表以供下一個同類型的對象使用。

???? 同理,由于SLAB是對于小對象的內(nèi)存分配,很好地解決了頁框內(nèi)部的內(nèi)存分配產(chǎn)生的碎片(內(nèi)部碎片)問題。

?????????????

總結(jié)

以上是生活随笔為你收集整理的Linux内存分配机制之伙伴系统和SLAB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。