가상 메모리(Virtual Memory)
메모리가 실제 메모리보다 많아 보이게 하는 기술로, 어떤 프로세스가 실행될 때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하다는 점에 착안하여 고안된 메모리 기법이다.
가상 메모리를 사용하는 이유
물리 메모리는 컴퓨터에 장착된 실제 메모리로서 최대 크기는 CPU에 의해 제한된다.
그러면 운영체제는 물리 메모리보다 큰 프로세스를 실행시킬 수 없을까?
또한 운영체제는 여러 프로세스를 합쳐 물리 메모리보다 클 때 이들을 동시에 실행시킬 수 없을까?
에 대한 해답으로 가상 메모리 기법이 등장했다.
결국 가상 메모리는 물리 메모리보다 큰 프로세스나 여러 개의 작은 프로세스를 동시에 실행시켜,
사용자나 응용프로그램에 무한대의 메모리가 있다고 느끼게 하는 것이다.
프로세스 전체가 메모리에 올라오지 않아도 실행이 가능하게 하여 프로그램이 물리적 메모리보다 커져도 실행이 가능하게 만든다.
가상 메모리는 실제 물리 메모리 개념과 사용자 관점의 논리 메모리를 분리한 것이다.
그래서 사용자가 메모리 크기에 관련된 문제를 염려하지 않아도 된다.
운영체제는 가상 메모리 기법을 통해 프로그램의 논리적 주소 영역에서 필요한 부분만 물리적 메모리에 적재하고,
직접적으로 필요하지 않은 메모리 공간은 디스크에 저장하게 된다.
논리주소와 가상주소
프로그램/프로세스 내에서 사용되는 주소를 논리 주소라고 한다.
논리주소를 가상주소라고도 하는데, 둘은 같은 의미이다.
컴파일러 입장에선 프로그램 내에서 코드와 변수의 주소는 프로그램 내에서의 상대적인 주소이므로 논리 주소라고 부르지만,
가상 메모리를 다루는 운영체제 입장에선 가상 주소 공간 내에서 사용되는 주소를 가상 주소라고 부르는 것이 더 적합하다.
가상 메모리와 가상 주소 공간
가상 메모리와 가상 주소 공간은 다른 개념이다.
가상 주소 공간은 각 프로세스 당 주어지는 논리적인 공간이다.
가상 주소 공간의 크기는 물리 메모리의 크기와 독립적이며, 레지스터 크기에 종속적이다.
OS가 프로세스를 시작할 때 할당해주는 가상 메모리 공간이며 프로세스에서 사용 가능한 주소의 범위다.
OS가 제공하는 가짜 메모리(프로그래머는 실제 메모리라 간주하고 사용하면 된다.)
32bit 시스템
- 보통 4GB 크기의 가상 메모리 영역을 할당 받는다.
- 보통 하위 2GB를 유저 공간에, 상위 2GB는 시스템 공간에 사용된다.
- 하지만 사용자에 의해 유저 공간을 3GB로 늘릴 수 있다.
- 범위 : 0x00000000 ~ 0x7FFFFFFF
64bit 시스템
- 이론적으로는 16EB의 가상 메모리 영역을 할당 받을 수 있지만 너무 크고 비효율적이여서 128TB 정도로 제한하고 있다.
- 범위 : 0x000’00000000 ~ 0x7FFF’FFFFFFF
가상 주소 공간 구조
4GB로 가정하겠다.
- 가상 메모리의 구조는 크게 나누어 사용자 영역과 커널 영역으로 나눌 수 있다.
- 가상 메모리가 할당되면 2GB의 사용자 영역과 2GB의 커널 영역으로 나누어 진다.
사용자 영역
- 우리가 보통 사용하는 일반 응용 프로그램들이 사용하는 공간
- 0x00000000 ~ 0x7FFFFFFF
커널 영역
- 단일 공간으로, 커널모드를 사용하는 모든 프로세스에서 공유되며, 커널 영역은 공유되면서 시스템 운영에 필수적이기 때문에 주로 페이지 파일보다는 RAM에 존재하고 있다.
- 0x80000000 ~ 0xFFFFFFFF
주소 변환
운영체제에서 주소 변환(Address Translation)은 가상 주소를 물리 주소로 변환하는 과정을 말한다.
주로 메모리 관리 기법과 관련이 있고, 운영체제에서 중요한 역할을 한다.
바인딩 유형
프로그램이 적재되는 물리적 메모리의 주소가 결정되는 시기에 따라 세 가지로 분류할 수 있다.
Compile Time Binding
바인딩 시점 :물리적 메모리 주소가 프로그램을 컴파일 할 때.
즉, 프로그램 내부에서 사용하는 주소와 물리적 메모리 주소가 동일하다.
물리적 메모리 위치를 변경하려면 컴파일을 다시 해야 해서 잘 사용하지 않고,
이미 다른 프로세스가 메모리를 차지하고 있는 경우도 있어 하나의 프로세스만 사용될 때 사용한다.
Load Time Binding
바인딩 시점 : 프로그램이 시작될 때.
로더의 책임하에 물리적 메모리 주소가 부여되고, 프로그램이 종료될 때까지 물리적 메모리상의 위치가 고정된다.
즉, 프로그램 내부에서 사용하는 주소와 물리적 주소는 다른 방식이다.
물리적 메모리 주소와 논리적 메모리 주소를 분리하여 컴파일 타임 바인딩과는 다르게 멀티프로그래밍이 가능하다.
하지만 메모리를 참조하는 명령어를 다 변경해 줘야 해서 메모리 로딩 시간이 엄청 길기 때문에 실제로는 사용하지 않는다.
Run Time Binding
바인딩 시점 : 프로그램이 시작한 이후.
cpu가 주소를 참조할 때마다 해당 데이터의 물리적 메모리가 어디에 위치해야 되는지 주소 매핑 테이블을 이용해 바인딩을 점검한다.
또한, 다른 방식들과 다르게 실행시간에 바인딩이 이루어지므로 기준 레지스터와 한계 레지스터를 포함한 MMU라는 하드웨어적인 지원이 뒷받침 되어야 합니다.
'CS > 운영체제' 카테고리의 다른 글
요구 페이징과 페이지 교체 알고리즘 (0) | 2024.06.23 |
---|---|
페이징 (0) | 2024.06.23 |
PCB와 Context Switching (0) | 2024.06.18 |
인터럽트 (0) | 2024.06.17 |
시스템 콜 (0) | 2024.06.16 |