가상 메모리는 프로세스마다 자기만의 연속된 메모리 공간을 가진 것처럼 보이게 OS가 만들어주는 추상화.
실제로는 RAM뿐 아니라 디스크까지 포함해서, OS와 MMU가 가상 주소 -> 물리 주소를 매핑 해줌.
각 프로세스는 독립적인 가상 주소 공간을 가짐
어떤 프로세스든 0x0040 같은 주소를 자기 코드 영역으로 쓸 수 있지만, 실제 물리 RAM 위치는 서로 다름
메모리는 보통 페이지 단위(예: 4KB)로 관리되고, 페이지 테이블이 '이 가상 페이지가 물리 RAM의 어느 프레임에 있는지'를 기록
자주 쓰는 변환 결과는 TLB(Translation Lookaside Buffer)에 캐시되어 속도를 높임
메모리 보호
각 프로세스가 다른 프로세스의 메모리를 마음대로 접근하지 못하도록 막음
프로세스별 독립성
각 프로세스가 0번지부터 시작하는 자기 공간을 가진 것처럼 동작하므로, 프로그램 입장에서는 주소 충돌을 신경 쓸 필요가 줄어듦
더 큰 메모리를 쓰는 것처럼 사용
RAM이 부족해도, 당장 필요 없는 페이지는 디스크로 내보내고(스왑), 필요한 순간 다시 가져오는 방식으로 큰 주소 공간을 제공할 수 있음
효율적인 메모리 사용
실제로 안 쓰는 영역까지 RAM에 올리지 않고, 필요할 때만 페이지를 할당/로딩 함
가상 메모리와 물리 메모리를 같은 크기의 페이지와 프레임이라는 고정 크기 블록으로 나누는 방식.
OS는 프로그램이 필요로 하는 메모리를 페이지 단위로 관리하며, 필요한 페이지만 물리 메모리에 적재.
각 프로세스의 가상 주소와 실제 물리 주소를 매핑하는 테이블인 페이지 테이블이 존재.
고정 크기 단위라 외부 단편화가 거의 없음.
반면, 1바이트만 써도 페이지 1개를 잡을 수 있어서, 페이지의 남는 부분이 생기는 내부 단편화 문제가 발생할 수 있음.
메모리를 페이지처럼 똑같이 자르는 방식이 아니라, 프로그램 논리 단위로 나눔.
(예: Code Segment, Data Segment, Stack Segment 등)
즉, Segment는 가변 크기.
가변 크기기 때문에 내부 단편화 문제가 줄어듦.
하지만 메모리의 할당/해제를 반복할 경우 빈 공간이 조각조각 남는 외부 단편화 문제가 발생할 수 있음.
Paging: 고정 크기 단위 → 외부 단편화 ↓ / 내부 단편화 ↑ 가능 / 현대 OS 표준
Segmentation: 가변 크기 단위 → 내부 단편화 ↓ / 외부 단편화 ↑ / 관리 복잡