1. 슬랩이란?
슬랩이란 메모리 단편화를 최소화하기 위해 슬랩이라는 일정한 크기의 block단위로 메모리를 관리하는 기법이다.
보통 메모리 할당은 page 단위로 진행하고 보토의 경우 4KB단위 즉 4KB이하의 메모리에 대해서 4KB page 1개를 할당하는 것으로 이해하고 있으나
실제 커널에서는 이로인한 메모리 낭비가 많기 때문에 더 작은 slab단위로 메모리를 할당한다.
자주 할당하는 패턴에 대하여 미리 할당을 진행하고 free를 하더라도 다시 사용할 확률이 높아 따로 관리하는 등의 방법으로 빠른 메모리 할당과 메모리 공간의 효율성을 높이는데 슬랩 메모리할당 개념이 시작되었다.
1) 슬랩 캐시
슬랩 캐시란 위에서 언급한 바와 같이 자주 사용하는 패턴을 분석하여 미리 메모리 공간을 할당하고 관리하는 공간을 의미한다.
슬랩 캐시 공간에는 자주사용하는 패턴의 메모리 객체들이 이미 할당되어있고 만약 system이 해당 메모리를 요청하면 따로 할당없이 미리 할당된 메모리의 시작 주소 값만 리턴해줌으로써 속도에 향상을 가져온다.
2) 슬랩 오브젝트
슬랩 오브젝트란 위 슬랩 캐시가 이미 할당해놓은 공간 자체를 의미한다.
정리하면 자주사용하는 패턴의 메모리 할당을 빠르게 해주기 위해서 슬랩 캐시라는 공간을두고 슬랩 캐시 공간에서 슬랩 오브젝트를 미리 Alloc해서 이후에 요청이 들어오며 바로 사용할 수 있도록 준비해둔다.
또한 슬랩의 경우 full, partial, empty로 나눌 수 있는데
full - 처음 생성된 슬랩 partial - 슬랩 오브젝트가 하나라도 사용중인 상황 empty - 슬랩 오브젝트가 모두 사용되고 있는 상황 |
이러한 슬랩도 한가지 문제점이 존재하는데 이는 바로 슬랩의 메타데이터가 너무 큰 공간을 차지한다는 것이다. 이로인해 과도한 메모리를 사용하는 메모리 낭비가 발생하고 있다.
<출처 : http://jake.dothome.co.kr/slub/#comment-304534>
정리하면 위와같이 슬랩 캐시들이 존재하고 각각의 캐시안에는 슬랩 페이지 그리고 페이지에 하나하나 할당가능한 최소크기가 슬랩 오브젝트이다.
슬랩 오브젝트를 미리 alloc시켜두고 kmalloc등으로 요청시에 사용자에게 시작 주소를 리턴해줌으로써 커널 메모리 할당의 시간을 단축시킬 수 있다.
2. 슬럽
슬럽은 슬랩과 유사하나 슬랩의 메타데이터 메모리 낭비를 해결하기위해 메타데이터 메모리 낭비를 최소화한 구조이다.
메타데이터 규모를 줄이기 위해 partial status만 사용하며 이미 존재하는 page 구조체 배열로 구성된 메모리맵을 이용한다.
임베디드, 모바일 시스템에서 default로 사용한다.
3. 슬롭
메모리 낭비를 극도로 최소화한 방법으로 할당 속도가 가장 느리나 메모리 소모가 가장 적다.
4. kmem_cache
kmem_cache는 커널 메모리 슬랩 캐시로 미리 할당하고 필요에의해 빠르게 메모리 공간을 요청한 프로세스에 제공하는 역할을 진행한다.
1) kmem_cache_init()
kmem_cache_init()은 부트초반과정에 슬랩 캐시를 할당하고 슬랩에 사용되는 구조체들을 할당하는 과정을 진행한다.
부트 초반에는 슬랩 캐시구조가 정상적으로 완료되지 않았기 때문에 부트업 캐시를 사용하게 된다. 이러한 구조체들은 모두 부팅초반에 사용하는 임시 객체들로써 나중에 모두 삭제된다.
과정에서 kmalloc 캐시 인덱스 테이블또한 생성이되는데
<http://jake.dothome.co.kr/kmalloc/>
커널에서 메모리 할당을 요청하는 kmalloc의 경우 아주 작은 size의 요청이 빈번하고 메모리 낭비를 막기 위해 아주 작은 사이즈에 대한 할당도 지원한다. 자주 사용되는 size별로 위와같이 할당을 진행하여두고 사용자가 요청하는 메모리 request size를 분기를통해서 적절한 슬랩 오브젝트가 존재하는 슬랩 캐시공간으로 연결시켜준다.
<http://jake.dothome.co.kr/kmalloc/>
커널 코드를 작성할 때 kmalloc을 사용하면 8K이하에 대해서는 미리 할당된 슬랩 캐시를 이용해서 사용자가 요청한 사이즈에 적합한 슬랩 오브젝트를 연결시켜주고 8K이상의 큰 사이즐르 요청하는 경우에는 슬랩 할당자가아닌 버디를 통해서 메모리 할당을 진행한다.
- ref
코드로알아보는 ARM 리눅스 커널
http://egloos.zum.com/rousalome/v/10001242
https://wogh8732.tistory.com/420
'OS > Linux' 카테고리의 다른 글
[Linux Kernel] Kernel 분석(v5.14.16) - Kmalloc & vmalloc (0) | 2022.08.14 |
---|---|
[Linux Kernel] Kernel 분석(v5.14.16) - 워터마크 (0) | 2022.05.29 |
[Linux Kernel] Kernel 분석(v5.14.16) - NUMA, Zone Allocation (2) (0) | 2022.05.09 |
[Linux Kernel] Kernel 분석(v5.14.16) - NUMA, Zone Allocation (1) (0) | 2022.05.01 |
[Linux Kernel] Kernel 분석(v5.14.16) - pcp (0) | 2022.03.26 |