
프로세스에 연속적인 메모리 공간을 할당하는 것을 연속 메모리 공간 할당이라고 한다.
연속 메모리 공간 할당에서는 프로세스 A가 A의 크기만큼 메모리 주소를 할당받아 배치되고, 프로세스 B는 프로세스 A 이후에
B의 크기만큼 연속적으로 메모리 주소를 할당받아 배치된다.

그런데 이 방식에는 치명적인 문제점이 있다.
바로, 실제 물리 메모리보다 큰 프로세스를 실행할 수 없다는 것.
이 문제를 해결하기 위한 방법 중 하나는 스와핑이다.
스와핑은 메모리에 적재된 프로세스들 중 현재 실행되고 있지 않은 프로세스를 임시로 스왑 영역이라는 보조기억장치의 일부인 영역으로 쫓아내고 ,
프로세스를 쫓아낸 자리에 생긴 메모리 상의 빈 공간에 다른 프로세스 전체를 적재하여 실행하는 메모리 관리 방식을 말한다.

이 방식을 통해 메모리를 효율적으로 사용할 수 있을 뿐만 아니라,
여러 프로세스가 번갈아 메모리를 사용할 수 있게 되어 동시에 실행 가능한 프로세스 수를 늘릴 수 있다.

##ㅇ# 스와핑의 문제점
그러나, 스와핑 역시 완전한 해결책은 아니다.
프로세스가 메모리에 연속적으로 할당되는 환경에서 프로세스의 실행과 종료를 반복하면 메모리 사이 사이에 빈 공간이 생기는데
이 빈공간 때문에 문제가 생긴다. 이를 외부단편화 라고 한다.
예를 들어, 빈 공간의 총합이 50MB 라 하더라도 크기가 50MB 인 프로세스를 적재하는 것은 불가능하다.
메모리에 남아 있는 공간이 각각 30MB 와 20MIB 이기 때문이다.

결론 : 스와핑에는 아래와 같은 문제가 있다.
① 프로세스들이 메모리에 배치될 때 중간중간 빈 공간이 생겨 메모리를 효율적으로 쓰지 못한다.
② 실제 물리 메모리보다 큰 프로세스를 모두 동시에 실행할 수 없다
가상 메모리(Virtual Memory)란 실행하고자 하는 프로그램의 일부만 메모리에 적재하여, 실제 물리 메모리보다 더 큰 프로세스도 실행할 수 있도록 만드는 메모리 관리 기법이다.
보조기억장치의 일부를 메모리처럼 활용하거나, 프로세스 전체가 아닌 일부만 메모리에 적재함으로써 실제보다 더 큰 메모리 공간이 있는 것처럼 보이게 하는 것이다.
가상 메모리 관리 기법에는 페이징과 세그멘테이션이 있다.

가상 메모리로 메모리를 관리할 때, 가장 보편적으로 사용되는 방식이 페이징이다.
페이징은 프로세스의 논리 주소 공간을 페이지(Page)라는 일정한 단위로 나누고, 물리 주소 공간도 페이지와 동일한 크기의 프레임(Frame)으로 나눈 뒤, 페이지를 프레임에 불연속적으로 할당하는 방식이다.
연속 메모리 할당은 프로세스를 하나의 연속된 공간에 통째로 배치해야 했기 때문에, 빈 공간이 여기저기 흩어져 있으면 그 합이 충분해도 프로세스를 적재하지 못하는 외부 단편화 문제가 있었다. 반면 페이징은 프로세스를 일정한 크기의 페이지로 잘게 나눈 뒤, 각 페이지를 메모리 어디에 있든 상관없이 빈 프레임에 하나씩 나눠서 할당할 수 있다. 즉 연속된 공간을 확보할 필요가 없으므로, 빈 프레임이 하나라도 있으면 그 크기는 항상 페이지 크기와 정확히 일치해 낭비되는 자투리 공간이 생기지 않고, 외부단편화 문제도 사라진다.

페이징에서의 스왑 인/아웃을 각각 페이지 인, 페이지 아웃이라고 한다.
이를 통해 프로세스 단위의 스와핑이 아닌, 페이지 단위의 스와핑이 이루어진다.
프로그램의 일부만 메모리에 적재할 수 있는 것이다.
다만, 메모리 내에 페이지가 불연속적으로 배치되어 있다면 CPU 입장에서는 다음으로 실행할 페이지의 위치를 찾기가 어렵다.
연속 메모리 할당과 달리, 프로세스를 이루는 어떤 페이지가 어떤 프레임에 적재되어 있는지를 CPU가 모두 파악하기 곤란해지기 때문이다.

페이지 테이블을 사용하면 이 문제를 해결할 수 있다.
페이지 테이블이란 프로세스의 페이지와 실제로 적재된 프레임을 짝지어주는 정보로,
페이지 번호와 프레임 번호가 대응되어 있으며 프로세스마다 개별적으로 존재한다.
이를 통해 CPU는 페이지 번호만으로 해당 프레임을 찾아 접근할 수 있으며, 물리적으로 불연속적(분산)으로 배치된 페이지들을 논리 주소상에서는 연속적으로 배치된 것처럼 인식할 수 있다. 그 결과 CPU는 페이지 테이블에 기록된 정보를 바탕으로 0번 페이지부터 끝까지 순차적으로 페이지를 실행할 수 있다.
각 프로세스는 자신만의 페이지 테이블을 갖고 있고, 이 페이지 테이블 역시 메모리 어딘가에 저장되어 있으니,
CPU는 페이지 테이블 베이스 레지스터(PTBR)를 통해 현재 실행 중인 프로세스의 페이지 테이블 위치를 알 수 있는 것이다.

코드 영역, 데이터 영역, 스택 영역처럼 의미 단위(논리적 단위)로 메모리를 할당한다.
세그먼트는 페이지와 달리 크기가 고정되어 있지 않아 코드 영역 20KB, 데이터 영역 35KB처럼 서로 다른 크기를 가질 수 있으며, 이 세그먼트 단위로 물리 메모리에 배치된다.

가상메모리의 개념을 이해하기 위해 필요한 기본적인 내용들을 간략하게 알아보았다.
연속 메모리 할당의 문제점과 이를 해결하기 위한 가상메모리의 개념을 살펴보며, 외부 단편화 문제를 어떻게 해결할 수 있는지...
정리한 내용을 바탕으로 스터디 질문에 잘 답변해보자.
또, 페이지 폴트, 페이지 주소 체계, 내부 단편화 등 관련 개념까지 함께 다루면 내용이 방대해질 수 있어 이번 주에는 생략했는데,
추후 함께 공부해 보면 가상메모리를 잘 이해하는 데 도움이 될 것이라 생각한다.