Chap 5.
Paging
: 주소 공간을 페이지라는 고정된 크기의 단위로 분할
=> 공간 관리 문제를 해결하기위한 방법, paging, segmentation
- Segmentation
: logical segments( code, stack, heap, etc. )의 가변적인 크기
=> Fragmentation, 시간이 지날수록 할당이 어려워짐
- 페이징을 사용하면 물리적 메모리도 페이지 프레임이라고 하는 몇 개의 페이지로 분할됨
- 가상 주소를 실제 주소로 변환하려면 프로세스별 페이지 테이블이 필요
=> Page (VM) -> Page Table -> Page Frame (PM)
- 프로세스의 물리적 주소 공간이 비연속적일 수 있도록 허용
=>
- 가상 메모리를 동일한 크기(페이지)의 블록으로 나누기
- 물리적 메모리를 고정 크기 블록(프레임)으로 나누기
- 페이지(또는 프레임) 크기는 2의 거듭제곱(일반적으로 512B - 8KB).
- 메모리 관리 용이
=>
- OS가 모든 사용 가능한 프레임을 추적
- N 페이지 크기의 프로그램을 실행하려면 N 개의 여유 프레임을 찾아서 프로그램을 로드해야함
- 가상 주소를 물리 주소로 변환하기 위한 페이지 테이블 설정
- 외부 단편화 없음
Paging의 이점
Flexibility (유연성) : 주소 공간의 효과적인 추상화 지원
- 힙과 스택이 어떻게 변화하고 사용되는지 가정할 필요가 없음
Simplicity (단순성) : 여유 공간 관리가 용이해짐
- 주소 공간의 페이지와 페이지 프레임의 크기가 같음
- free list 할당 및 유지가 쉬움
가상 주소의 두 가지 구성 요소
- VPN: 가상 페이지 번호
=> VPN은 페이지 테이블에 대한 인덱스
- Offset : 페이지 내 오프셋
- 페이지 테이블은 페이지 프레임 번호(PFN)를 결정
- 물리적 주소는 <PFN, Offset >
페이지 테이블( Page tables )
- OS에서 관리
- VPN을 PFN에 매핑
- 가상 주소 공간의 페이지당 하나의 페이지 테이블 항목(PTE, One Page Table Entry )
각 프로세스에 대한 페이지 테이블은 메모리에 저장됨
=> 페이지 테이블은 많이 커질수있음
=> 32bit 주소공간에 4KB 페이지, 20bit VPN이라면
페이지 테이블은 가상 주소를 실제 주소에 매핑하는 데 사용되는 데이터 구조
=> a linear page table, an array
- OS는 VPN을 기준으로 배열을 인덱싱하여 page-table entry을 조회
PTE 비트
- Valid Bit : 특정 변환의 유효 여부를 나타냄
=> 가상 주소가 사용될 때마다 확인
- Protection Bit : 페이지의 읽기, 쓰기 또는 실행 가능 여부를 나타냄
- Present Bit : 이 페이지가 실제 메모리에 있는지 또는 디스크에 있는지( swapped out )를 나타냄
- Dirty Bit : 페이지가 메모리에 들어온 이후 수정되었는지 여부를 나타냄
- 참 Reference Bit(Accessed Bit) : 페이지가 액세스되었음을 나타냄
Paging의 문제
-> 너무 느리다
원하는 PTE의 위치를 찾으려면 페이지 테이블의 시작 페이지 테이블의 위치가 필요하다 -> 모든 메모리 참조에 대해 페이징을 수행, OS가 메모리 참조를 한 번 더 수행해야함
Demand Paging
OS는 메인 메모리를 시스템 내 프로세스에 할당된 모든 데이터의 (페이지) 캐시로 사용
- 필요할 때만 페이지를 메모리로 가져옴
- 페이지는 물리적 메모리 프레임에서 제거( evicted )될 수 있음
- 제거된( evicted ) 페이지는 디스크로 이동합니다( dirty pages 만 기록됨)
- 페이지 이동은 프로세스에 투명하게 공개됨
장점
- 필요한 I/O가 감소함
- 더 적은 메모리를 필요로함
- 더 빠른 응답
- 더 많은 프로세스
Page Fault
유효하지 않은 PTE에 액세스할 때 CPU에서 발생하는 예외
Major page faults
- 페이지가 유효하지만 메모리에 로드되지 않음
- OS가 콘텐츠를 찾을 수 있는 위치에 대한 정보를 유지
- 디스크 I/O 필요
Minor page faults
- 디스크 I/O 없이 페이지 결함 해결 가능
- 지연 할당에 사용(예: 스택 및 힙 페이지에 대한 액세스)
- prefetched 페이지에 대한 액세스 등등
Invalid page faults
- Segmentation violation : the page is not in use
Paging 장점
- 외부 단편화 없음 ( 내부 단편화는 존재 )
- 빠른 할당과 해제
- free page frame에 대한 리스트나 비트맵
=> 할당 : 연속된 여유 공간을 찾을 필요가 없음, 해제 : 접한 여유 공간과 합칠 필요가 없음
- 메모리의 일부를 디스크에 ' page out '하기 쉬움
=>
- 페이지 크기는 디스크 블록 크기의 배수로 선택됨
- valid bit 를 사용하여 " page out " 페이지에 대한 참조를 감지
- 일부 페이지가 디스크에 있을 때 프로세스 실행 가능
- 손쉬운 페이지 보호 및 공유
Paging 단점
- 내부 단편화
=> 페이지가 커질수록 메모리 낭비가 증가함
- 메모리 참조 오버헤드
=> instruction당 메모리 참조 횟수가 두 배로 증가
=> TLB
- 페이지 테이블에는 스토리지가 필요함
=>
가상 주소 공간에서 각 페이지당 하나의 PTE 필요
4KB 페이지 크기의 32비트 주소 공간: 220개의 PTE
4바이트/PTE: 페이지 테이블당 4MB
시스템 내 100개의 프로세스: 총 400MB의 페이지 테이블
해결 방법: 유효한 PTE만 저장하거나 페이지 테이블을 페이지화함
TLB
기존의 문제점
=> 주소 변환이 너무 느림
- 단순한 선형 페이지 테이블은 메모리 비용을 두배로 늘림 (페이지 테이블, 데이터 가져오기)
- 멀티레벨 페이지 테이블은 비용을 더욱 더 증가시킴
==> 목표 : 빠른 주소 변환 (가상 주소에서 가져오는 작업을 실제 주소에서 가져오는 것만큼 효율적으로)
- 칩의 MMU( memory-management unit )의 일부
- 널리 사용되는 virtual-to-physical address translation 의 하드웨어 캐시
TLB Organization
- TLB는 하드웨어에서 구현됨
- 프로세스는 한 번에 소수의 페이지만 사용 (16~256개의 entries가 일반적)
- fully associative
=>
- 모든 항목이 병렬로 조회됨
- 하지만 지연 시간을 줄이기 위해 associative를 설정할 수 있음
==> LRU (Least Recently Used)
- TLB는 실제로 PFN뿐만 아니라 전체 PTE를 캐시함
Locality
Temporal Locality : 최근에 액세스한 명령어 또는 데이터 항목은 조만간 다시 액세스될 가능성이 높음
Spatial Locality : 프로그램이 주소 x에 있는 메모리에 액세스하면 곧 x 근처의 메모리에 액세스
TLB miss 처리
- hardware-managed TLB
- 하드웨어는 CISC에서 TLB 미스를 처리
=> 하드웨어는 메모리에서 페이지 테이블의 위치를 정확히 알고 있어야함. 하드웨어는 페이지 테이블을 하나하나 탐색하며 올바른 페이지 테이블 항목을 찾아 원하는 translation , 업데이트 및 재시도 명령을 추출함
- software-managed TLB (RISC)
- TLB 미스가 발생하면 하드웨어는 예외( trap handler )를 발생시킴
- trap handler 는 TLB 미스를 처리하기 위한 목적으로 작성된 OS 내 코드
=> context switching이 일어났을때 TLB가 섞인다
==> 해결1 : 프로세스별로 구분이 가능한 field 추가 address space identifier(ASID)
==> 해결2 : 페이지를 프로세스끼리 공유, 매핑시 다르게
TLB Replacement Policy
- LRU(최근 사용 횟수)
- 최근에 사용되지 않은 항목을 지움
- 메모리 참조 스트림의 locality 활용
TLB Performance
- TLB는 많은 성능 문제의 원인
- 성능 지표: 적중률, 조회 지연 시간, ...
- TLB 도달 범위 증가(= TLB entries * 페이지 크기)
=>
- 페이지 크기 증가: 예: 인텔 64에서 2MB, 1GB 페이지 지원
- TLB 크기 늘리기
- 다단계 TLB 사용
- 예: 인텔 하스웰(4KB 페이지): L1 ITLB 128개 항목(4방향), L1 DTLB 64개 항목(4방향), L2 STLB 1024개 항목(8방향)
- 알고리즘과 데이터 구조를 TLB 친화적으로 변경
TLB 정리
=> 주소 변환 캐시로 전용 온칩 TLB 사용
- 대부분의 메모리 참조는 메인 메모리의 페이지 테이블에 액세스하지 않고도 처리할 수 있음
- TLB는 로컬리티를 활용하기 때문입니다.
- 시간적 지역성
- 공간적 지역성