Memory Virtualization 메모리 가상화
메모리 가상화는 무엇일까?
- OS는 physical memory를 가상화한다.
- OS는 각 프로세스마다 메모리 공간에 대한 환상을 제공한다.
- 이것은 마치 각 프로세스가 자신만의 메모리를 사용하는 것처럼 보이게 한다.
→ Physical memory는 정해져 있지만 process에게 공간이 엄청 많은 것처럼, 혼자 써도 되는 것처럼 illusion을 제공한다.
목표는?
OS입장에서는 프로세스에게 address space를 잘 나눠줘야 함.
세가지 측면에서 생각할 수 있음.
- Transparency 투명성 : process가 memory load가 다 됐다고 믿는 것.
- 프로세스는 메모리가 공유되고 있다고 인지하면 안된다.
- 프로그래밍을 위한 편리한 추상화를 제공한다.
- 예를 들면, 크고 연속적인 메모리 공간을 주어서 추상화가 편리하도록
- Efficiency 효율성
- 다양한 크기의 요청으로 인한 단편화(fragmentation)를 최소화합니다. (Space 측면)
- 하드웨어의 지원을 얻는다. (Time 측면)
- Protection : 보호
- 실제 여러 process가 하나의 Memory에 접근하는 것이므로 서로에게 영향을 끼치면 안됨.
- 다른 프로세스로부터 os와 프로세스를 보호한다.
- Isolation(고립) : 프로세스는 다른 프로세스에 영향을 끼치지 않고 실패할 수 있다.
- 협력 프로세스는 메모리의 일부를 공유할 수 있다.
초기의 OS
메모리에 하나의 프로세스만 적재했다.
utilization과 efficiency 부분이 별로였다.

Multiprogramming and Time Sharing
Multiprogramming이라는 것은 메모리에 여러개의 program load가 가능하다는 것
- Load multiple processes in memory
- 짧은 기간 동안 실행한다.
- 메모리에서 그들 사이에 process를 교체한다.
- utilization과 efficiency를 증가시킨다.
- 중요한 보호 문제를 야기한다.
Address Space
OS는 physical memory에 대한 추상화를 생성한다.
- 주소 공간은 실행중인 프로세스를 모두 포함한다.
- 그것은
program code, heapstack 등등을 포함한다.
- Code : 명령어가 어디에 위치해있는지
- Heap : 동적 메모리 할당
- c에서는 malloc으로, 객체지향에서는 new 로 할당 가능
- Stack : 반환되는 주소와 값을 저장하고, 루틴에 대한 지역 변수를 포함한다.

→ 프로세스마다 가지고 있는 address space는 mapping을 통해 physical memory에 저장이 된다. 이것이 바로 Memory virtualization
Virtual Address
실행중인 프로그램의 모든 주소는 virtual이다.
output이 다음과 같을 때 address space를 보면 code, heap, stack의 시작 주소를 알 수 있음. 하지만 이건 가상주소임.