CPU -> 레지스터 -> CPU캐시 -> 메인메모리 -> 보조기억장치 -> 외부기억장치
CPU로부터 멀어질수록 데이터를 저장하는 용량이 커지고, 접근하는 속도는 느려진다.
실제 물리적인 메모리 크기에 상관없이 가상 메모리 공간을 프로세스에게 제공한다.
이런 가상 메모리 공간은 프로세스 전체를 메모리에 적재하지 않아도 프로세스의 실행이 가능하도록 한다.
메인 메모리의 크기가 한정되어 있으므로 물리적인 메모리 크기보다 크기가 큰 프로세스를 실행시킬 수 없다.
예를들어, 100MB 메인 메모리에서 200MB 크기의 프로세스를 실행할 수 없게 되는 것이다.
그렇다면 메인 메모리보다 크기가 큰 프로세스를 실행시키고 싶으면 어떻게 해야 할까?
단순히 메인 메모리가 더 큰 컴퓨터를 사용해야하는가?
이런 방법은 매우 비효율적일 것이다.
그래서 나온 방법이 바로 가상 메모리이다.
프로세스의 모든 코드는 항상 필요한 것이 아니다.
오류 처리하는 부분이나 필요 없는 배열 부분은 실제로 프로세스가 잘 동작한다면 필요 없는 부분이 된다.
따라서 프로세스는 필요한 부분(페이지)만 메모리(프레임)에 올림으로서 메인 메모리에 올라가는 프로세스의 크기를 줄인다.
프로세스 전체를 메모리에 올릴 필요가 없는 것이다.
이러한 가상 메모리 방식은 페이지 교체 알고리즘을 통해 각 시점에 필요한 페이지만 메모리(프레임)에 올려, 전체 프로세스를 실행시킬 수 있는 것이다.
UNIX 시스템은 프로세스에게 4GB의 가상 메모리 공간을 할당한다.
상위 1GB는 커널이, 하위 3GB는 사용자 프로그램이 차지한다.
하위 3GB의 사용자 프로그램 영역은 Stack, Heap, Bss, Data, Code 영역으로 구분된다.
Stack 영역
Heap 영역
Data 영역
Code 영역
Code, Data, BSS 영역은 컴파일 시 크기가 결정되고, Heap, Stack 영역은 런타임 시 크기가 결정된다.
참조
https://recorda.tistory.com/entry/20160503%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
https://copycode.tistory.com/113