운영체제

Chap 5.

앞발로코딩 2023. 10. 22. 17:22

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는 로컬리티를 활용하기 때문입니다.
- 시간적 지역성
- 공간적 지역성