3가지 메모리 모델이 있군요
Opened this issue · 3 comments
Contigmem 메모리 모델
Discontigmem 메모리 모델
Sparsemem 메모리 모델
이렇게 언급되는 모델이 있습니다.
Hole이라고 언급되는 부분이 가상메모리의 홀보다는 이 불연속적인(Discontigmem, Sparsemem)부분이 포함된 모델의 끊어진 부분을 Hole이라고 언급이 될꺼라고 추측 합니다.
자세한것은 스터디때 이야기 해봐요. 🕒
sparsemem는 프로세서의 주소 공간이 서로 다른 메모리 뱅크로 이루어져
중간 중간 마다 hole이 존재할 수 있는, 비-연속 물리적 메모리를 지원하는
모델인 것 같네요.
전체 물리 메모리를 각 SECTION_SIZE 크기로 나누어
section들로 관리하는데, 해당 section들은 메모리 물리적 유효성에 따라
유효(online)하거나 유효(offline)하지 못한 상태를 갖을 수 있다고
합니다(http://mytechkorner.blogspot.kr/2010/12/sparsemem.html)
page->flag에 section 번호가 저장되어 사용된다고 하는데, 32비트에서는
저장할 수 있는 비트가 제약이 있어, page->flag의 크기를 늘려야 한다고
하네요. 해당 section 번호는 한번 저장되면 더 이상 NUMA NODE 정보가
저장될 필요없다고 하는데 이 부분은 소스를 살펴봐야 할 것 같습니다.
(저장된 section번호는 NODE에서 메모리 접근시 사용될 것으로 보입니다)
저번 주 스터디 때 보았던 NODE_NOT_IN_PAGE_FLAGS 가 좀 헷갈리게
했었는데... 아마도 해당 page->flag에 section 번호를 저장하지 못하는
머신들을 위해 있는게 아닐까 생각됩니다.
(NODE_WIDTH가 없을때 NODE_NOT_IN_PAGE_FLAGS 선언됨)
x86_64에서는 sparsemem
이 기본입니다.
flatmem과 discontigmem 그리고 sparsemem의 할당 속도 비교인데, 내용을 보면, discontigmem
보다 sparsemem
이 속도가 빨리 나오고, flatmem
이 sparsemem
보다 월등히 빠르지 않다는 점을 이유로 discontigmem
대신 sparsemem
이 기본으로 활성화 되었습니다.
sparsemem
이 x86_64에서 속도가 빠를 수 있었던 것은 vmemmap(x86_64에서 사용가능)과 TLB를 사용 해서 라고 합니다(이 부분은 찾다가 얼핏 읽은 부분이라 어떤 방식으로 빠른지는 모르겠습니다)
재밌는 건, 기존에 discontigmem
이 NUMA 일 때만 사용 가능 했었는데, sparsemem
은 NUMA가 아닐 때도(UP, SMP) 가능하게 수정되어 있군요. 현재는 CONFIG_ARCH_SPARSEMEM_ENABLE
이 x86_64, NUMA, x86_32(비 표준) 에서 사용 가능 합니다.