초기 컴퓨터는 하나의 메모리에 단 하나의 프로세스만 올릴 수 있다.

물리 메모리에 하나의 실행 중인 프로세스가 존재했으며, OS를 제외한 나머지 메모리를 사용했다.
-> 하나의 메모리가 메모리 공간을 다 차지하기 때문에 매우 좋지 않은 활용성과 효율성을 보여준다.
멀티 프로그래밍 개념이 대두되면서 사람들은 컴퓨터를 더 효율적으로 사용
초기 시스템의 문제를 해결하기 위해 시분할(Time Sharing) 기법이 제안되었다.
-> 이를 통해 여러 개의 프로그램을 하나의 메모리에서 실행할 수 있도록 메모리 구성이 바뀌었다.
하나의 메모리에 여러 프로세스를 올려 실행하게 되면서 메모리 활용성과 효용성이 증가한다.

프로세스 간에 데이터를 침범할 수 있는 문제가 발생했다.가상 메모리의 목표이다.프로그램이 실행되면 운영체제는 실행 파일의 명령들을 읽어 프로세스를 생성하고 메모리를 할당하게 되는데 이를 프로세스 주소 공간이라고 한다.
운영 체제가 실제 메모리(physical memory)를 추상화해서 만든 것이 곧 주소 공간

주소 공간은 현재 실행중인 프로그램, 즉 프로세스의 모든 정보가 들어있다.
코드, 스택, 힙과 같이 프로그램을 실행시키기 위한 모든 상태를 주소 공간이 가지고 있게 된다.
하나의 프로세스가 전체의 메모리를 차지하지 않는다.
그림을 보면 프로그램 코드가 하위 주소에 배치되는데, 프로그램 코드는 정적이기 때문에
프로그램이 실행되면서 추가적인 메모리를 필요로 하지 않으며, 따라서 메모리에 저장하기 쉽기 때문에 하위 주소에 배치한다
Heap 영역과 Stack 영역은 동적으로 할당되기 때문에 free 공간을 두어서 배치하게 된다
가상 메모리란, 운영체제가 실제 메모리를 추상화해 현재 실행 중인 프로그램에게 나눠주는 것을 의미
가상 메모리의 핵심은 운영체제가 프로세스에게 특정 주소의 메모리에 올라가고 잠재적으로 매우 큰 주소 공간을 가지고 있다고 착각하게 만든다는 것
가상 메모리에서는 프로세스마다 각자의 메모리를 가지게 됨
즉, 프로세스의 가상 메모리 주소가 같다고 해서 물리 메모리 상의 주소도 같은 것이 아님

예를 들어, P1,P2,P3 가 가지고 있는 가상 메모리의 주소에서 똑같은 100이라는 물리 메모리를 가리킨다해도 실제 물리 메모리에서는 서로 다른 메모리 주소로 변환
프로세스가 만약 2GB의 메모리를 사용한다 해서 실제 물리 메모리가 2GB 사용되지는 않는다.
필요한 부분만 적재되기 때문자신의 가상 주소 공간 내에서만 메모리에 접근할 수 있어야 하며, 다른 프로세스의 메모리 영역에는 절대 접근할 수 없어야 한다.서로 격리시켜 특정 프로세스에서 발생한 문제가 다른 프로세스에게 영향이 가지 않도록 해야한다.