항상 커널에서의 옵션에서 NUMA 지원이라는 것을 자주 보았는데

그게 무엇인지 사용하지 않는 터라 잘 몰랐었다.

그러다가 최근에 다시 리눅스 커널의 메모리에 대해서 보면서 그 내용을 다시 보게 되었다.


NUMA(Non-Uniform Memory Access) 의 약자이다.


보통 캐쉬의 동작을 제외했을때 CPU 에서 메모리에 접근하는 시간은 주소와 CPU 에 관계없이 동일하다.

이런 가정이 맞지 않는 구조가 Alpha 나 Mips 시스템이다.


시스템에 있는 메모리는 여러 노드로 나누어지며, 한 CPU 가 한 노드의 메모리에 접근하는 시간은 동일하지만

다른 CPU 에서는 틀릴수도 있다.


즉, 메모리의 값의 합을 구하는 시간은 CPU 마다 어떤 메모리를 사용하느냐에 따라 다를수도 있다는 거다(!!!)


커널은 어떤 CPU 가 자주 접근하는 커널 자료 구조의 저장 위치의 선택에서 CPU의 시간이 오래 걸리는 

노드에 접근이 최소화 하도록 해준다고 한다.


IBM 호환 PC에서는 UMA 방식을 사용하기 때문에 또, ARM 역시 마찬가지이기 때문에 시스템의 모든 메모리는

하나의 노드로 들어가게 된다.


하지만... 그 크기가 896M 를 넘어가게 되면 High memory를 사용하여야 사용할수 있다.

그러면 왜 High memory 를 사용하면 시스템의 효율이 떨어질까?


커널은 1G 영역을 896M 직접 매핑 가능한 메모리를 제외하고 High memory 공간으로 128M 를 사용한다.


2G 의 메모리를 갖고 있다면 896M 이외의 메모리를 사용하기 위해서는 프로세스가 해당 메모리 공간을 사용할때마다

128M 범위내에서 high memory 내의 공간에서 매번 메모리 매핑이 이루어져서 사용할수 있게 한다.

따라서 직접 사상된 메모리 공간을 사용하는 것이 아니기 때문에 매핑에 시간이 필요하고 메모리의 사용에서

그만큼의 비효율성을 가져오게 된다.


그러면 64비트 시스템에서는 어떨까?

High memory 가 있긴 하지만 직접 매핑 가능한 메모리의 공간이 크기 때문에 항상 high memory 의 크기는 0 이다.

호환성을 위해서 high memory 는 존재하지만 사용되지는 않는다고 한다.