봉황대 in CS

[Chapter 9. 가상 메모리] 커널 메모리의 할당, 메모리 사상 파일 본문

Computer Science & Engineering/Operating System

[Chapter 9. 가상 메모리] 커널 메모리의 할당, 메모리 사상 파일

등 긁는 봉황대 2022. 8. 5. 02:41

* 본 글은 '운영체제(Operating System: Concepts) 9th edition'의 내용과 2021학년도 1학기에 수강한 '운영체제' 과목 강의 내용을 함께 정리하여 작성하였습니다.

 

커널 메모리의 할당 (Kernel Memory Allocation)


사용자 모드에서 수행중인 프로세스가 추가적인 메모리를 요구하면 커널이 관리하는 가용 페이지 프레임에서 페이지들이 할당된다.

 

하지만 커널 메모리는 사용자 모드 프로세스에게 할당해주는 페이지 리스트와는 별도의 메모리 풀에서 할당받는다.

 

그 이유는 다음과 같다.

1. 커널은 다양한 크기의 자료구조를 위해 메모리를 할당받는데, 이때 단편화에 의한 낭비를 최소화해야 한다.

2. 물리 메모리에 직접 접근하는 특정 하드웨어 장치는 물리적으로 연속적인 메모리를 필요로 하는 경우가 있다.

 

 

커널 프로세스에 할당되는 메모리를 관리하는 두가지 기법에 대하여 알아보자.

1. 버디 시스템 (Buddy system)

2. 슬랩 할당 (Slap Allocation)

 

버디 시스템 (Buddy system)

버디 시스템은 물리적으로 연속된 페이지(프레임)들로 이루어진 고정된 크기의 세그먼트로부터 메모리를 할당한다.

 

메모리는 이 세그먼트로부터 2의 거듭제곱 단위로 할당된다.

(4 KB, 8 KB, 16 KB 등 가장 가까운 2의 거듭제곱 크기로 올림되어서 할당)

ex. 메모리 11 KB 요청 → 16 KB 세그먼트가 할당됨

 

 

(예시)

메모리 세그먼트의 크기는 초기에 256 KB, 커널이 21 KB의 메모리를 요구했을 경우

21의 가장 가까운 2의 거듭제곱은 32이다.

 

세그먼트는 128 KB 크기의 두 개의 버디(buddies)로 나누어진다.

그 중 하나는 다시 두 개의 64 KB 크기의 버디로, 또 그 중 하나는 두 개의 32 KB 크기의 버디로 나누어진다.

 

32 KB 크기의 버디 중 하나가 21 KB 요구를 처리하기 위해 사용된다.

 

 

장점

1. 합병(coalescing)이라는 과정을 통해 서로 인접한 버디들이 손쉽게 하나의 큰 세그먼트로 합쳐질 수 있다.

2. 속도가 빠르다.

 

단점

메모리가 요구하는 용량의 가장 가까운 2의 거듭제곱으로 올림되어서 할당되기 때문에 내부 단편화가 발생한다.

ex. 33 KB가 필요한 경우 64 KB가 할당될 것이고, 64-33 = 31 KB 크기의 단편이 발생

 

슬랩 할당 (Slap Allocation)

슬랩 할당은 단편화에 의한 메모리 낭비가 발생하지 않는 할당 방법이다.

 

슬랩(slab)은 하나 또는 그 이상의 연속된 페이지들로 구성된다.

캐시(cache)는 하나 또는 그 이상의 슬랩들로 구성되며, 커널 자료 구조마다 하나의 캐시가 각각 존재한다.

 

같은 타입의 커널 인스턴스(객체)는 같은 캐시에만 할당한다.

* 객체 : PCB, 파일 객체, 세마포어 등 커널 내 주요 자료 구조들

 

 


슬랩 할당 알고리즘은 커널 객체를 저장하기 위해 캐시를 사용한다.

 

캐시가 생성되면 free로 표시된 커널 객체들을 캐시 내에 미리 마련해놓는데, (preallocated)

