核心緩衝區slab的管理

2021-06-20 14:47:31 字數 1267 閱讀 5011

剛看了下linux核心情景分析中的核心緩衝區管理,現在做個小總結,有不當之處,請大家不吝賜教。

在linux核心中,對於大塊的記憶體的管理是用夥伴系統演算法(buddy )管理。對於小塊的記憶體則用slab管理。

在slab方法中,每種重要的資料結構都有自己專用的緩衝區佇列。每個佇列中的「物件」的個數是動態變化的,不夠時可以增添,空閒的時候可以釋放,給系統**。

slab中,每種物件的緩衝區佇列並非由各種各個物件直接構成,而是由一連串的"大塊"(slab結構)組成,每個大塊中包含若干個物件。slab結構如下:

struct   slab_s{

struct list_headlist;//用來將slab鏈入專用的緩衝區佇列

unsigned  long colouroff;//本slab上著色區的大小

void *s_mem;    //本slab對像區的起點

unsigned intinust;//已分配物件個數

kmem_bufctl_tfree;

}每種物件建立的slab佇列都有個佇列頭。結構是kmem_cache_t,該結構除了維持slab指標外還記錄一些該物件的引數。系統中有個總的slab佇列,其物件是其他物件的佇列頭。稱為cache_cache。

不是核心所有的資料結構都專用的緩衝區佇列。不太常用的資料結構使用通用的緩衝區佇列,稱為slab_cache。通用緩衝池的分配和釋放函式:

void  kmalloc(size,  flags)

void   free(void  *objp);

1. 專用緩衝區的建立

kmem_cache_create(name,size,......);

該函式只是建立所需專用快取佇列的基礎設施,所形成的slab佇列是個空佇列。而具體slab的建立則需要等分配時建立。

2. 緩衝區的分配

void  *kmem_cache_alloc(kmem_cache_t  *,  flag)

該函式找到第乙個空閒的slab,然後從slab的找到空閒佇列,從該slab中分配乙個物件,修改slab中free值,表示物件已分配。

3. 緩衝區物件釋放

void  kmem_cache_free(void  *)

找到該物件所屬slab,然後釋放。調整slab所在的佇列。

4. 緩衝區的銷毀

void  kmem_cache_free()

slab緩衝區中物件的組成示意圖:

使用者程序緩衝區和核心緩衝區

常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...

核心緩衝區應用

include define fifo size 1024 typedef struct tags fifo s fifo int fifo min unsigned int ulfirstdat,unsigned int ulsndvalue else int fifo init s fifo p...

cout緩衝區管理

下面的程式是在vector中找元素,找到返回1,否則返回0 同時求出其相對位移vector difference type dif.include include include include using namespace std bool search vector iterator beg,...