글 수 117
setup_arch이후로 간만에 강력한 녀석을 만난것 같군요..^^ㅋ
여튼 나름 슬랩에대한 전체적인 그림을 그릴수 있었던 시간이였던 것 같습니다.
slub으로 최신 커널에서는 약간 개선 되었다고 하는데 자세한것은 잘 모르겠군요~
간략히 정리해보면
struct kmem_cache 구조체가 슬랩의 핵심 자료구조이다.
모든 슬랩당 하나의 kmem_cache 자료구조를 가지고 있다.
그러면 kmem_cache 구조체 조차도 메모리를 차지할텐데 이녀석의 슬랩을 담당하는 것이
cache_cache전역 변수이다. 이녀석또한 kmem_cache 자료형이다.
kmem_cache 구조체안에 struct array_cache 자료형을 멤버 변수로 가지고 있다. 실제 버디 시스템에서 메모리를 미리 할당받아서 array_cache 구조체의 entry멤버 변수에 메모리를 가져다 놓고 여기서 사용자가 슬랩에 메모리를 요청할때마다 가용한 메모리를 떼어다 주게 된다.
struct kmem_list3와 struct slab 자료구조도 있는데 아직 정확히 어떻게 사용되는지 파악 중이다.^^;..
일단 kmem_cache_init에서
1. cache_cache를 만든다. kmem_cache 자료구조를 위한 슬랩을 생성한다.
2+3. kmalloc 를 위한 kmem_cache를 만든다. 이때 cache_cache슬랩에서 kmem_cache구조체의 메모리를 할당받는다. 이때 사용되는 함수가 kmem_cache_create()함수이다. 간략히 cache_cache로부터 kmem_cache메모리를 할당받고 구조체의 내용을 채워주는 역할을 한다. 다음주에 세세히 분석할 예정이다.
malloc_sizes 와 cache_names 에 해당하는 kmem_cache구조체를 만든다. 즉 kmalloc()를 위함 슬랩을 생성하는 것이다. 32,64,96,128,.....등등 아키텍쳐별로 15~20정도를 만들게 된다. 따라서 우리가 kmalloc()를 호출하여 메모리를 얻어오는 것은 이 해당하는 크기의 메모리의 슬랩에서 가져오는 것과 마찬가지이다. 만약 슬랩에 메모리가 부족하다면 버디시스템으로부터 메모리를 확장시키게 되는데 이를 수행하는 함수가 cache_grow함수정도가 되겠다. 아직 어느정도로 확장시키는지 하는 정책은 확인되지 않았다.
4+5. 사실상 제대로 슬랩에서 메모리를 할당하기 위해서는 kmem_list3 구조체와 array_cache 자료구조또한 메모리가 할당되어 있어야 한다. 하지만 초기에는 이런것들이 없으므로 전역변수로 초기화에 필요한 녀석들만 init섹션으로 정의가 되어 있다. 따라서 이런녀석들을 kmalloc으로 할당받아 대치시킨다. 나중에 init섹션은 없어져 버리기 때문이다. 현재 전역변수로 정의되어 있는 kmem_list3와 array_cache는 (cache_cache용과 kmalloc용( sizeof(kmem_list3), sizeof(array_cache) 이 정의 되어 있다.) 따라서 현재 상태에서 kmalloc으로 이 두 구조체의 메모리를 할당 할 수 있다. 다른 크기의 메모리는 아직 할당할 수 없다.(이 두구조체가 존재하지 않으므로)
6. 다음주부터..^^..추측상으로는 아직 만들지않은 다른 녀석들의 array_cache와 kmem_list3등을 만들고 뭐 이것저것 하지 않을까추측.
다음주부터는 슬랩 나머지를 분석하구..kmem_cache_create()차근차근 분석해보고 메모리를 할당하는 정책(estimate)등을 분석하도록하기로 했었죠?? 시간되면 kmem_cache_alloc()도 함 분석하도록 합시다~~~
p.s 간단히 쓸려고 했는데 이거 쓰다보니까 말이 많아졌네요..ㅜㅜ
여튼 나름 슬랩에대한 전체적인 그림을 그릴수 있었던 시간이였던 것 같습니다.
slub으로 최신 커널에서는 약간 개선 되었다고 하는데 자세한것은 잘 모르겠군요~
간략히 정리해보면
struct kmem_cache 구조체가 슬랩의 핵심 자료구조이다.
모든 슬랩당 하나의 kmem_cache 자료구조를 가지고 있다.
그러면 kmem_cache 구조체 조차도 메모리를 차지할텐데 이녀석의 슬랩을 담당하는 것이
cache_cache전역 변수이다. 이녀석또한 kmem_cache 자료형이다.
kmem_cache 구조체안에 struct array_cache 자료형을 멤버 변수로 가지고 있다. 실제 버디 시스템에서 메모리를 미리 할당받아서 array_cache 구조체의 entry멤버 변수에 메모리를 가져다 놓고 여기서 사용자가 슬랩에 메모리를 요청할때마다 가용한 메모리를 떼어다 주게 된다.
struct kmem_list3와 struct slab 자료구조도 있는데 아직 정확히 어떻게 사용되는지 파악 중이다.^^;..
일단 kmem_cache_init에서
1. cache_cache를 만든다. kmem_cache 자료구조를 위한 슬랩을 생성한다.
2+3. kmalloc 를 위한 kmem_cache를 만든다. 이때 cache_cache슬랩에서 kmem_cache구조체의 메모리를 할당받는다. 이때 사용되는 함수가 kmem_cache_create()함수이다. 간략히 cache_cache로부터 kmem_cache메모리를 할당받고 구조체의 내용을 채워주는 역할을 한다. 다음주에 세세히 분석할 예정이다.
malloc_sizes 와 cache_names 에 해당하는 kmem_cache구조체를 만든다. 즉 kmalloc()를 위함 슬랩을 생성하는 것이다. 32,64,96,128,.....등등 아키텍쳐별로 15~20정도를 만들게 된다. 따라서 우리가 kmalloc()를 호출하여 메모리를 얻어오는 것은 이 해당하는 크기의 메모리의 슬랩에서 가져오는 것과 마찬가지이다. 만약 슬랩에 메모리가 부족하다면 버디시스템으로부터 메모리를 확장시키게 되는데 이를 수행하는 함수가 cache_grow함수정도가 되겠다. 아직 어느정도로 확장시키는지 하는 정책은 확인되지 않았다.
4+5. 사실상 제대로 슬랩에서 메모리를 할당하기 위해서는 kmem_list3 구조체와 array_cache 자료구조또한 메모리가 할당되어 있어야 한다. 하지만 초기에는 이런것들이 없으므로 전역변수로 초기화에 필요한 녀석들만 init섹션으로 정의가 되어 있다. 따라서 이런녀석들을 kmalloc으로 할당받아 대치시킨다. 나중에 init섹션은 없어져 버리기 때문이다. 현재 전역변수로 정의되어 있는 kmem_list3와 array_cache는 (cache_cache용과 kmalloc용( sizeof(kmem_list3), sizeof(array_cache) 이 정의 되어 있다.) 따라서 현재 상태에서 kmalloc으로 이 두 구조체의 메모리를 할당 할 수 있다. 다른 크기의 메모리는 아직 할당할 수 없다.(이 두구조체가 존재하지 않으므로)
6. 다음주부터..^^..추측상으로는 아직 만들지않은 다른 녀석들의 array_cache와 kmem_list3등을 만들고 뭐 이것저것 하지 않을까추측.
다음주부터는 슬랩 나머지를 분석하구..kmem_cache_create()차근차근 분석해보고 메모리를 할당하는 정책(estimate)등을 분석하도록하기로 했었죠?? 시간되면 kmem_cache_alloc()도 함 분석하도록 합시다~~~
p.s 간단히 쓸려고 했는데 이거 쓰다보니까 말이 많아졌네요..ㅜㅜ