OS는 CPU뿐만 아니라 physical memory 또한 가상화한다.
이를 통해 OS는 각 프로세스에게 독립적인 메모리공간을 사용하는 것과 같은 착각을 준다. (각 프로세스가 전체 메모리를 사용하는 것과 같이 만들어줌)
Memory Virtualization의 이점
- 프로세스마다 메모리 공간을 관리하지 않아도 되기 때문에 프로그래밍을 쉽게 할 수 있다.
- 프로세스를 잘못된 접근으로부터 보호할 수 있다.
- 시/공간 측면에서 효율적이다. (아래 과거 OS와의 차이를 비교해보면 알 수 있음)
OS in the Early System
초창기 OS는 메모리에 단 하나의 프로세스만을 올렸다.
이렇게 되면 프로세스가 메모리를 조금만 사용하더라도 모든 메모리를 프로세스에게 할당해주어야하기 때문에 utilization 측면에서 비효율적이다.
이는 프로세스에 할당된 메모리 중 안쓰는 메모리를 다른 프로세스에 할당할 수 없는 문제인 internal fragmentation이 매우 큰 것과 같다.
Multiprogramming
이후 OS에서는 메모리에 여러 프로세스를 올리고 프로세스를 메모리 상에서 switching 함으로써 utilization을 높인다.
Address Space
운영체제는 physical memory에 대한 추상화를 제공한다.
이전 게시글에서 CPU Virtualization을 위해 각 프로세스들이 돌아가며 CPU time 을 공유한 것 처럼, Memory Virtualization을 위해 address space(주소공간) 라는 추상화가 제공된다.
프로세스의 주소공간은 실행중인 프로세스에 대한 모든 것을 담고있다. (code, heap, stack..)
- Program code영역은 프로그램의 instruction들을 담고있다.
- Heap영역은 동적으로 할당된 메모리를 포함한다.
- Stack영역은 리턴주소와 리턴값, 함수로 전달되는 인자 등을 포함한다.
Virtual Address
프로그램에서 사용되는 모든 주솟값들은 virtual 주소이다.
운영체제에 의해 이 가상주솟값들은 physical address로 변환된다.
예를 들어 다음과 같은 코드를 실행하면, x의 실제 physical 한 주소는 다르더라도 여러 실행결과에서 같은 값이 출력될 수 있다.
int x = 1;
cout << (void *) &x << endl;
Address Translation
메모리 가상화는 하드웨어의 도움을 통해 효율성을 높인다.
예를 들어 맵핑테이블의 base주소를 가리키는 cr3 레지스터나 TLB(Translation Look-aside Buffer) 등이 있다.
단순화된 상황을 먼저 가정해보자.
1. address space는 physical memory에 연속적으로 존재한다.
2. address space의 사이즈는 physical memory의 사이즈보다 작다.
3. 모든 address space는 동일한 사이즈를 갖는다.
실제 필요한 정보는 physical address에 들어있고, 하드웨어는 virtual address를 physical address로 변환한다.
OS는 프로세스의 Address space를 physical 메모리의 특정 위치에 맵핑한다.
그리고 physical memory에서의 시작 위치와 address space의 크기를 담고있는 두 개의 레지스터가 있다면 virtual address와 physical address를 translation할 수 있다.
하드웨어 기반의 Relocation은 다음과 같이 이루어진다.
physical memory에서의 시작 위치를 담고있는 base 레지스터와 address space 의 크기를 담고있는 bound 레지스터가 있을 때,
- physical address = virtual address + base register value 로 physical memory에서의 주소를 구하고,
- 0 <= virtual address < bound register value 를 통해 검증한다.
이러한 방식을 base-and-bounds approach라고 하고, 이를 위해 OS가 취해야하는 행동은 다음과 같다.
- 프로세스가 실행되기 시작하면 address space를 위한 공간을 physical memory에서 찾아야한다. (base, bound를 결정해야함)
- 프로세스가 종료되면 메모리를 해제해줘야한다.
- context switch가 일어나면 base, bound 쌍을 저장해두어야한다. (OS의 프로세스 구조체에 저장)
'운영체제' 카테고리의 다른 글
08. 운영체제 - Memory Virtualization(3) (0) | 2023.01.25 |
---|---|
07. 운영체제 - Memory Virtualization(2) (0) | 2023.01.24 |
05. 운영체제 - CPU Virtualization - Stride scheduling (4) (0) | 2023.01.20 |
04. 운영체제 - CPU Virtualization - MLFQ(3) (0) | 2023.01.20 |
03. 운영체제 - CPU Virtualization (2) (0) | 2023.01.20 |