1.在用戶空間動態申請內存的函數為malloc(),釋放函數為free()
對Linux內核而言,C庫的malloc()函數通過brk()和mmap()兩個系統調用來實現
2.內核空間內存動態申請---以頁為單位
(1).kmalloc()和__get_free_pages()申請的內存位於物理內存映射區域,而且在物理上也是連續的,它們與真實的物理地址只有一個固定的偏移,因此存在較簡單的轉換關系。
(2).vmalloc()在虛擬內存空間給出一塊連續的內存區,實質上,這片連續的虛擬內存在物理內存中並不一定連續,而vmalloc()申請的虛擬內存和物理內存之間也沒有簡單的換算關系。
3.slab
一方面--完全使用頁為單元申請和釋放內存容易導致內存浪費。
另一方面---在操作系統的運作過程中,經常涉及大量對象的重復生成,使用和釋放內存問題。如果我們能夠用合適的方法使得在對象前後兩次被使用時分配在同一塊內存或同一類內存空間且保留了基本的數據結構,就可以大大提高效率。
slab使用范例:
/* 創建slab緩存 */
static kmem_cache_t *xxx_cachep;
xxx_cachep = kmem_cache_create("xxx", sizeof(struct xxx), 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL, NULL);
/* 分配slab緩存 */
struct xxx *ctx;
ctx = kmem_cache_alloc(xxx_cachep, GFP_KERNEL);
.../* 使用slab緩存 */
/* 釋放slab緩存 */
kmem_cache_free(xxx_cachep, ctx);
/* 回收slab緩存 */
kmem_cache_destory(xxx_cachep);
4.內存池---用於分配大量小對象的後備緩存技術