2011. 10. 20. 13:50
슬랩 할당자 인터페이스 OS이야기2011. 10. 20. 13:50
kmem_cache_t * kmem_create(const char *name, size_t size, size_t align, unsigned long flags,
void (*ctor)(void *, kmem_cache_t *, unsigned long),
void (*dtor)(void *, kmem_cache_t *, unsigned long))
첫 번째 매개변수는 캐시의 이름을 저장하는 문자열이다. 두번째는 캐시에 있는 각요소의 크기, 세번째는 슬랩 안에 있는 첫번째 객체의 오프셋, 이 값은 페이지 내에서 객체를 특정한 위치로 정렬하는데 사용된다. 하지만 일반적인 경우는 0을 사용한다. flags매겹눗는 캐시의 동작을 조절하는 옵션을 지정한다. 이 매개변수에 0을 사용하면 아무런 동작을 지정하지 않은 것이 되며, 혹은 다음에 나오는 플래그를 하나 이상 OR하여 사용할수 있다.
SLAB_NO_REAP
void (*ctor)(void *, kmem_cache_t *, unsigned long),
void (*dtor)(void *, kmem_cache_t *, unsigned long))
첫 번째 매개변수는 캐시의 이름을 저장하는 문자열이다. 두번째는 캐시에 있는 각요소의 크기, 세번째는 슬랩 안에 있는 첫번째 객체의 오프셋, 이 값은 페이지 내에서 객체를 특정한 위치로 정렬하는데 사용된다. 하지만 일반적인 경우는 0을 사용한다. flags매겹눗는 캐시의 동작을 조절하는 옵션을 지정한다. 이 매개변수에 0을 사용하면 아무런 동작을 지정하지 않은 것이 되며, 혹은 다음에 나오는 플래그를 하나 이상 OR하여 사용할수 있다.
SLAB_NO_REAP
이 플래그는 시스템 메모ㅓ리가 부족할 때에도 자동으로 객체를 거둬들이지 않도록 지정한다.
이 플래그를 사용하면 메모리가 부족할 때 운영체제가 충분한 메모리를 확보할 수 있는 활로가 막히게 되므로, 가급적 사용하지 않는다.
SLAB_HWCACHE_ALIGN
이 플래그는 슬랩 레이어 내부의 각 객체를 캐시 라인에 정렬시키도록 지시한다.
이것은 "잘못된 공유(서로 다른 메모리 주소에 존재하는 둘이상의 객체가 같은 캐시 라인에 매핑되는 현상)"를 방지한다.
아! 하나의 타입에는 하나의 캐시가 물리는데, 여기서 잘못된 공유라 함은, 다른 타입의 객체가 하나의 캐시에 물리는 현상을 말하는구나
그 결과 성능은 향상되지만, 엄격한 정ㄹ렬로 인해 낭비되는 느슨한(slack) 공간이 늘어나게 된다. 메모리 소비는 객체의 크기와 그 객체가 시스템 캐시 라인에 대해 어떻게 정렬되어 있는가에 따라 달라지게 된다. 성능이 중요하다면, 자주 사용되는 캐시에 이 옵션을 설정하는 것이 좋다.
SLAB_MUST_HWCAHCE_ALIGN
디버깅이 활성화 된 경우에는 캐시에 대한 객체 정렬이 이루어지지 않는다. 이 플래그는 슬랩 레이어가 객체를 캐시 라인에 정렬하도록 강제한다. 디버깅이 활성화 된 경우가 아니라면 이 플래그 대신 앞으 ㅣ플래그를 사용하면 충분하다. 슬랩 디버깅이 활성화된 상태에서 이플래그를 지정하면 메모리 소비가 대량으로 늘어나게 된다.
SLAB_POSION
슬랩 레이어를 알려진 값(a5a5a5a5)으로 채운다. 이 작업은 poisioning이라 불리며 초기화되지 않은 메모리로의 접근을 잡아내기 위해 사용된다.
SLAB_RED_ZONE
슬랩 레이어로 하여금 할당된 메모리 주변에 "레드 존"을 삽입토록하여 버퍼 오버런(버퍼 오버플로우)을 탐지하기 쉽도록 한다.
SLAB_PANIC
할당이 실패한 경우 슬랩 레이어가 패닉을 내게 한다. 이 플래그는 할당이 절대로 실패하지 않아야 하는 경우, 즉 예를 들어 부팅시 VMA구조체 캐시를 할당하는 경우에 유용하다.
SLAB_CAHCE_DMA
이 플래그는 슬랩 레이어로 하여금 각 슬랩 DMA 가능한 메모리 상에 할당되도록 지시한다. 이 플래그는 할당된 객체가 DMA사용되며 ZONE_DMA 영역에 있는 경우에만 필요하게 된다. 이러한 경우가 아니라면 이 플래그를 사용할 필요도 없으며, 사용해서도 안된다.
마지막 매개변수는 ctor ,dtor는 각각 캐시의 생성자 및 소멸자읻. 생성자는 새로운 페이지가 캐시에 추가될 때마다, 소멸자는 페이지가 캐시에서 제거될 때마다 호출된다. ctor->creator , dtor - >destructor
리눅스의 커널의 캐시들은 이러한 생성자나 소멸자를 잘 활용하지 않으므로 두 매개변수에 모두 NULL을 지정한다.
성공적으로 실행도는 경우 kmem_cache_create() 함수는 생성된 캐시의 포인터를 리턴하고. 실패하면 NULL을 리턴한다.
또한 이 함수는 휴면할 수 있으므로 인터럽트 컨텍스트에서 사용할 수 없다. 캐시르 ㄹ소멸시키려면 다음 함수를 호출한다.
int kmem_cache_destroy(kmem_cache_t * cachep)
이 함수는 일반적으로 자신의 캐시를 생성하는 모듈이 셧다운 코드에서 호출된다. 이 함수 역시 휴면할 수 있으므로 인터럽트 컨텍스트에서 사용할 수 없다. 또한 이 함수를 사용하는 호출자는 함수 호출 전에 다음의 두 조건이 만족되는 것을 확인해야 한다.
- 캐시에 있는 모든 슬랩이 비어 있어야 한ㄷ. 슬랩 중 객체가 여전히 할당되어 사용 중이라면 어떻게 캐시를 소멸시키나?
- kmem_cache_destroy()를 호출하는 동안 그 누구도 캐시에 접근해서는 안된다. 이러한 동기화는 호출자에 의해 이루어져야 한다. 성공하면 0을 리턴
생성된 캐시에 객체를 얻기 위해서는 다음 함수를 사용한다.
void *kmem_cache_alloc(kmem_cache_t *cachep, int flags)
이 함수는 지정된 캐시 cachep로부터 객체의 포인터를 리턴한다(형변환해서 사용하면 됨). 캐시 내의 어느 슬랩에도 가용한 객체가 없다면 슬랩 레이어는 kmem_getpages()를 통해 새 페이지를 확보해야 하며, 이 때 flags가 __get_free_pages()에 매개변수로 전달된다. 이 플래그는 앞에서 살펴본 것과 동일하다. 아마 우리는 GFP_KERNEL이나 GFP_ATOMIC을 사용하면 될것이다.
객체 반납
void kmem_cache_free(kmem_cache_t *cachep, void *objp);
이 함수는 cachep내의 객체 objp를 가용한 상태로 표시한다.
SLAB_HWCACHE_ALIGN
이 플래그는 슬랩 레이어 내부의 각 객체를 캐시 라인에 정렬시키도록 지시한다.
이것은 "잘못된 공유(서로 다른 메모리 주소에 존재하는 둘이상의 객체가 같은 캐시 라인에 매핑되는 현상)"를 방지한다.
아! 하나의 타입에는 하나의 캐시가 물리는데, 여기서 잘못된 공유라 함은, 다른 타입의 객체가 하나의 캐시에 물리는 현상을 말하는구나
그 결과 성능은 향상되지만, 엄격한 정ㄹ렬로 인해 낭비되는 느슨한(slack) 공간이 늘어나게 된다. 메모리 소비는 객체의 크기와 그 객체가 시스템 캐시 라인에 대해 어떻게 정렬되어 있는가에 따라 달라지게 된다. 성능이 중요하다면, 자주 사용되는 캐시에 이 옵션을 설정하는 것이 좋다.
SLAB_MUST_HWCAHCE_ALIGN
디버깅이 활성화 된 경우에는 캐시에 대한 객체 정렬이 이루어지지 않는다. 이 플래그는 슬랩 레이어가 객체를 캐시 라인에 정렬하도록 강제한다. 디버깅이 활성화 된 경우가 아니라면 이 플래그 대신 앞으 ㅣ플래그를 사용하면 충분하다. 슬랩 디버깅이 활성화된 상태에서 이플래그를 지정하면 메모리 소비가 대량으로 늘어나게 된다.
SLAB_POSION
슬랩 레이어를 알려진 값(a5a5a5a5)으로 채운다. 이 작업은 poisioning이라 불리며 초기화되지 않은 메모리로의 접근을 잡아내기 위해 사용된다.
SLAB_RED_ZONE
슬랩 레이어로 하여금 할당된 메모리 주변에 "레드 존"을 삽입토록하여 버퍼 오버런(버퍼 오버플로우)을 탐지하기 쉽도록 한다.
SLAB_PANIC
할당이 실패한 경우 슬랩 레이어가 패닉을 내게 한다. 이 플래그는 할당이 절대로 실패하지 않아야 하는 경우, 즉 예를 들어 부팅시 VMA구조체 캐시를 할당하는 경우에 유용하다.
SLAB_CAHCE_DMA
이 플래그는 슬랩 레이어로 하여금 각 슬랩 DMA 가능한 메모리 상에 할당되도록 지시한다. 이 플래그는 할당된 객체가 DMA사용되며 ZONE_DMA 영역에 있는 경우에만 필요하게 된다. 이러한 경우가 아니라면 이 플래그를 사용할 필요도 없으며, 사용해서도 안된다.
마지막 매개변수는 ctor ,dtor는 각각 캐시의 생성자 및 소멸자읻. 생성자는 새로운 페이지가 캐시에 추가될 때마다, 소멸자는 페이지가 캐시에서 제거될 때마다 호출된다. ctor->creator , dtor - >destructor
리눅스의 커널의 캐시들은 이러한 생성자나 소멸자를 잘 활용하지 않으므로 두 매개변수에 모두 NULL을 지정한다.
성공적으로 실행도는 경우 kmem_cache_create() 함수는 생성된 캐시의 포인터를 리턴하고. 실패하면 NULL을 리턴한다.
또한 이 함수는 휴면할 수 있으므로 인터럽트 컨텍스트에서 사용할 수 없다. 캐시르 ㄹ소멸시키려면 다음 함수를 호출한다.
int kmem_cache_destroy(kmem_cache_t * cachep)
이 함수는 일반적으로 자신의 캐시를 생성하는 모듈이 셧다운 코드에서 호출된다. 이 함수 역시 휴면할 수 있으므로 인터럽트 컨텍스트에서 사용할 수 없다. 또한 이 함수를 사용하는 호출자는 함수 호출 전에 다음의 두 조건이 만족되는 것을 확인해야 한다.
- 캐시에 있는 모든 슬랩이 비어 있어야 한ㄷ. 슬랩 중 객체가 여전히 할당되어 사용 중이라면 어떻게 캐시를 소멸시키나?
- kmem_cache_destroy()를 호출하는 동안 그 누구도 캐시에 접근해서는 안된다. 이러한 동기화는 호출자에 의해 이루어져야 한다. 성공하면 0을 리턴
생성된 캐시에 객체를 얻기 위해서는 다음 함수를 사용한다.
void *kmem_cache_alloc(kmem_cache_t *cachep, int flags)
이 함수는 지정된 캐시 cachep로부터 객체의 포인터를 리턴한다(형변환해서 사용하면 됨). 캐시 내의 어느 슬랩에도 가용한 객체가 없다면 슬랩 레이어는 kmem_getpages()를 통해 새 페이지를 확보해야 하며, 이 때 flags가 __get_free_pages()에 매개변수로 전달된다. 이 플래그는 앞에서 살펴본 것과 동일하다. 아마 우리는 GFP_KERNEL이나 GFP_ATOMIC을 사용하면 될것이다.
객체 반납
void kmem_cache_free(kmem_cache_t *cachep, void *objp);
이 함수는 cachep내의 객체 objp를 가용한 상태로 표시한다.
'OS이야기' 카테고리의 다른 글
런타임에서의 CPU별 데이터 (0) | 2011.10.20 |
---|---|
슬랩 할당자 사용예제 (0) | 2011.10.20 |
kmem_pages(kmem_cache_t *cachep, int flags, int nodeid) (0) | 2011.10.20 |
슬랩 레이어 (0) | 2011.10.19 |
vmalloc() (0) | 2011.10.19 |