slab in linux

linux buffer management를 보다보니 slab이란 용어가 나옴.
예전에 용책임이 slab이란 말을 했고, 리눅스에서 메모리 확인할 때 slab info를 쓴다는 말을 들었는데 그게 뭘까 해서 찾아 봄.

slab은 커널 내부에서 메모리 관리를 할때 사용하는 방식.
– slab는 일반적인 메모리 관리 layer
– slab은 여러개의 cache로 이루어지는데 각각의 cache는 cache되는 object type 마다 1개씩 존재함. 즉 inode용 cache, skbuffer용 cache 등..
– 하나의 cache는 1개 혹은 그 이상의 물리적으로 연속된 page로 구성됨. 대개 1개 임.
-> 이렇게 때문에 memory fragmentation이 발생하지 않는다고 하는데 아마도 fragmentation의 기준을 page로 삼기 때문이 아닌가 싶음. 좀 더 확인 필요.
– cache마다 full, partial, empty등의 속성이 있어 메모리 할당이 요구되는 경우 partial 혹은 empty에서 할당됨
– 2.2 부터 memory fragmentation을 처리하기 위해 도입됨.
-> 그 전에는 buddy system으로 구성됨. 그러나 작은 크기의 데이터할당이 많은 경우 buddy system은 internal fragmentation 문제를 가짐.
– vmstat -m

* Internal fragmentation : 실제 필요한 것보다 많이 할당해서 낭비되는 경우. 예를 들어 buffer의 크기를 무조건 2K씩 할당하는 경우 2K보다 작은 경우는 (2k – 실제 데이터 크기) 만큼의 낭비가 발생한다.
* External fragmentation : 실제 메모리 공간에서 남아 있는 공간의 합은 충분하지만 할당되지 않은 공간들이 여러 곳에 산재해 있어 하나의 버퍼로 사용될 수 없는 경우.

학교 다닐 때 공부했던 단어를 다시 들으니 기분이 ..

Buddy system

참고
http://www.inf.fu-berlin.de/lehre/SS01/OS/Lectures/Lecture14.pdf
Linux kernel Development
http://kerneltrap.org/node/5336 budy and slab allocators.
http://www.linuxworld.com.au/article/189774/slab_defragmentation?fp=4194304&fpid=1 slab defragmentation
http://en.wikipedia.org/wiki/Slab_allocation