리눅스 커널 공부

Linux 2013. 12. 26. 16:01 Posted by gaeddong2
< 가상 메모리 >

 

실제 시스템에 존재하는 물미 메모리의 크기와 관계없이 가상적인 주소 공간을 사용자 태스크에게 제공한다.
32비트 CPU의 경우 주소 지정할 수 있는 최대 크기인 2 32승 크기 (4GB)의 가상 주소 공간을 사용자에게 제공한다. 64비트는 16EB

 


< 물리 메모리 > 

 

복수개의 CPU가 메 모리 등의 자원을 공유하게 되면 성능 상 병목 현상이 발생할 수 있다.
병목 현상 - 한순간 데이터 양이 몰리며 메모리가 제대로 소화하지 못할 수 있다. 그로 인해 성능이 떨어지는 현상이다.

따라서 CPU들은 몇 개의 그룹으로 나누고 각각의 그룹에게 별도의 지역 메모리를 주는 구조가 생겨났다. 이러한 구조는 NUMA라 부른다.  기존 시스템은 UMA라고 한다.

 


< NODE >

 

접근 속도가 같은 메모리의 집합을 뱅크라 부른다. 
UMA구조라면 한 개의 뱅크가 존재하고, NUMA구조라면 복수개의 뱅크가 존재한다.

리눅스는 하드웨어 시스템에 관계없이 노드라는 일관된 자료구조를 통해서 전체 물리 메모리를 접근할 수 있게 된다.

 


<zone>

 

노드에 존재하는 물리메모리 중 16MB이하 부분을 좀 특별하게 관리하는데, 이를 위해 node의 일부분을 따로 관리할 수 있도록 자료 구조를 만든 것이다.

 


< Page frame >

 

각각의 zone은 자신에 속해 있는 물리 메모리들을 관리하는데, 바로 이 물리 메모리의 최소 단위를 페이지 프레임이라 한다.

복수개의 페이지 프레임이 zone을 구성하며, 때에 따라 하나 혹은 그 이상의 zone이 node를 구성하며, 역시 시스템의 구조에 따라 하나 혹은 그 이상의 node가 존재하는 것이 리눅스의 전체 물리 메모리 관리 구조이다.

 


<Buddy와 Slab>

 

리눅스는 최소 관리 단위인 페이지 프레임 단위로 할당한다.
4KB가 최소 할당단위가 된다. 
4KB보다 작은 크기를 요청하면 내부 단편화 문제가 발생할 수 있는데, 이를 해결하기 위해서 슬랩 할당자를 도입하였다.
4KB보다 큰 공간을 요청하면 버디 할당자를 사용한다. 버디 할당자가 메모리 관리의 부하가 적으며 외부 단편화를 줄일 수 있다는 장점을 제공한다.

 


<버디 할당자>

 

버디 할당자는 zone 구조체에 존재하는 free_area[]배열을 통해 구축된다.
버디는 zone 당 하나씩 존재한다. 


 

<슬랩 할당자>

 

일종의 캐시의 집합을 통해 메모리를 관리하는 정책을 바로 슬랩 할당자라 한다.
슬랩 할당자에게 메모리 공간의 할당 요청이 들어오면 가장 적합한 캐시를 찾아가서, Partial 슬랩으로부터 객체를 할당해준다.

리눅스에서 메모리의 최소 할당 단위는 페이지 프레임이라고 알고 있다.  근데 만약 그 이하의 공간이 필요할 때는 어떻게 하는 게 좋을까?  그냥  4kb 던져주는게 좋을까?  말할것도 없이 공간낭비이다.

 

대신 미리 정해진 사이즈의 cache를 가지고 있다가 필요할 때 할당한다면 어떨까?  32byte에서 2의 오더로 128kb 까지 유지해서 말이다.

 

각 cache들은 슬랩들로 구성되고, 슬랩은 다시 객체(Object)들로 구성된다.

 

Object (64byte) --> slab (full/free/partial) --> cache

 

 64byte 공간들이 각각의 객체이고, 이 객체들이 슬랩이 되고, 이 슬랩들이 cache가 되는 것이다.

 

 

 

<가상 메모리 관리 기법>

 

태스크마다 자신의 고유한 가상 메모리를 갖는다. 
각 태스크마다 task_struct라는 이름의 자료구조를 가지고 있고, 가상 메모리와 관련된 정보도 역시 이 자료구조에서 관리된다.

태스크의 메모리와 관련된 내용은 mm이라는 필드에 저장
이 필드는 mm_struct라는 구조체를 가리킨다.