연속 메모리 할당(contiguous memory allocation)은 운영체제가 프로세스 또는 데이터에 필요한 메모리 공간을 물리적으로 연속적인 하나의 블록으로 할당하는 방식이다. 이는 초기 운영체제에서 주로 사용되었던 기본적인 메모리 관리 기법 중 하나이다. 이 방식은 구현이 단순하고 메모리 접근 속도가 빠르다는 장점이 있으나, 외부 단편화(external fragmentation) 문제를 야기하여 메모리 효율성을 저하시킬 수 있다는 단점을 가지고 있다.
개요
연속 메모리 할당은 특정 프로세스나 프로그램이 실행되는 데 필요한 모든 메모리 공간이 주소 공간 상에서 끊어지지 않고 하나의 연속된 블록 형태로 존재하도록 보장하는 방식이다. 즉, 메모리 내의 여러 위치에 분산되어 저장되는 비연속 할당(non-contiguous allocation) 방식과 대비된다. 이 방식은 프로그램이 메모리에 적재될 때, 운영체제가 사용 가능한 충분히 큰 연속된 빈 공간을 찾아 해당 공간을 통째로 할당해 주는 방식으로 작동한다.
작동 방식
운영체제는 메모리 관리자의 도움을 받아 현재 사용 가능한 메모리 공간 목록을 유지한다. 새로운 프로세스가 메모리를 요청하면, 운영체제는 요청된 크기 이상의 연속된 빈 공간을 찾아 해당 공간을 프로세스에 할당한다. 이때 빈 공간을 찾는 전략으로는 다음과 같은 방식들이 있다.
- 최초 적합(First Fit): 메모리 공간을 처음부터 검색하여 요청된 크기 이상의 첫 번째 빈 공간을 할당한다. 구현이 간단하고 빠르다.
- 최적 적합(Best Fit): 모든 빈 공간을 검색하여 요청된 크기를 수용할 수 있는 가장 작은 크기의 빈 공간을 할당한다. 가장 적은 양의 메모리 낭비를 발생시키지만, 모든 빈 공간을 검색해야 하므로 시간이 오래 걸린다.
- 최악 적합(Worst Fit): 모든 빈 공간을 검색하여 요청된 크기를 수용할 수 있는 가장 큰 크기의 빈 공간을 할당한다. 이 방식은 가장 큰 남은 공간을 생성하여 추후 다른 작은 요청들을 처리하는 데 도움이 될 것이라는 가정하에 사용되기도 하지만, 실제로는 효율성이 떨어지는 경우가 많다.
장점
- 구현의 단순성: 메모리 할당 및 관리가 비교적 단순하여 운영체제의 복잡성을 줄일 수 있다.
- 빠른 메모리 접근: 연속된 주소 공간 덕분에 데이터 지역성(locality of reference)이 높아 캐시 효율성이 좋으며, 주소 변환 과정이 단순하여 메모리 접근 속도가 빠르다.
- 하드웨어 오버헤드 감소: 특별한 하드웨어 지원 없이도 구현이 가능하다.
단점
- 외부 단편화(External Fragmentation): 가장 큰 단점으로, 메모리 내에 사용 가능한 빈 공간들이 충분히 존재하지만, 이들이 연속적이지 않아 하나의 큰 블록으로 합쳐지지 못하여 실제로는 할당될 수 없는 상황을 의미한다. 이는 메모리 자원의 비효율적인 사용과 낭비를 초래한다.
- 메모리 낭비: 최적 적합과 같은 전략을 사용하더라도 요청 크기와 할당된 블록 크기 간의 차이로 인해 내부 단편화(internal fragmentation)가 발생할 수 있다. 또한, 외부 단편화로 인해 전체 메모리 공간 중 상당 부분이 사용되지 못하고 낭비될 수 있다.
- 유연성 부족: 프로세스가 실행 중 필요한 메모리 크기가 변동될 경우, 할당된 연속적인 블록을 확장하거나 축소하기 어렵다. 필요한 경우 전체 프로세스를 새로운 더 큰 연속 공간으로 이동시켜야 할 수도 있다.
- 메모리 압축(Memory Compaction): 외부 단편화 문제를 해결하기 위해 분산된 빈 공간들을 하나로 합치는 메모리 압축 기법을 사용할 수 있으나, 이는 비용이 많이 들고 CPU 시간을 소모하며, 시스템 성능에 부정적인 영향을 미칠 수 있다.
대안 및 관련 개념
연속 메모리 할당의 단점을 극복하기 위해 비연속 메모리 할당(non-contiguous memory allocation) 방식이 개발되었다. 대표적인 비연속 할당 방식으로는 페이징(paging)과 세그멘테이션(segmentation)이 있다.
- 페이징(Paging): 물리 메모리를 고정된 크기의 페이지 프레임(page frame)으로 나누고, 프로세스의 논리 주소 공간을 페이지(page)로 나누어 불연속적인 물리 메모리 위치에 할당한다. 이를 통해 외부 단편화를 거의 없앨 수 있다.
- 세그멘테이션(Segmentation): 프로그램을 논리적인 단위(세그먼트)로 나누어 관리하는 방식이다. 각 세그먼트는 연속적인 메모리 공간에 할당되지만, 전체 프로그램은 여러 세그먼트로 나뉘어 불연속적으로 배치될 수 있다.
가상 메모리(virtual memory)는 이러한 기법들을 활용하여 실제 물리 메모리의 크기에 관계없이 프로세스가 훨씬 큰 주소 공간을 사용하는 것처럼 보이게 하여, 프로그램의 유연성과 다중 프로그래밍의 효율성을 높인다.