어떤 프로그램이든 프로세스가 되기 위해 메모리에 적재되어야 실행 가능하다. 따라서 메모리는 중요한 작업 공간이고, 한정된 메모리를 다중 프로그래밍 환경에서 여러 프로세스가 함께 메모리를 사용하므로 효율적인 관리가 필요하다.
메모리 관리는 운영체제를 비롯해 여러 작업을 동시에 처리할 때 메모리를 어떻게 관리하는가에 대한 문제다. 복잡한 메모리 관리는 메모리 관리 시스템(Memory Management System, MMS)이 담당한다.
메모리 관리는 메모리 관리자가 담당한다. 메모리 관리자는 메모리 관리 유닛(Memory Management Unit)이라는 하드웨어인데 일반적으로 메모리 관리자라고 부른다. 메모리 관리자의 작업은 가져오기, 배치, 재배치이다.
각 작업에 정책을 수립하여 그 정책에 따라 메모리를 관리한다.
부족한 메모리 공간을 효율적으로 관리하기 위해 사용되는 메모리 관리 기법 중 하나다. CPU에서 실행되지 않는 프로세스 (준비 또는 대기 상태) 중 일부를 메모리 안에 보관하지 않고 하드디스크와 같은 저장장치에 저장한다.
메모리에 있는 프로세스를 하드디스크로 내보내는 것을 swap out
, 하드디스크의 이미지를 다시 메모리로 불러오는 것을 swap in
이라고 한다.
스와핑은 하드디스크를 활용하여 마치 큰 메모리가 있는 것처럼 더 많은 프로세스를 실행할 수 있다는 장점이 있다. 하지만 문맥 교환(Context Switching) 시간이 많이 증가한다는 문제가 있다. 메모리의 동작 속도와 저장장치의 동작 속도가 매우 큰 차이를 가지고 있기 때문이다. 따라서 스와핑을 구현할 때에는 디스크 내에 별도의 스왑 공간을 사용하거나 실제로 사용하는 부분만 스왑하도록 최적화가 필요하게 된다.
고정 분할 방식의 메모리 할당 방식으로, 프로세스의 크기에 상관없이 메모리가 같은 크기로 나뉜다. 큰 프로세스가 메모리에 올라오면 여러 조각으로 분산되어 배치된다.
가변 분할 방식의 메모리 할당 방식으로, 프로세스의 크이에 맞게 메모리가 분할되므로 메모리의 영역이 각각 다르다. 프로세스를 메모리에 연속적으로 할당하는 기법이다. 각 프로세스가 요구하는 메모리 크기를 분석해서 결정해놓고, 그 프로세스의 메모리를 하나의 덩어리로 설정하여 실제 메모리에 할당해준다.
여러 개의 프로세스가 있을 때, 각각의 프로세스가 요구하는 메모리의 크기가 다를 것이다. 실제로 프로세스를 메모리에 적재할 때 프로세스가 올라간 시작주소만 알고 있다면 프로세스가 사용하는 코드나 함수 또는 변수들의 위치를 손쉽게 바인딩해서 쓸 수 있다.
다음은 프로세스를 새로 실행했을 때, 이 프로세스가 들어갈 수 있는 메모리 영역을 찾아내는 방법이며, 3가지 동적 메모리 할당 기법이 있다.
최초 적합 (First-Fit)
최적 적합 (Best-Fit)
최악 적합 (Worst-Fit)
동적 메모리 할당에서의 문제점은 메모리에 짜투리가 계속 발생한다는 것이다. 즉, 사용 가능한 메모리가 충분히 존재하지만 작은 공간으로 나누어져 프로세스 할당이 불가능한 상태를 말한다.
내부 단편화
고정 분할 방식에서 일정하게 나뉜 메모리보다 크기가 작은 프로세스가 배치될 경우 낭비되는 공간이 생긴다. 이처럼 각 메모리 조각에 프로세스를 배치하고 공간이 남는 현상을 내부 단편화(internal fragmentation)이라고 한다. 동일하게 분할되는 공간의 크기를 조절하여 내부 단편화를 최소화할 수 있다.
외부 단편화
프로세스가 메모리를 할당받고 해제될 때 빈 공간이 생긴다. 이후에 빈 공간보다 큰 프로세스가 들어오면 적당한 메모리를 배정받지 못하는데, 가변 분할 방식에서 발생하는 이러한 작은 빈 공간을 외부 단편화(external fragmentation)이라고 한다.
메모리 압축 (또는 조각 모음)
연속 메모리 할당을 진행하면서 발생한 짜투리 메모리들을 하나로 합쳐 큰 공간을 만드는 것이다. 하지만 압축을 하려면 현재 할당되어 있는 프로세스들의 메모리 위치를 옮겨줘야만 한다. 이러한 작업이 OS에서 꽤 시간이 필요한 작업이기 때문에 효율적이지 않다.
메모리 풀 (Memory Pool)
필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당받아 놓고 필요할 때마다 사용하고 반납하는 기법이다. 메모리의 할당, 해제가 잦은 경우에 효과적이다. 미리 할당해놓고 사용하지 않는 순간에도 계속 할당해놓기 때문에 메모리 누수가 있는 방식이다. 내부 단편화와 외부 단편화가 발생하지 않는다.
구분 | 가변 분할 방식 | 고정 분할 방식 |
---|---|---|
메모리 단위 | 세그먼테이션 | 페이징 |
특징 | 연속 메모리 할당 | 비연속 메모리 할당 |
장점 | 프로세스를 한 덩어리로 관리 가능 | 메모리 관리가 편리 |
단점 | 빈 공간의 관리가 어려움 | 프로세스가 분할되어 처리 |
단편화 | 외부 단편화 | 내부 단편화 |
현대 OS에서 메모리 관리는 기본적으로 고정 분할 방식을 사용하면서 일부분은 가변 분할 방식을 혼합하고 있다.