컴퓨터를 시작하기에 앞서 테스트부터..

 

우선적으로 시험 삼아서
테스트 부터 시작합니다.

 

강좌는 저도 많이 깊이가 있게 공부하고
제대로 소화하고 나서야 시작될 것입니다.

^^

 


 

장착하는 현재의  시스템에서 너무 치명적인 약점이지 않은가? 이런 약점을 리눅스 개발자들이
그냥 두었을 리 만무하다. 그래서 물리메모리가 1GB 이상이라면 896MB까지를 커널의 가상주소공간과
1:1로 연결해주고, 나머지 부분은 필요할 때 동적으로 연결하여 사용하는 구조를 채택하였다.

이때 896MB 이상의 메모리 영역을 ZONE_HIGHMEM이라 부른다.

한 가지 주의할 점은 모든 시스템에서 언제나 DMA, NORMAL, HIGHMEM 세 개의 zone이 존재하는
것은 아니라는 것이다.

필요 없다면 한 개의 zone만 존재하는 것도 가능하다. 예를 들어 64MB의 SDRAM을 장착하고 있는
ARM CPU 시스템이라면 node 한 개, zone 한 개가 존재하게 된다.

각각의 zone은 자신에게 속해 있는 물리메모리를 관리하기 위해 zone 구조체를 사용한다.
이 구조체에는 해당 zone에 속해 있는 물리 메모리의 시작주소와 크기, 추후에 설명될
버디 할당자가 사용할 free_area 구조체를 담는 변수 등이 존재한다.

watermark와 vm_stat를 통해 남아있는 빈 공간이 부족한 경우 적절한 메모리 해제
정책을 결정하게 된다.

또한 프로세스가 zone에 메모리 할당요청을 하였으나, free 페이지가 부족하여
할당해주지 못한 경우 이러한 프로세스들을 wait_queue에 넣고, 이를 해싱(hashing)
하여 wiat_table 변수가 기리키게 한다.

현재 시스템의 zone 관련 사항은 그림 4.3과 같이 “cat/proc/zoneinfo” 명령을 통해 확인 가능하다.

gildang@gildang-P5Q ~ $ cat /proc/zoneinfo
Node 0, zone      DMA
pages free     3323
min      197
low      246
high     295
scanned  0
spanned  4095
present  3996
managed  3977
nr_free_pages 3323
nr_alloc_batch 49
nr_inactive_anon 0
nr_active_anon 0
nr_inactive_file 230
nr_active_file 150
nr_unevictable 0
nr_mlock     0
nr_anon_pages 0

2-3 Page frame

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

각각의 페이지 프레임은 그림 4.4의 page(~/include/linux/mm_types.h)라는 이름의 구조체에
의해 관리된다.

리눅스는 시스템 내의 모든 물리 메모리에 접근 가능해야 한다. 이를 위해 모든 페이지 프레임 당 하나씩
page 구조체가 존재한다. 이는 시스템이 부팅되는 순간에 구축되어 역시  물리 메모리 특정 위치에 저장된다.
이 위치는 mem_map이라는 전역 배열을 통해 접근할 수 있다.

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

3. Buddy와 Slab

리눅스는 page frame, zone, node라는 구조를 통해 시스템에 존재하는 전체 물리
메모리를 관리할 수 있게 되었다. 그럼 리눅스는 자신이 가지고 있는 물리 메모리를
어떻게 할당 또는 해제하는가?

사용자 프로세스가 1Byte의 물리 메모리 공간을 할당해달라고 요청했다면 어떨까?
물리 메모리 중 1Byte를 할당 해주면 좋을까?

조금만 생각해 본다면 이는 매우 불합리하며, 심지어 거의 불가능하다는 것을 알 수 있을 것이다.
왜냐하면 할당 된 공간마다 이를 관리하기 위한 메타 데이터가 필요한데 1Byte단위로 할당을 하는 경우
이 메타 데이터의 양이 너무나도 방대해지기 때문이다.

따라서 1Byte보다는 큰 단위로 메모리를 할당해 주어야 하는데 리눅스는 물리 메모리의
최소 관리 단위인 페이지 프레임 단위로 할당하도록 결정하였다.

결국 4KB가 최소 할당단위가 된다(8KB, 2MB 등 크기는 설정 가능하다).

이제 두 가지 고려사항이 발생한다. 첫째, 만일 4KB 보다 작은 크기를 요청하면 어떻게 되는가?
특히 30Byte나 60Byte처럼 작은 크기를 요청하면 어떻게 되는가?

특히 30Byte나 60Byte처럼 작은 크기를 요청할 경우 4KB를 할당해주면 내부 단편화(Internal Fragementation)
문제가 발생한다. 리눅스는 이를 해결하기 위해서 슬랩 할당자(Slab Allocator)를 도입하였으며 이는 다음 절에서
자세히 살펴본다.

두 번째 고려사항은 4KB보다 큰 공간을 요청하면 어떻게 되는가? 예를 들어 10KB를 요청할 경우,
세 개의 페이지 프레임을 할당하면 내부 단편화를 최소화 시킬 수 있도록 할당할 수 있다.

하지만 리눅스는 이 요청에 대해 16KB를 할당해주는 버디 할당자(Buddy Allocator)를 사용한다.
버디 할당자가 메모리 관리의 부하가 적으면 외부 단편화(External Fragementation)를 줄일 수 있다는
장점을 제공하기 때문이다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

This site uses Akismet to reduce spam. Learn how your comment data is processed.