프로세스를 메모리에 연속적으로 할당하는 기존 방식은 크게 두 가지 문제를 내포하고 있습니다.
1. 외부 단편화: 메모리 사이사이에 빈 공간이 생겨 메모리가 낭비되는 현상
2. 물리 메모리 크기의 한계: 프로세스를 반드시 메모리에 연속적으로 통째로 올려야 한다면, 실제 물리 메모리(RAM)보다 덩치가 큰 프로그램은 아예 실행조차 할 수 없음
이러한 한계를 극복하기 위해 등장한 기술이 가상 메모리입니다.
가상 메모리는 실행하고자 하는 프로그램을 한 번에 통째로 올리지 않고, '당장 필요한 일부만 메모리에 적재'하여 실제 물리 메모리 크기보다 훨씬 더 큰 프로세스를 실행할 수 있게 해주는 마법 같은 기술입니다.
대표적인 구현 기법으로 페이징(Paging)과 세그멘테이션(Segmentation)이 있으며, 현대의 대부분의 운영체제는 페이징 기법을 근간으로 사용합니다.
연속 메모리 할당에서 외부 단편화가 생기는 근본적인 이유는 '각기 다른 크기'의 프로세스들이 메모리에 할당되었기 때문입니다. 만약 메모리와 프로세스를 완벽하게 똑같은 일정한 크기로 자르고, 이를 메모리에 불연속적으로 흩뿌려 할당할 수 있다면 빈 공간이 생기지 않을 것입니다. 이것이 페이징의 핵심 아이디어입니다.
페이징 기법을 사용하면 메모리를 관리하는 단위가 프로세스 전체가 아니라 더 작은 '페이지'가 됩니다. 따라서 스와핑 역시 페이지 단위로 이루어집니다.
페이징 기법은 외부 단편화를 해결하지만 새로운 문제를 낳습니다. 프로세스가 메모리에 불연속적으로 뿔뿔이 흩어져 배치되어 있다면, CPU 입장에서는 다음 실행할 명령어의 위치를 찾기 어려워 순차적인 실행이 불가능해집니다.
이를 해결하기 위해 운영체제는 페이지 테이블(Page Table)이라는 특별한 이정표를 사용합니다.

페이징을 도입하면 메모리 외부 단편화(External Fragmentation)는 완벽히 해결되지만, 대신 내부 단편화라는 새로운 부작용이 생길 수 있습니다.