커널 메모리 할당

By 01/11/2018OS Concept

커널 메모리 할당

 

사용자 모드에서 수행중인 프로세스가 추가적인 메모리를 요구하면 커널이 관리하는 자유 페이지 프레임의 리스트에서 페이지들이 할당된다. 페이지 교체 정책으로 인하여 물리 메모리 상에 흩어져 있는 자유 페이지들로 채워진다. 사용자 프로세스가 1바이트만 필요하더라도 프로세스가 한 페이지 프레임을 할당 받았으므로 내부 단편화가 발생 한다.

 

 

커널 메모리는 보통 사용자 모드 프로세스에게 할당해 주기 위한 페이지 리스트와는 별도의 자유 메모리 풀에서 할당 받는다. 이는 다양한 크기의 자료 구조를 할당 할 수 있으며 단편화에 의한 낭비를 최소화 한다. 또한 사용자 모드 프로세스에 할당되는 페이지들은 물리 메모리에서 굳이 연속된 것일 필요가 없기 때문이다.

 

커널 프로세스에서 할당되는 메모리를 관리하는 기법에는 [버디 시스템]과 [슬랩 할당] 이 있다.

 

[버디 시스템]

버디 시스템은 물리적으로 연속된 페이지들로 이루어진 고정된 크기의 세그먼트로부터 메모리를 할당 한다. 메모리는 세그먼트로부터 2^n 단위로(4KB, 8KB, 16KB..) 할당 된다.

 

예를 들어 메모리 세그먼트의 크기는 초기에 256KB라고 가정하고 커널이 21KB의 메모리를 요구했다고 하였을 때 세그먼트는 128KB의 두 개의 버디(buddy)로 나누어 진다. 그 중 하나는 다시 64KB의 버디로 나누어지고 21KB에 가장 가까운 크기는 32KB 이므로 64KB는 다시 32KB의 버디로 나누어 진다. 32KB의 버디 중 하나가 21KB 요구 사항을 처리하기 위해 사용 된다.

 

버디 시스템의 이점 중 하나는 합병(coalescing)이라는 과정을 통해 서로 인접한 버디들이 쉽게 하나의 큰 세그먼트로 합쳐질 수 있다는 것이다. 단점으로는 가장 가까운 2^n으로 올림이 할당된 세그먼트 내의 단편화를 가져온다는 것이다.

 

[슬랩 할당(Slab Allocation)]

슬랩(slab)은 하나 또는 그 이상의 물리적으로 연속된 페이지들로 구성 된다. 캐시(cache)는 하나 혹은 그 이상의 슬랩들로 구성된다, 각 커널 자료구조마다 하나의 캐시가 존재 한다. 각 캐시는 커널 자료 구조의 각 instantiation에 해당하는 객체들로 채워져 있다.

 

슬랩 할당 알고리즘은 커널 객체를 저장하기 위해 캐시를 사용한다. 캐시가 생성되면 초기에는 자유(free)라고 표시된 몇 개의 객체들이 캐시에 할당 된다. 캐시 내의 객체의 수는 해당 슬랩의 크기에 좌우 된다. 할당된 객체는 사용(used)이라고 표시 한다.

 

슬랩 할당기는 두 가지 주요 장점이 있다.

  • 단편화에 의해 낭비되는 메모리가 없다. 커널이 메모리 할당을 요구할 때마다 슬랩 할당기는 정확히 필요한 만큼의 메모리만을 할당 한다.
  • 메모리 요청이 빠르게 처리 된다. 객체들은 미리 생성되어 있고 캐시에서 쉽게 할당이 가능하다. 사용 후에는 캐시 상태로 반환되어 다음 요구 시 즉시 할당 가능하게 된다.

 

슬랩 할당기는 Solaris 2.4 커널에서 처음 도입 되었으며 범용적인 특성 때문에 특정한 사용자 모드 메모리 요청을 처리하는 데도 사용되고 있다. Linux도 원래 버디 시스템이었지만 2.2 버전부터 슬랩 할당기를 채택 하였다.

 

 

[참고자료]

Operating System Concepts

 

operationsystem, 운영체제, 운영체제구조, 컴퓨터구조, OSConcept, 가상메모리, 커널메모리할당, 버디시스템, 슬랩할당, sqlmvp, SQL Angeles