2011-09-23 66 views

回答

2

關於slab分配器:

所以,想象存儲器是平坦的是你有4個連續的演出內存塊。然後你的一個程序需要256字節的內存,所以內存分配器必須做的是從這4個演出中選擇一個合適的256字節塊。所以現在你的記憶看起來像

< ============ 256bytes =======================>

(每個=是連續的內存塊)。一段時間過去了,許多使用內存的程序需要更多的256個塊或更多或更少,所以最終你的內存可能看起來像:

< == 256 == 256 = 256 = 86 = 68 = 121 = ==>

所以它被分割,然後沒有你美麗的4gig內存塊的痕跡 - 這是碎片。現在,slab分配器會做的是跟蹤分配的對象,一旦它們不再被使用,它會說內存是空閒的,實際上它會保留在某種列表中(你可能想讀FreeLists)。

所以現在想象一下,第一個程序放棄分配的256個字節,然後一個新的想要有256個字節,所以不用分配一個新的主內存塊,它可以重新使用最後釋放的256個字節,而不必通過搜索物理內存來尋找合適的連續空間塊。這就是你實質上實現內存緩存的方式。這樣做是爲了減少整體內存碎片,因爲最終可能導致內存碎片化,無法使用,並且內存管理器必須採取一些魔法才能阻止適當的大小。在哪裏使用板分配器主動地打擊(但不消除)問題。

+1

謝謝LordDoskias,供您參考。但是,這更多關於碎片。它沒有解釋我詢問關於「內存緩存」和「內存池」的相同/差異關係問題。 – pepero

0

Linux內存分配程序A.K.A板分配程序維護頻率相似或近似大小的內存對象的常用列表/池。 slab爲編程人員提供了額外的靈活性,可以創建他們自己的相同大小的常用內存對象池,並將其標記爲程序員想要的,分配,釋放並最終銷燬它。此緩存對您的驅動程序是已知的,對於它是私有的。但是,一個問題,在內存壓力下,分配失敗的可能性很高,這在某些驅動程序中可能是不可接受的,那麼做什麼更好總是保留一些內存方便,以便我們從不感覺內存緊縮,因爲kmem緩存更通用的池機制需要一個能夠始終保持最小需求內存的人,這就是我們的好友內存池。

相關問題