운영체제가 메모리를 관리하는 기법에 대해 알아보자.
현재 사용되지 않는 프로세스들을 보조 기억장치의 일부 영역인 스왑 영역으로 쫒아내고, 그렇게 생긴 빈 공간에 새 프로세스를 적재하는 법.
지금 당장 사용하지 않는 프로세스들만을 메모리에 적재하는 방법이라 훨씬 더 효율적으로 관리할 수 있다.
쫒아내는 행위를 스왑 아웃, 들여보내는 행위를 스왑 인이라고 한다.
스와핑을 통해 실제 메모리의 크기가 프로세스들이 요구하는 메모리 크기보다 작아도, 프로세스들을 동시에 실행할 수 있다.
프로세스는 메모리의 빈 공간에 할당되어야 하는데, 만약 빈 공간이 여러 개 있다면 어디에 할당해야 할까?
연속적으로 메모리를 할당하는 세 가지 방식에 대해 알아보자.
최조 적합 (first-fit)
운영체제가 순서대로 메모리의 빈 공간을 찾고, 적재 가능한 공간을 발견하는 대로 그 공간에 프로세스를 배치한다.
검색 최소화, 빠른 할당
최적 적합 (best-fit)
운영체제가 빈 공간을 모두 검색한 뒤 적재가 가능한 공간 중 가장 작은 공간에 프로세스를 배치한다.
최악 적합(worst-fit)
운영체제가 빈 공간을 모두 검색한 뒤 적재 가능한 공간 중 가장 큰 공간에 프로세스를 배치한다.
위에서 알아본 세 가지 방법은 언뜻 보면 효과적일 수 있으나, 이렇게 프로세스를 연속적으로 메모리에 할당하는 방식은 효율적이지 않다.
외부 단편화(external fragmentation)라는 문제가 발생하기 때문
다음 상황을 고려해보자.
사용자 영역이 200MB일때, 네 가지 프로세스들을 차례대로 적재해야 한다면?
- 50MB인 프로세스 A
- 30MB인 프로세스 B
- 100MB인 프로세스 C
- 20MB인 프로세스 D
우선 A~D를 순서대로 적재하였다고 생각해보자.
프로세스 B와 D가 실행이 끝나면, 메모리를 반환할테니 아래와 같을 것이다.
이때 남은 공간의 총량은?
당연히 50MB이다.
그렇다면 빈 공간에 50MB의 프로세스를 적재할 수 있는가?
불가능하다!
이러한 문제를 외부단편화라고 한다.
즉 프로세스들이 실행과 종료를 반복하면서 메모리 사이 사이에 빈 공간이 발생하는데, 외부 단편화는 프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해 메모리가 낭비되는 현상을 말한다.
다른 예시를 보자.
이런 문제점을 해결할 수 있는 방법들도 있다.
여기저기 흩어져 있는 빈 공간들을 하나로 모으는 방법이다.
프로세스를 재배치하여 작은 빈 공간들을 모아서 하나의 큰 빈공간으로 만든다.
이 방식은 실행중인 공간을 재배치하는 과정에서 많은 오버헤드가 발생할 수 있다. 또 오버헤드를 최소화할 수 있는 재배치 방법이 명확하지 않다는 단점들이 있다.
현대에서 가장 대중적으로 쓰이는 기법이다.
다음 시간에 페이징에 대해 더 자세히 알아보자.