컨텐츠 바로가기

High Memory

http://hermes2.egloos.com/839611

현재 32비트 x86 아키텍처는 가장 일반적인 컴퓨터 형태입니다. 이 아키텍처에서 전통적으로 리눅스 커널은 4GB의 가상 메모리를 쪼개어 3GB를 사용자 프로그램에게, 1GB를 커널에게 할당합니다.

이것은 커널이 모든 물리 메모리를 주소 공간에 매핑할 수 있다는 것을 뜻하며, 이는 커널 내부에서 메모리를 직접 접근할 수 있게 하며, 커널이 단순해지고 빨라집니다.

Use pointers from kernel object to another. The alternative would be to track physical addresses, mapping in a physical address and calculating the virtual address of the structure before accessing it, and unmapping the physical address after use.

커널 공간에 많은 페이지를 할당한다면 더 많은 TLB와 성능을 나타냅니다.

MIPS 프로세서와 같은 다른 아키텍처에서 하드웨어는 물리 메모리의 일부에만 접근할 수 있습니다. 32비트 MIPS 프로세서는 보통 운영체제를 메모리의 512MB 부분에 매핑합니다. 이 공간은 가상 메모리와 물리 메모리간에 직접 매핑된 공간입니다. 다른 메모리는 TLB를 통해 접근되어야 하며 4GB 물리 메모리 전부를 동시에 매핑하는 것은 불가능합니다. 그러므로 high 메모리에 대한 지원은 x86 아키텍처와 비교해서 무시무시합니다.

high 메모리 복사
그러나 많은 사람들은 32비트 시스템에서 1GB 물리 메모리 이상을 쓰기 원합니다. This makes it necessary for the Linux kernel to jump through some interesting hoops...

기본적으로 시스템은 다음의 전략을 사용합니다.

896MB 이상의 메모리는 커널이 접근하려 할 때에만 일시적으로 커널 가상 메모리로 매핑됩니다.

커널이 자주 참조하는 데이터는 896MB 이하(ZONE_NORMAL)에 매핑되며 커널이 즉시 접근할 수 있습니다.

페이지 캐시, 프로세스 메모리, 페이지 테이블을 포함하여 커널이 가끔 참조하는 데이터는 ZONE_HIGHMEM 영역에 할당됩니다.

시스템은 물리 메모리의 제한된 부분에 DMA를 수행하는 장치를 다루기 위해 ZONE_DMA, ZONE_DMA32라는 추가적인 물리 메모리 영역을 가질 수 있습니다.

메모리 영역에서 일어나는 할당과 페이지아웃은 재조정이 필요합니다.

일시적 매핑
highmem에 있는 데이터의 커널 가상 메모리로의 일시적 매핑은 kmap(), kunmap(), kmap_atomic(), kunmap_atomic()과 같은 함수들을 통해 수행됩니다.

kmap() 함수는 안정된 매핑을 제공합니다. 이는 스케줄되어 다른 CPU에 할당되어도 매핑된 상태로 남습니다. 그러나 이러한 할당들은 전역적인 잠금 상태에서 할당되기 때문에 SMP 시스템에서는 병목 현상을 일으킬 수 있습니다. 따라서 kmap() 함수는 권장되지 않습니다.

SMP 시스템에서는 전역 잠금이 없는 kmap_atomic() 함수를 사용하는 것이 좋습니다. kmap_atomic() 함수가 잠금 없이 동작할 수 있는 이유는 페이지가 동작하는 CPU에 종속적인 고정된 주소에 매핑되기 때문입니다. 물론 이것은 같은 CPU에서 동작하는 다른 프로세스가 같은 주소를 필요로 할 수도 있기 때문에 스케줄이 되면 이러한 매핑을 사용할 수 없다는 뜻입니다. 이것이 2.6 커널에서 사용되는 highmem 매핑 유형입니다.

메모리 균형
2GB 메모리를 가진 시스템에서 high 메모리(ZONE_HIGHMEM)는 전체 메모리의 절반을 약간 넘고, low 메모리(ZONE_NORMAL, ZONE_DMA)는 절반에 약간 못미칩니다. 커널이 프로세스와 페이지 캐시 메모리를 두 영역 모두에 할당하고 페이지 아웃 코드 재활용 페이지를 각 영역의 비율에 따라 할당하기 때문에 중요합니다.

왜냐하면 응용 프로그램이 2GB 메모리 전부를 사용하고 싶어할 수 있기 때문입니다. 만약 시스템이 high 메모리의 할당과 재할당을 low 메모리보다 빠르게 한다면 응용 프로그램은 low 메모리 대신 high 메모리로부터 데이터의 일부를 받아올 것입니다. 그러나 high 메모리와 low 메모리에 균형이 맞는 시스템은 응용 프로그램의 유효 메모리 크기가 2GB에 근접합니다.

시스템 관리자 고려사항
8GB가 넘는 메모리가 존재하는 32비트 시스템 동작의 주 위험은 커널이 ZONE_NORMAL에 할당할 수 있는 메모리보다 큰 데이터를 할당하는 것을 필요로 하는 점입니다. 이것은 메모리가 충분함에도 불구하고 메모리가 부족한 현상이 나타남을 의미합니다.

다른 문제점은 시스템이 성능을 향상시기는데 도움이 되는 캐시된 inode, buffer heads, 기타 캐시들을 더 자주 요청하게 되는 점입니다.

세번째 문제점은 32비트 시스템에서 프로그램이 3GB 이상의 메모리를 효율적으로 사용할 수 없다는 것입니다. 이것은 4GB 이상의 메모리를 구입하는 것이 의미가 없음을 나타냅니다.

이러한 이유로 4GB 이상의 메모리를 구입한다면 64비트 CPU와 64비트 운영 체제 설치를 고려하여야 합니다. 32비트와 64비트 시스템의 가격 차이는 거의 없으며, x86-64 시스템은 여전히 32비트 응용 프로그램을 실행할 수 있습니다. 그러므로 high 메모리에 따른 고통을 겪을 필요는 없습니다.

덧글|신고