2007년 12월 07일
슬랩 할당자 (slab allocator)
http://blog.naver.com/sid39346/10024721801
1994년 Sun Microsystems의 Solaris 2.4 운영체제용으로 개발된 ‘슬랩 할당자(slab allocator)’라는 정책에서 유래했다. 이는 다음과 같은 전제에 바탕을 둔다.
1. 슬랩 할당자는 메모리 영역을 일련의 자료 구조와 생성자(constructor), 소멸자(destructor) 라는 두 메소드, 즉 메소드를 갖는 객체로 바라본다.
2. 객체를 반복해서 초기화하는 현상을 피하기 위해 슬랩 할당자는 할당된 후 해제된 객체를 폐기하지
않고 메모리에 그대로 둔다.
3. 효율성을 이유로 리눅스는 생성자나 소멸자 메소드를 필요로 하는 객체를 사용하지 않는다. 슬랩 할당자를 도입한 중요한 동기는 버디 시스템 할당자를 호출하는 횟수를 줄이려는 목적에서 출발했다.
따라서, 커널은 생성자와 소멸자 메소드를 지원하지만, 그 메소드에 대한 포인터는 NULL이다.
4.커널 함수는 동일한 유형의 메모리 영역을 반복해서 요청하는 경향이 있다. 리눅스는 이러한 유형을 캐시에 저장하고 재활용한다.
5. 버디시스템 함수를 호출할 때마다 하드웨어 캐시가 ‘더티(dirty)’해지므로 평균 메모리 접근 시간이 늘어난다.
6. 발자취(footprint) ; 커널 함수 하나가 하드웨어 캐시에 미치는 영향. 함수가 종료되었을 때 함수가 덮어쓴 캐시의 백분율로 정의. 이 값이 클수록 하드웨어 캐시는 쓰지 않는 정보로 채워지므로 커널 함수 수행 직후에 실행되는 코드가 늦게 수행된다.
1. Slab 할당자는 Object를 모아서 Cache를 만든다.
2. 각 Cache는 같은 자료형을 가진 Object의 창고다.
3. Cache가 들어 있는 메모리 영역은 ‘slab’으로 나눈다.
4. 각 슬랩은 연속된 페이지 프레임 하나 이상으로 구성되며(2^n으로 할당되는듯), 할당된 객체와 빈 객체를 모두 포함한다.
5. 같은 Cache에 있는 Slab은 동일한 페이지 프레임 수를 가진다.
-------------------------------------------------------------
슬랩 할당자의 상세 구현을 보면, 캐슁이 되는 객체의 사이즈가 작은 경우엔 슬랩내에 객체 정보를 두고 사이즈가 크면 슬랩밖에다가 객체 정보를 저장합니다. 이럴 경우에 슬랩 객체의 모양을 도식화한 그림입니다.
그리고 슬랩에서 말하는 컬러링의 이해를 돕는 그림인데, 이 그림을 이해할려면, 캐쉬 구조에 대한 이해가 선행되어야 합니다. 슬랩에 들어가 있는 객체가 매번 같은 위치에 존재한다면, 캐쉬의 특정부분에서 경쟁이 발생하게 되는데, 이것을 방지하기 위해서 슬랩은 컬러링이란 것을 사용합니다. 즉, 객체사이즈가 딱 슬랩공간에 맞아 떨어지는 것이 아니니, 빈공간이 존재하기 마련입니다. 이 빈공간(offset)에 각각의 슬랩들이 임의(캐쉬라인 사이즈의 배수)로 떨어지게 해서 캐쉬라인에 대한 경쟁을 줄이는 것이죠.
그리고 슬랩에서 말하는 컬러링의 이해를 돕는 그림인데, 이 그림을 이해할려면, 캐쉬 구조에 대한 이해가 선행되어야 합니다. 슬랩에 들어가 있는 객체가 매번 같은 위치에 존재한다면, 캐쉬의 특정부분에서 경쟁이 발생하게 되는데, 이것을 방지하기 위해서 슬랩은 컬러링이란 것을 사용합니다. 즉, 객체사이즈가 딱 슬랩공간에 맞아 떨어지는 것이 아니니, 빈공간이 존재하기 마련입니다. 이 빈공간(offset)에 각각의 슬랩들이 임의(캐쉬라인 사이즈의 배수)로 떨어지게 해서 캐쉬라인에 대한 경쟁을 줄이는 것이죠.

# by | 2007/12/07 16:17 | OS | 트랙백 | 덧글(1)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
설명이 넘 부족해여~~~