관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

가상 메모리 1 - 연속 메모리 할당 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

가상 메모리 1 - 연속 메모리 할당

huenuri 2024. 10. 18. 11:05

수학 공부도 마쳤고 이제 아침 공부가 3시간도 남지 않았지만 가능하면 14장 학습을 마쳐보려고 한다. 14장은 가상 메모리 단원인데 3개의 절로 이루어져 분량이 정말 많다. 차근차근 학습해 보기로 하자. 이제 고지가 얼마 남지 않았다.

운영체제의 가장 핵심적인 역할을 꼽으라 한다면 프로세스 관리와 메모리 관리라 할 정도로 중요한 영역이다. 지금까지 운영체제의 프로세스 관리에 대해 알아보았다면 이번에는 큰 주제를 전환하여 운영체제의 메모리 관리 기법에 대해 알아볼 것이다.

 

이번 절에서는 기본적인 메모리 관리 기법인 스와핑과 메모리에 프로세스를 할당하는 방식, 그리고 연속 메모리 할당의 부작용인 외부 단편화에 대해 학습해보겠다.

 

 

 

지금까지는 메모리 내에 프로세스들이 연속적으로 배치되는 상황을 가정했다. 위의 그림과 같이 프로세스 A는 A의 크기만큼 메모리 주소를 할당받아 연속적으로 배치되고, 프로세스 B는 프로세스 A 이후 B의 크기만큼 연속적인 메모리 주소를 할당받아 배치되는 식으로 말이다.

이번 절에서는 프로세스들을 메모리에 연속적으로 할당할 때 무엇을 고려해야 하는지, 어떤 잠재적인 문제가 있는지 학습해 보겠다.


 

 

 

 

스와핑

메모리에 적재된 프로세스들 중에는 현재 실행되지 않는 프로세스가 있을 수 있다. 입출력 작업의 요구로 대기 상태가 된 프로세스라던지, 오랫동안 사용되지 않는 프로세스가 이런 프로세스에 속한다.

 

이때 프로세스들이 쫓겨나는 보조기억장치의 일부 영역을 스왑 영역이라고 한다. 그리고 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것을 스왑 아웃, 반대로 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것을 스왑 인이라고 한다.

스압 아웃되었던 프로세스가 다시 스왑 인이 될 때는 스왑 아웃되기 전의 물리 주소와는 다른 주소에 적재될 수 있다.

 

 

스와핑을 이용하면 프로세스들이 요구하는 메모리 주소 공간의 크기가 실제 메모리 크기보다 큰 경우에도 프로세스들을 동시 실행할 수 있다. 위의 그림을 보면 프로세스 A, B, C, D의 크기를 합하면 메모리의 크기보다 크지만, 스와핑을 통해 네 개의 프로세스를 동시에 실행할 수 있다는 것을 알 수 있다.

그림 속 검은색 부분은 프로세스를 적재할 수 있는 메모리 영역을 나타낸다.

 

 

 

유닉스와 리눅스, macOS에서는 free, top 명령어 등을 통해 스왑 영역의 크기를 확인할 수 있다. 스왑 영역의 크기와 사용 여부는 사용자가 임의로 설정할 수 있다.


 

 

 

 

메모리 할당

20MB 크기의 프로세스를 적재하고 싶다고 해보자. 메모리 사용자 영역은 총 200MB가 있다고 할 때, 프로세스를 적재할 수 있는 빈 공간은 빈 공간 A, 빈 공간 B, 빈 공간 C 세 군데가 있다.

 

 

 

최초 적합

 

운영체제가 빈 공간 A → 빈 공간 B → 빈 공간 C 순으로 빈 공간을 검색했다면 프로세스는 빈 공간 A에 적재된다. 최초 적합 방식은 프로세스가 적재될 수 있는 공간을 발견하는 즉시 메모리를 할당하는 방식이므로 검색을 최소화할 수 있고 결과적으로 빠를 할당이 가능하다.

 

 

 

 

최적 적합

프로세스가 적재될 수 있는 빈 공간 중 가장 작은 공간은 빈 공간 C이다. 그렇기에 최적 적합 방식으로 메모리를 할당하면 프로세스는 빈 공간 C에 할당된다.

 

 

 

 

최악 적합

 

프로세스가 적재될 수 있는 빈 공간 중 가장 큰 공간은 빈 공간 B이다. 그렇기에 최악 적합 방식으로 메모리를 할당하면 프로세스는 빈 공간 B에 할당된다.


 

 

 

 

외부 단편화

 

 

 

아무런 프로세스도 적재되지 않은 상태의 메모리 전체를 그려 보면 아래와 같이 표현할 수 있다. 운여체제 영역에는 운영체제가 적재되어 있고, 사용자 영역에는 어떠한 프로세스도 적재되어 있지 않다.

 

 

 

사용자 영역에 하나둘 씩 프로세스들이 적재되는 상황을 상상해 보자.

 

 

 

이 프로세스들은 더 이상 메모리에 남아있을 필요가 없다.  프로세스 B와 D가 메모리를 떠나면 위와 같이 프로세스 B와 D가 있던 자리에 빈 공간이 생긴다.

 

 

답은 50MB이다. 위 그림과 같은 상황에서 50MB 크기의 프로세스를 적재할 수 있을까? 불가능하다. 빈 공간의 총합은 50MB일지라도 어느 빈 공간에도 50MB 크기의 프로세스가 적재될 수 없기 때문이다.

 

 

 

 

프로세스 B가 스왑 아웃되고 프로세스 B보다 작은 프로세스 D가 적재되었을 때 외부 단편화가 발생하는 것을 볼 수 있다. 

 

 

 

 

이 예시들에서는 메모리에 프로세스가 몇 개 없는 간단한 상황을 가정했기에 외부 단편화가 큰 문제가 아닌 것처럼 보일 수 있지만, 실제로는 이보다 메모리의 용량도 크고 적재되는 프로세스도 많기 때문에 외부 단편화로 인해 낭비되는 공간은 더욱 크다.

 

 

 

 

다만 압축 방식은 단점이 있다. 작은 빈 공간들을 하나로 모으는 동안 시스템은 하던 일을 중지해야 하고, 메모리에 있는 내용을 옮기는 작업은 많은 오버헤드를 야기한다. 또한 어떤 프로세스를 어떻게 움직여야 오버헤드를 최소화하며 압축할 수 있는지에 대한 명확한 방법을 결정하기 어렵다.

 

이것이 오늘날까지도 사용되는 가상 메모리 기법, 그중에서도 페이징 기법이다.

 


 

 

 

학습을 마치고

1시간이 되지 않아서 학습을 마쳤다. 그리고 푼 문제도 모두 맞았다. 조금 헷갈리는 개념이 있지만 한 두 번 더 보면 암기할 수 있을 것 같다.

바로 이어서 페이징을 통한 가상 메모리 관리에 대해서 학습해 볼 것이다. 연속 메모리 할당은 오버헤드가 발생한다는 단점이 있어서 대부분 페이징 기법을 사용해서 메모리를 관리한다고 한다. 메모리와 CPU 공부를 하는 것도 이제 재미있어졌다. 나중에 컴퓨터 부품들도 직접 조립해 보고 어떻게 돌아가는지 만져보고 싶다.