Memory Virtualization
Memory Virtualization
1. process의 주소 공간을 연속적으로 할당할 때
- base, bound register가 필요
- context switch시, base, bound register도 추가로 바꾸어주어야 함
단점)
2. Segmentation
- code segment, data segment, heap segment, stack segment 등 각각의 영역에 base와 bound가 존재
- 주의) virtual address의 offset을 계산 시, 각 영역의 base address를 빼야함
- 가상 주소의 상위 2비트를 segment를 구분하는데 사용
- 나머지 주소를 offset으로 사용
3. Paging
- 프로그램을 segment로 쪼개어 메모리에 올리는 것이 아닌, 아예 physical memory를 page 단위로 쪼개어 사용하는 방법
- 현재 범용 운영체제는 page의 크기 = 4KB(12bit)으로 사용하고 있음(32bit 운영체제의 경우 page table의 entry는 2^20개..)
- page table은 physical memory에 올라와있어야함
- proc당 page table이 필요하고, 운영체제가 관리해야함
- CR3(=PTBA) 레지스터에 페이지 테이블 시작주소가 담김(privilged level = 0으로만 접근 가능)
- CR3 레지스터의 값을 변경(context switch)하면 자동으로 L1, L2 Cache는 flush됨
Translation Lookaside Buffers(TLB)
- 프로그램을 실행할 때, 항상 va -> pa로 변환해야하기 때문에 page table을 매번 접근해야함
- MMU 안에 빈번히 사용되는 page를 임시로 저장(= Buffer)
- CISC 기반 cpu는 hardware-managed TLB를 사용하고, RISC 기반 cpu는 software-managed TLB를 사용
- context switch 시, TLB table을 전부 flush함
Multi-level Page Table
- page table을 구성하려면 기본적으로 4MB(32bit) or 512GB(64bit)가 필요함
- linear하게 page table을 전부 할당하면 너무 컸기 때문에 page table을 다시 segment를 통해 나누어 사이의 빈 공간을 최소화함
- 그러나 위의 방법은 page table의 크기를 조절하기 힘들기 때문에 여전히 완벽한 해결책은 아니였음
- 따라서 page table을 다시 paging 기법을 통해 크기를 줄임(= multi level page table)
- 상위 page table을 page directory라고 함
32bit, 64bit multi-level page table
Swapping
- 64bit의 경우 0~2^48-1의 가상 주소를 사용함
- physical memory로 256TB가 필요한데,,, 이 만큼 가지고 있는 컴퓨터는 흔치 않음
- 따라서, HDD/SSD과 같은 하드 디스크를 이용해서 메모리 크기 부족을 커버함
- swap시, 내려간 page는 proc의 page table entry에 체크해줘야 함
- 메모리에 page가 존재하지 않을 때, page fault 발생(malloc의 경우, on-demand paging 기법을 사용하기 때문에 page entry는 존재하지만 memory에는 page가 아직 존재하지 않음)
- page fault 인터럽트 핸들러를 통해 swap, page를 생성하는 등의 작업을 수행할 수 있음