Search

[운영체제] 페이지 교체 알고리즘

제목
Tag
작성일

페이지 교체 알고리즘

기본개념

페이징 기법에서는 모든 페이지 프레임이 사용 중일 때 새로운 페이지를 적재하기 위해 교체 대상을 선택해야 함
목표:
앞으로 가장 오래 사용하지 않을 페이지를 교체하는 것 (이론적 최적)
현실적으로 미래를 예측할 수 없기 때문에 좋은 근사 방법을 선택해야 함

교체 제외 페이지

페이징을 위한 커널 코드 영역
보조기억장치 드라이버 영역
시간을 맞춰 동작해야 하는 코드 영역
입출력장치를 위한 데이터 버퍼 영역 등

FIFO(First-In First-Out)

메모리에서 가장 오래 있었던 페이지 교체
큐 이용
[Page1] → [Page2] → [Page3] → [Page4] (Front) (Rear)
Plain Text
복사
새 페이지가 필요하면 Front(제일 오래된) 페이지 교체
단점
자주 사용하는 페이지도 오래됐으면 교체될 수 있음
Belady의 이상현상: 프레임 수를 늘려도 페이지 폴트가 줄지 않고 늘어날 수 있음

LRU(Leat Recently Used)

메모리에서 가장 오랫동안 사용되지 않은 페이지 교체
Locality(지역성) 휴리스틱에 기반함
참조시각 또는 리스트 이용

참조시각을 이용한 구현

각 페이지 참조 시 마다 현재 시간 저장
교체 시 가장 오래된 시각을 가진 페이지 교체

리스트를 이용한 구현

참조될 때마다 리스트 맨 앞에 이동
교체할 때 리스트 끝에 있는 페이지 교체
장점
Belady 이상현상 발생하지 않음
최적화에 근접하는 선택 가능
단점
지역성이 맞지 않는 상황도 존재
막대한 오버헤드:
매 참조 시 마다 리스트 수정/시각 기록 필요
하드웨어 지원 없이 구현하면 매우 비효율적

LFU(Leat Frequently Used)

메모리에서 참조 횟수가 가장 적은 페이지 교체
참조횟수 이용
단점
최근에 들어온 페이지가 참조 횟수가 적어 바로 교체될 수 있음
예전에 많이 참조됐지만 지금은 거의 안 쓰는 페이지가 오래 살아남음
막대한 오버헤드: 참조 횟수 관리 부담

2차 기회 페이지 교체

참조 비트가 0이면서 메모리에 가장 오래 있었던 페이지 교체
FIFO 큐와 참조 비트 이용
참조 비트로 최근 참조 여부 체크
각 페이지가 메모리에 적재될 때는 참조 비트 0
적재된 상태에서 추가로 참조되면 참조 비트 1

1. 참조할 페이지가 메모리에 없는 경우

빈 페이지 프레임이 있으면
페이지 적재
큐에 추가
참조 비트 0
빈 페이지 프레임이 없으면
큐의 Front page 꺼내 참조 비트 확인
참조 비트 1이면
참조 비트를 0으로 리셋
페이지를 큐 뒤로 이동
다시 다음 Front 페이지를 검사
참조 비트 0이면
해당 페이지를 교체
새 페이지를 적재하고 큐 뒤에 추가
참조 비트 0 설정

2. 참조할 페이지가 메모리에 있는 경우

큐 위치 변화 없이 참조 비트만 1로 설정
[Page 요청 발생] ↓ [메모리에 있는가?] ↓ [YES] [NO] 참조 비트 = 1 ↓ (큐 변화 없음) 빈 프레임 있는가? ↓ [YES] [NO] 새 페이지 적재 큐 Front 검사 참조 비트 = 0 참조비트 1 → 0으로 변경 후 뒤로 참조비트 0 → 교체 후 적재
Plain Text
복사

클럭 페이지 교체

원형 큐 + 포인터 이용 (시계바늘처럼 동작)
포인터는 마지막에 추가된 페이지의 다음 위치를 가리킴
새 페이지 필요 시:
포인터가 가리키는 페이지의 참조 비트 확인
참조 비트 0이면 → 교체
참조 비트 1이면 → 0으로 리셋하고 포인터 이동
빈 페이지가 있으면 그냥 삽입

프로세스별 페이지 집합 관리

운영체제에서 각 프로세스는 실행되기 위해 일정량의 메모리 페이지를 필요로 함
프로세스마다 일정 개수의 페이지 프레임을 메모리에 유지되는 페이지 집합
페이지 집합 크기 작을수록 시스템 처리량 증가, 페이지 폴트 증가
페이지 집합 크기 클수록 페이지 폴트 감소, 실행 가능한 프로세스 수 감소
적절한 페이지 집합 크기 관리는 운영체제 성능 최적화에 핵심

워킹세트(Working set) 알고리즘

Denning이 제안한 페이지 폴트 비율 감소 모델
워킹 세트 W(t, Δ) = 시각 t에서 직전 Δ시간 동안 참조된 모든 페이지 집합
짧은 시간(Δ시간) 동안 프로세스가 참조한 페이지 집합을 메모리에 항상 올려두자는 아이디어
시간 지역성 때문, 방금 쓴 것을 또 쓸 가능성 높음
원칙
워킹 세트를 메모리에 유지하는 원칙
워킹 세트 미유지 시 계속 디스크로부터 페이지를 가져오는 상황(=쓰래싱) 발생
문제점
Δ시간 동안의 참조 이력을 전부 추적해야 함
엄청난 시간/공간 오버헤드 발생
구현이 너무 복잡해서 현실에서 그대로 적용하기 어렵다

PFF 알고리즘 (Paga Fault Frequency)

페이지 폴트 빈도를 이용해 프로세스별 페이지 집합 크기를 변화시키는 기법
워킹 세트를 직접 계산하지 않고 PFF를 이용해 워킹 세트 크기를 추정해서 관리

PFF

얼마나 자주 페이지 교체가 발생하는지 나타내는 척도
페이지 폴트 발생 직후 부터 다음 페이지 폴트 발생할때까지 시간을 T 로 뒀을때 이의 역수(1/T)
T가 작으면 (폴트 금방 발생) → PFF 값이 커짐, 메모리 부족하다는 뜻
T가 크면(폴트 없이 오래 실행) → PFF 값이 작아짐, 여유롭게 실행되고 있다는 뜻
상한과 하한 기준 설정
PFF > 상한 (잦은 페이지 폴트) → 페이지 프레임 1개 추가
PFF < 하한 (페이지 폴트가 너무 적음) → 참조되지 않은 페이지 제거
PFF 알고리즘을 통해 동적으로 페이지 집합 크기를 조정하여, 시스템 메모리 사용을 최적화하고 쓰래싱을 방지함