OS이야기
슬랩 할당자 사용예제
НooпeУ
2011. 10. 20. 14:15
task_struct 구조체를 사용하는 실제적인 예제를 살펴보자.
<kernel/fork.c>
우선, 커널에는 task_struct캐시의 포인터를 저장하는 전역변수가 있다.
kmem_cache_t *task_struct_cachep;
fork_init()에 있는 커널 초기화 과정에서 캐시가 생성된다.
task_struct_cachep = kmem_cache_create("task_struct", sizeof(struct task_struct),
ARCH_MIN_TASKALIGN, SLAB_PANIC,NULL,NULL);
이 코드는 task_struct라는 이름의 캐시를 생성하며, 이 캐시에는 struct task_struct 유형의 객체가 저장된다. 이 객체는 슬랩 안에서 기본 옵셋인 ARCH_MIN_TASKALIGN 바이트 위치에 생성된다. 이 전처리기 값은 아키텍처마다 다르지만, 대개 L1_CACHE_BYTES, 즉 L1캐시의 바이트 크기로 설정된다. 여기에는 생성자,소멸자는 없다. 또한 SLAB_PANIC 플래그를 설정했으므로 리턴값이 NULL, 즉 할당이 실패했음을 체크하는 부분이 없다는 점에 유의하자. 만약 할당이 실패하면 슬랩 할당자는 panic를 호출한다. 만약 이 플래그를 설정하지 않는다면 반드시 리턴값을 체크해야한다.
여기서 SLAB_PANIC 플래그를 사용하는 이유는 이것이 시스템 운영에 꼭 필요한 캐시이기 때문이다.
프로세스가 fork()를 호출할 때마다 새로운 프로세스 서술자가 생성되어야한다. 이 작업은 dup_task_struct()에서 이뤄지며, 이 함수는 do_fork()에서 호출된다.
struct task_struct *tsk;
tsk = kmeme_cache_alloc(task_struct_cachep, GFP_KERNEL);
if(!tsk)
return NULL;
다 사용하고 슬랩 캐시에 반환.
kmem_cache_free(task_struct_cachep, tsk);
프로세스 서술자는 코어 커널의 일부이며 항상 필요하므로, task_struct_cachep 캐시는 절대로 소멸되지 않는다.
그러나 다음과 가틍ㄴ 코드를 사용하여 소멸시킬수 있다.
int err;
err = kmem_cache_destroy(task_struct_cachep);
<kernel/fork.c>
우선, 커널에는 task_struct캐시의 포인터를 저장하는 전역변수가 있다.
kmem_cache_t *task_struct_cachep;
fork_init()에 있는 커널 초기화 과정에서 캐시가 생성된다.
task_struct_cachep = kmem_cache_create("task_struct", sizeof(struct task_struct),
ARCH_MIN_TASKALIGN, SLAB_PANIC,NULL,NULL);
이 코드는 task_struct라는 이름의 캐시를 생성하며, 이 캐시에는 struct task_struct 유형의 객체가 저장된다. 이 객체는 슬랩 안에서 기본 옵셋인 ARCH_MIN_TASKALIGN 바이트 위치에 생성된다. 이 전처리기 값은 아키텍처마다 다르지만, 대개 L1_CACHE_BYTES, 즉 L1캐시의 바이트 크기로 설정된다. 여기에는 생성자,소멸자는 없다. 또한 SLAB_PANIC 플래그를 설정했으므로 리턴값이 NULL, 즉 할당이 실패했음을 체크하는 부분이 없다는 점에 유의하자. 만약 할당이 실패하면 슬랩 할당자는 panic를 호출한다. 만약 이 플래그를 설정하지 않는다면 반드시 리턴값을 체크해야한다.
여기서 SLAB_PANIC 플래그를 사용하는 이유는 이것이 시스템 운영에 꼭 필요한 캐시이기 때문이다.
프로세스가 fork()를 호출할 때마다 새로운 프로세스 서술자가 생성되어야한다. 이 작업은 dup_task_struct()에서 이뤄지며, 이 함수는 do_fork()에서 호출된다.
struct task_struct *tsk;
tsk = kmeme_cache_alloc(task_struct_cachep, GFP_KERNEL);
if(!tsk)
return NULL;
다 사용하고 슬랩 캐시에 반환.
kmem_cache_free(task_struct_cachep, tsk);
프로세스 서술자는 코어 커널의 일부이며 항상 필요하므로, task_struct_cachep 캐시는 절대로 소멸되지 않는다.
그러나 다음과 가틍ㄴ 코드를 사용하여 소멸시킬수 있다.
int err;
err = kmem_cache_destroy(task_struct_cachep);