x86-8/linux-3.2

3가지 메모리 모델이 있군요

Opened this issue · 3 comments

Minq commented

Contigmem 메모리 모델
Discontigmem 메모리 모델
Sparsemem 메모리 모델

이렇게 언급되는 모델이 있습니다.
Hole이라고 언급되는 부분이 가상메모리의 홀보다는 이 불연속적인(Discontigmem, Sparsemem)부분이 포함된 모델의 끊어진 부분을 Hole이라고 언급이 될꺼라고 추측 합니다.
자세한것은 스터디때 이야기 해봐요. 🕒

Minq commented

Contigmem 이라고 부르지 않고 Flatmem이라고 부르는군요.
이곳에 좀더 자세한 내용이 언급되어 있습니다.

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 이 속도가 빨리 나오고, flatmemsparsemem보다 월등히 빠르지 않다는 점을 이유로 discontigmem대신 sparsemem이 기본으로 활성화 되었습니다.

sparsemem이 x86_64에서 속도가 빠를 수 있었던 것은 vmemmap(x86_64에서 사용가능)과 TLB를 사용 해서 라고 합니다(이 부분은 찾다가 얼핏 읽은 부분이라 어떤 방식으로 빠른지는 모르겠습니다)

재밌는 건, 기존에 discontigmem이 NUMA 일 때만 사용 가능 했었는데, sparsemem은 NUMA가 아닐 때도(UP, SMP) 가능하게 수정되어 있군요. 현재는 CONFIG_ARCH_SPARSEMEM_ENABLE이 x86_64, NUMA, x86_32(비 표준) 에서 사용 가능 합니다.