이때 캐시 내의 최대 객체 수는 해당 슬랩의 크기에 좌우된다.

ex. 한 페이지가 4 KB인 경우, 12 KB 슬랩은 3개의 페이지로 구성되며, 2 KB 객체를 6개 포함할 수 있음

 

커널 수행 중 커널 객체가 요청되면 해당 캐시의 free 객체들 중 하나를 캐시로부터 할당해주고,

할당된 객체는 used로 표시한다.

 

 

슬랩은 다음과 같은 세 가지 상태 중 한 상태에 있게 된다.

1. Full : 슬랩 내의 모든 객체가 used로 표시됨

2. Empty : 슬랩 내의 모든 객체가 free로 표시됨

3. Partial : used, free 객체가 섞여 있음

 

 

슬랩 할당 알고리즘

커널 객체 할당 요청이 들어오면

1. 먼저 Partial 슬랩의 free 객체를 이용해 할당해준다.

2. Partial 슬랩이 없다면 Empty 슬랩의 free 객체를 할당해준다.

3. Empty 슬랩도 없다면 새로운 슬랩 하나를 캐시에 할당해준다.

 

 

장점

1. 단편화에 의해 낭비되는 메모리가 없다.

각 커널 객체마다 해당 캐시가 따로 존재하기 때문에

커널이 메모리 할당을 요청할 때마다 슬랩 할당기는 정확히 필요한 만큼의 메모리만을 할당한다.

 

2. 메모리 요청이 빠르게 처리된다.

객체들이 미리 생성되어 있고 캐시에서 쉽게 할당 가능하기 때문에,

할당과 해제가 빈번한 자료 구조 객체 관리에는 특히 효율적이다.

 

메모리 사상 파일 (Memory-Mapped Files)


open(), read(), write() 시스템 호출을 사용하여 디스크에 있는 파일을 순차적으로 읽는 방식을 사용한다고 해보자.

이는 파일이 매번 액세스될 때마다 시스템 호출을 한 다음에 디스크를 접근해야 하기 때문에 성능이 그닥 좋지 않다.

 

 

시스템 콜을 사용하는 대신, 디스크 입출력을 가상 메모리 기법을 사용하여 메모리 참조 방식으로 대신할 수 있다.

 

메모리 사상(memory-mapping) 파일

프로세스의 가상 주소 공간 중 일부를 관련된 파일에 할애하여 시스템 콜 대신 메모리를 접근하도록 하는 방식을 말한다.

 

 

파일의 메모리 사상은 프로세스의 페이지 중 일부분을 디스크에 있는 파일의 블록에 사상하는 것을 통해 이루어진다.

 

파일에 대한 첫번째 접근은 일반적인 요구 페이징 과정에 따라 페이지 부재를 발생시킨다.

 

이때 파일의 내용 중 페이지 크기만큼의 해당 부분이 파일 시스템으로부터 메모리 페이지로 읽혀 들어오게 되고,

그 이후의 파일 쓰기와 읽기는 일반적인 메모리 액세스와 같이 처리된다.

 

 

장점

1. read()와 write()를 사용하는 오버헤드 없이 파일을 메모리를 통해 조작할 수 있고,

더 단순하고 더 빠르게 파일을 접근하고 사용할 수 있어 성능이 향상된다.

 

2. 여러 프로세스가 메모리 사상 파일을 통해 특정 파일을 공유하는 것도 가능하다.

이때 copy-on-write 기능을 지원하여 파일을 read-only로 공유하다가

어느 한 프로세스가 해당 파일을 수정하기 시작한다면 그 시점에 별도의 페이지 복사본을 만들어주는 것이다.

 

3. 메모리 사상 파일을 이용하여 공유 메모리도 구현 가능하다.

동일 파일을 프로세스들의 가상 주소 공간에 사상하여 프로세스들은 공유 메모리를 통해 통신을 할 수 있다.

사상된 파일은 통신하는 프로세스들 사이의 공유 메모리 영역으로 동작한다.

 

 

반응형
Comments