'slab allocator'에 해당되는 글 2건

  1. 2012.10.21 initarray_cache vs arraycache_init
  2. 2012.10.03 Slab allocator (슬랩 할당자)
리눅스/커널2012. 10. 21. 23:51

slab allocation에서 나오는 두개가 헷갈렸었는데, 찾아보니 별거 아니였다.


initarray_cache는


arraycache_init는


결국, initarray_cache는 arraycache_init 타입으로 정적으로 만들어져 initdata 영역에 미리 준비되는(cache_cache 생성시 필요) 것이었다.

'리눅스 > 커널' 카테고리의 다른 글

VFS(1) -추상적 레이어-  (0) 2012.12.08
make menuconfig 시에 원하는 옵션 찾아보기  (0) 2012.11.30
BYTES_PER_WORD  (0) 2012.10.15
Newton-Raphson technique  (0) 2012.10.15
linux kernel, mem_init()  (0) 2012.10.05
Posted by code cat
리눅스/커널2012. 10. 3. 00:45

출처: 리눅스 커널 내부구조

리눅스에서 메모리의 최소 할당 단위는 페이지 프레임이라고 알고 있다.  근데 만약 그 이하의 공간이 필요할 때는 어떻게 하는 게 좋을까?  그냥  4kb 던져주는게 좋을까?  말할것도 없이 공간낭비이다.

 

대신 미리 정해진 사이즈의 cache를 가지고 있다가 필요할 때 할당한다면 어떨까?  32byte에서 2의 오더로 128kb 까지 유지해서 말이다.

 

각 cache들은 슬랩들로 구성되고, 슬랩은 다시 객체(Object)들로 구성된다.

 

예를 들어 64byte cache이면,

Object (64byte) --> slab (full/free/partial) --> cache

와 같은 구조로 이루어져 있다.  64byte 공간들이 각각의 객체이고, 이 객체들이 슬랩이 되고, 이 슬랩들이 cache가 되는 것이다.

 

참고로 리눅스는 다양한 크기의 캐시를 효율적으로 관리하기 위해 kmem_cache_t라는 자료 구조를 만들어 두었고, 새로운 캐시를 생성시에 kmem_cache_t라는 구조체로부터 할당 받는다.  이 때 슬랩할당자로부터 할당받는 것이다.

kmem_cache_t 구조체 크기의 객체를 담고 있는 cache의 이름이 cache_cache이다.

당연히 cache_cache는 다른 캐시들보다 먼저 생성되어야 한다(그래야 다른 캐시를 만들 때 할당이 가능하지 않겠는가?)  그 후에 cache_cache를 이용해서 kmem_cache_t를 위한 공간을 할당받아 다양한 캐시를 생성한다.

 

슬랩할당자는 이외에도 외부 인터페이스 함수로 kmalloc(), kfree()를 제공한다.(그래서 kmalloc()를 통해 한번에 할당 받는 최대 크기가 128k라는 걸 눈치 챘을 것이다.)

Posted by code cat