*이 글은 Operating Systems: Three Easy Pieces(운영체제 아주 쉬운 세 가지 이야기)를 바탕으로 작성되었습니다. 첨부한 모든 그림은 해당 도서에서 가져온 자료입니다. 내용 중 잘못된 부분이 있다면 알려주세요 :)
지난 번 글에서 메모리 가상화의 시작을 다루어보았다.
이번 시간엔 virtual address와 physical address를 어떻게 매핑해주는지 자세히 알아보자!
🧐 현대 운영체제의 목표
효율성(efficiency) & 제어 (control)
효율성을 높이기 위해 하드웨어 활용이 필수적이다.
제어는 자기 메모리 이외의 다른 메모리에 접근하기 못하도록 OS가 보장하는 것이다.
가상화를 제공하는 동시에 효율성과 제어를 추구한다면
- 어떻게 효율적인 메모리 가상화를 구축할 수 있을까?
- 프로그램이 필요로 하는 유연성을 어떻게 제공하는가?
- 프로그램이 접근할 수 있는 메모리의 위치에 대한 제어를 어떻게 유지하는가?
- 메모리 접근을 어떻게 적절히 제한할 수 있는가?
- 어떻게 이 모든 것을 효율적으로 할 수 있는가?
위와 같은 질문들을 해볼 수 있다.
🧐 Address translation
주소변환(Address translation)을 통해
- 하드웨어는 명령어 반입, 탑재, 저장 등의 가상 주소를 정보가 실제 존재하는 물리 주소로 변환한다.
- OS는 메모리의 빈 공간과 사용 중인 공간을 항상 알고 있어야 하고, 메모리 사용을 제어하고 관리한다.
주소 공간에 대해 몇 가지 가정을 하고 여러 경우들을 생각해보자
- 주소 공간이 물리 메모리에 연속적으로 배치되어야 한다.
- 주소 공간의 크기가 물리 메모리 크기보다 작다.
- 각 주소 공간의 크기가 같다.
간단한 코드부터 살펴보자
C언어 코드는 간단하다.
- 메모리에 값을 load하고, 3을 더하고, 다시 메모리에 저장한다.
어셈블리 코드도 비교적 간단하다.
- 128: 0+ebx를 eax에 저장한다.
- 132: eax 레지스터에 3을 더한다.
- 135: eax를 메모리에 다시 저장한다.
이때 메모리 상에서는 어떤 일이 일어날까?
- 주소 128의 명령어 반입
- 이 명령어 실행 -> 주소 15KB에 값 load
- 주소 132의 명령어 반입
- 이 명령어 실행 -> 메모리 참조 없음
- 주소 135의 명령어 반입
- 이 명령어 실행 -> 15KB에 저장
위 그림은 주소 0에서 16KB까지의 가상화된 메모리이다.
🧐 Static Relocation
Software-based relocation으로
고정된 데이터와 함수들의 주소를 바꾸고 rewrite한다.
하드웨어 지원없이 가능하다는 장점이 있지만,
다른 프로세스의 메모리에 접근이 가능하며, rewrite이후 메모리 공간 이동이 불가능하다는 단점이 있다.
🧐 Dynamic Relocation
Hardward-based relocation으로
- MMU(Memory Management Unit)가 모든 메모리 참조 시 주소 변환 수행한다.
- Protection은 하드웨어에 의해 지켜진다. (가상 주소가 invalid하면, MMU는 exception 발생)
- OS는 현재 프로세스의 valid한 주소 공간에 대한 정보만 MMU에게 보낸다.
base는 address space의 physical 시작 위치이다.
위 그림에서 32KB이다.
bound는 address space의 크기이다.
(아키텍처에 따라 address space의 physical 끝 위치인 경우도 있지만, 전자의 경우로 가정하고 사용하겠음 )
위 그림에서 16KB이다.
base, bound를 사용하여 원하는 위치에 주소 공간을 배치할 수 있게 한다. 또한, 자신의 주소 공간에만 접근할 수 있게 한다.
프로그램 시작 시, OS가 프로그램의 물리 메모리 위치를 결정하고, 베이스 레지스터를 주소로 지정한다.
프로세스가 실행 시, 하드웨어는 프로세스에 의해 생성되는 모든 주소를 아래와 같은 방법으로 변환한다.
physical address = virtual address + base
프로세스가 생성하는 메모리 참조는 가상 주소이다.
모든 virtual address는
0 <= virtual address < bound
앞에서 봤던 어셈블리 코드를 다시 살펴보자.
`128: movl 0x0(%EBX), %eax`
- PC(프로그램 카운터)는 128로 설정한다.
- PC 값을 base와 더해 물리 주소 얻는다.
128 (PC) + 32KB (base) = 32896 (physical address) - 하드웨어가 해당 물리 주소에서 명령어 가져오고 실행한다.
- 프로세스는 가상 주소 15KB의 값의 값을 탑재하는 명령어 내린다.
- 물리 주소에 원하는 내용 탑재한다.
15KB + 32KB = 47KB
🧐 운영체제 이슈
base, bound 방식으로 가상 메모리 구현을 위하여 OS가 개입되는 3가지 시점이 있다.
- When a Process Starts Running
프로세스가 생성될 때, OS는 주소 공간이 저장될 메모리 공간 찾는다.- OS는 물리 메모리를 슬롯의 배열로 생각하여, 각 슬롯의 사용여부를 관리한다.
- 새로운 프로세스 생성될 때, 새로운 주소 공간 할당에 필요한 영역 찾기 위해 자료 구조 검색한다.
- When a Process Is Terminated
프로세스가 종료될 때, OS는 종료한 프로세스의 메모리를 다시 빈 공간 리스트에 넣고 연관된 자료 구조를 모두 정리한다.
-
- 자료구조는 process structure / PCB(Process Control Block)
When Context Switch Occurs
context switch 시, OS는 base, bound를 저장, 복원한다.
- 자료구조는 process structure / PCB(Process Control Block)
dynamic allocation은 static allocation의 protection 문제를 해결하지만,
할당된 영역이 낭비될 수 있다.
예를 들어, 위에서 본 그림을 다시 살펴보자
32KB와 48KB의 물리 메모리 중 프로세스의 heap, stack의 영역이 크지 않아 사이 공간이 낭비되고 있다.
이 낭비를 내부 단편화 (internal fragmentation)라고 한다.
물리 메모리의 이용률을 높이고 내부 단편화 방지를 위해 더 좋은 방법이 필요하다!!!
이 때문에 등장한 것이 segmentation인데, 이는 다음 글에서 설명하도록 하겠다.
↯ 다음글 ↯
'기본 > 운영체제' 카테고리의 다른 글
[OS] CPU 가상화 (CPU Virtualization): 1. 프로세스란 (1) | 2024.04.20 |
---|---|
[OS] 메모리 가상화(Memory Virtualization): 5. Paging: 개요 (1) | 2024.04.20 |
[OS] 메모리 가상화(Memory Virtualization): 4. Free-Space Management (0) | 2024.04.19 |
[OS] 메모리 가상화 (Memory Virtualization): 3. Segmentation (1) | 2024.04.12 |
[OS] 메모리 가상화 (Memory Virtualization): 1. 메모리 가상화의 시작 (2) | 2024.04.09 |