Chapter 4 - 메모리 관리(1)

2022. 9. 19. 01:14개발 관련 책 읽기/리눅스 커널 내부구조

초창기에 컴퓨터가 개발될 때부터 사용자는 시스템에 물리적으로 존재하는 것보다 더 많은 양의 메모리를 필요로 해 왔다. 물리 메모리의 한계를 극복하기 위해 많은 기법들이 개발되었는데,

그중에서 가장 성공적이며 지금도 대부분의 시스템에서 사용하는 방법이 가상 메모리이다.

 

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

그런데 한 가지 주의해야 할 것은 물리적으로 4GB의 메모리를 모두 사용자 태스크에게 제공하는 것이 아니라는 점이다.

 

-물리 메모리 관리 자료 구조

요즘 복수 개의 CPU를 가지고 있는 구조의 컴퓨터 시스템이 점차 일반화되어 가고 있다.

복수 개의 CPU를 가지고 있는 컴퓨터 시스템 중 모든 CPU가 메모리와 입출력 버스 등을 공유하는 구조를 SMP(Symmetric Multiprocessing)라 부른다.

 

복수 개의 CPU가 메모리 등의 자원을 공유하기 때문에 성능상 병목 현상이 발생할 수 있다

(병목 현상 : 어떤 시스템 내 데이터의 집중적인 사용으로 인해, 전체 시스템에 절대적 영향을 미치는 부분의 사용 빈도가 늘어나 그 부분의 성능이 저하되어 전체 시스템이 마비되는 현상을 의미한다.)

 

따라서 CPU들을 몇 개의 그룹으로 나누고 각 그룹에게 별도의 지역 메모리를 주는 구조가 생겼다

이러한 구조를 NUMA(Non-Uniform Memory)라 부르며, 이와 반대로 UMA(Uniform Memory Access)라고 한다

 

 

Bank 와 Node의 관계

-Node

리눅스에선 접근 속도가 같은 메모리의 집합을 뱅크라 부른다

위의 그림에서 UMA 구조라면 한 개의 뱅크가 존재하고 NUMA 구조라면 복수개의 뱅크가 존재하게 된다. 리눅스에서 뱅크를 표현하는 자료구조가 노드이다.

만약 UMA 구조의 시스템에서 리눅스가 수행된다면 한 개의 노드가 존재할 것이며, 이 노드는

리눅스의 전역 변수인 contig_page_data를 통해 접근 가능하다.

만약 NUMA 구조의 시스템에서 리눅스가 수행된다면 복수 개의 노드가 존재할 것이다.

복수 개의 노드는 pgdat_list라는 배열을 통해 접근 가능하다

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

 

하나의 노드(뱅크)는 pg_data_t 구조체를 통해 표현된다. 이 구조체는 해당 노드에 속해 있는 물리 메모리의 실제 양(node_present_pages)나 해당 물리 메모리가 메모리 맵의 몇 번지에 위치하고 있는지를 나타내는 변수(node_start_pfn) 등이 정의되어 있다.

 

리눅스가 물리 메모리의 할당 요청을 받게 되면, 되도록 할당을 요청한 태스크가 수행되고 있는 CPU와 가까운 노드에서 메모리를 할당하려 한다. 리눅스는 태스크가 되도록 이전에 수행되었던 CPU에서 다시 수행되도록 하기 때문에 이러한 정책을 통해 보다 높은 성능을 얻을 수 있게 된다

 

-Zone

노드 안에 존재하고 있는 메모리는 모두 어떠한 용도로도 사용될 수 있어야 한다.

그런데 일부 ISA 버스 기반 디바이스의 경우 정상적인 동작을 위해서는 반드시 물리 메모리 중

16MB 이하 부분을 할당해 줘야 하는 경우가 있다.

그 결과 노드에 존재하는 물리 메모리 중 16MB 이하 부분을 좀 특별하게 관리하는데, 이를 위해

Node의 일부분을 따로 관리할 수 있도록 자료 구조를 만들어 놓았다.

이 자료구조를 zone이라고 부른다. zone 이란 동일한 속성을 가지며, 다른 zone의 메모리와는 별도로 관리되어야 하는 메모리의 집합이다.

 
 

 

각각의 zone은 자신에게 속해있는 물리 메모리를 관리하기 위해 zone 구조체를 사용한다.

이 구조체에는 물리 메모리의 시작 주소와 크기, 버디 할당자가 사용할 free_area 구조체를 담는 변수 등이 존재한다. watermark와 vm_stat 변수를 통해 남아있는 빈 공간이 부족한 경우 적절한 메모리 해제 정책을 결정하게 된다. 또한 프로세스가 zone에 메모리 할당 요청을 하였으나, free 페이지가 부족하여 할당해주지 못한 경우 이러한 프로세스들을 wait_queue에 넣고, 이를 해싱하여 wait_table 변수가 가리키게 한다. cat /proc/zoneinfo를 통해 zone 관련 내용을 볼 수 있다.

 

 

반응형