亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關(guān)注微信公眾號(hào)

Linux slab 分配器詳解3
2007-06-21   中國(guó)IT實(shí)驗(yàn)室

在創(chuàng)建緩存之后, kmem_cache_create 函數(shù)會(huì)返回對(duì)它的引用。注意這個(gè)函數(shù)并沒有向緩存分配任何內(nèi)存。相反,在試圖從緩存(最初為空)分配對(duì)象時(shí),refill 操作將內(nèi)存分配給它。當(dāng)所有對(duì)象都被使用掉時(shí),也可以通過相同的操作向緩存添加內(nèi)存。

  kmem_cache_destroy

  內(nèi)核函數(shù) kmem_cache_destroy 用來銷毀緩存。這個(gè)調(diào)用是由內(nèi)核模塊在被卸載時(shí)執(zhí)行的。在調(diào)用這個(gè)函數(shù)時(shí),緩存必須為空。

  void kmem_cache_destroy( struct kmem_cache *cachep );

  kmem_cache_alloc

  要從一個(gè)命名的緩存中分配一個(gè)對(duì)象,可以使用 kmem_cache_alloc 函數(shù)。調(diào)用者提供了從中分配對(duì)象的緩存以及一組標(biāo)志:

  void kmem_cache_alloc( struct kmem_cache *cachep, gfp_t flags );

  這個(gè)函數(shù)從緩存中返回一個(gè)對(duì)象。注意如果緩存目前為空,那么這個(gè)函數(shù)就會(huì)調(diào)用 cache_alloc_refill 向緩存中增加內(nèi)存。 kmem_cache_alloc 的 flags 選項(xiàng)與 kmalloc 的 flags 選項(xiàng)相同。表 2 給出了標(biāo)志選項(xiàng)的部分列表。

  表 2. kmem_cache_alloc 和 kmalloc 內(nèi)核函數(shù)的標(biāo)志選項(xiàng)

標(biāo)志 說明
GFP_USER 為用戶分配內(nèi)存(這個(gè)調(diào)用可能會(huì)睡眠)。
GFP_KERNEL 從內(nèi)核 RAM 中分配內(nèi)存(這個(gè)調(diào)用可能會(huì)睡眠)。
GFP_ATOMIC 使該調(diào)用強(qiáng)制處于非睡眠狀態(tài)(對(duì)中斷處理程序非常有用)。
GFP_HIGHUSER 從高端內(nèi)存中分配內(nèi)存。

  kmem_cache_zalloc

  內(nèi)核函數(shù) kmem_cache_zalloc 與 kmem_cache_alloc 類似,只不過它對(duì)對(duì)象執(zhí)行 memset 操作,用來在將對(duì)象返回調(diào)用者之前對(duì)其進(jìn)行清除操作。

  kmem_cache_free

  要將一個(gè)對(duì)象釋放回 slab,可以使用 kmem_cache_free.調(diào)用者提供了緩存引用和要釋放的對(duì)象。

void kmem_cache_free( struct kmem_cache *cachep, void *objp );

  kmalloc 和 kfree

  內(nèi)核中最常用的內(nèi)存管理函數(shù)是 kmalloc 和 kfree 函數(shù)。這兩個(gè)函數(shù)的原型如下:

void *kmalloc( size_t size, int flags );
void kfree( const void *objp );

  注意在 kmalloc 中,惟一兩個(gè)參數(shù)是要分配的對(duì)象的大小和一組標(biāo)志(請(qǐng)參看 表 2 中的部分列表)。但是 kmalloc 和 kfree 使用了類似于前面定義的函數(shù)的 slab 緩存。kmalloc 沒有為要從中分配對(duì)象的某個(gè) slab 緩存命名,而是循環(huán)遍歷可用緩存來查找可以滿足大小限制的緩存。找到之后,就(使用 __kmem_cache_alloc)分配一個(gè)對(duì)象。要使用 kfree 釋放對(duì)象,從中分配對(duì)象的緩存可以通過調(diào)用 virt_to_cache 確定。這個(gè)函數(shù)會(huì)返回一個(gè)緩存引用,然后在 __cache_free 調(diào)用中使用該引用釋放對(duì)象。

  其他函數(shù)

  slab 緩存 API 還提供了其他一些非常有用的函數(shù)。 kmem_cache_size 函數(shù)會(huì)返回這個(gè)緩存所管理的對(duì)象的大小。您也可以通過調(diào)用 kmem_cache_name 來檢索給定緩存的名稱(在創(chuàng)建緩存時(shí)定義)。緩存可以通過釋放其中的空閑 slab 進(jìn)行收縮。這可以通過調(diào)用 kmem_cache_shrink 實(shí)現(xiàn)。注意這個(gè)操作(稱為回收)是由內(nèi)核定期自動(dòng)執(zhí)行的(通過 kswapd)。

unsigned int kmem_cache_size( struct kmem_cache *cachep );
const char *kmem_cache_name( struct kmem_cache *cachep );
int kmem_cache_shrink( struct kmem_cache *cachep );

  slab 緩存的示例用法

  下面的代碼片斷展示了創(chuàng)建新 slab 緩存、從緩存中分配和釋放對(duì)象然后銷毀緩存的過程。首先,必須要定義一個(gè) kmem_cache 對(duì)象,然后對(duì)其進(jìn)行初始化(請(qǐng)參看清單 1)。這個(gè)特定的緩存包含 32 字節(jié)的對(duì)象,并且是硬件緩存對(duì)齊的(由標(biāo)志參數(shù) SLAB_HWCACHE_ALIGN 定義)。

熱詞搜索:

上一篇:Linux slab 分配器詳解2
下一篇:Linux slab 分配器詳解4

分享到: 收藏