CS/운영체제

페이지 교체 알고리즘

haong_ 2025. 4. 29. 18:43

기본개념

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

교체 제외 페이지

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

FIFO(First-In First-Out)

  • 메모리에서 가장 오래 있었던 페이지 교체 
  • 큐 이용 
[Page1] → [Page2] → [Page3] → [Page4]
(Front)                        (Rear)
  • 새 페이지가 필요하면 Front(제일 오래된) 페이지 교체

단점

  • 자주 사용하는 페이지도 오래됐으면 교체될 수 있음
  • Belady의 이상현상: 프레임 수를 늘려도 페이지 폴트가 줄지 않고 늘어날 수 있음

LRU(Leat Recently Used)

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

참조시각을 이용한 구현

  • 각 페이지 참조 시 마다 현재 시간 저장
  • 교체 시 가장 오래된 시각을 가진 페이지 교체
Page Table:
Page1: t=5
Page2: t=8
Page3: t=10

가장 오래된 Page1 교체

 

리스트를 이용한 구현

  • 참조될 때마다 리스트 맨 앞에 이동
  • 교체할 때 리스트 끝에 있는 페이지 교체
[Page3] → [Page2] → [Page1]
(최근 사용)               (오래된 사용)

Page1 제거

장점

  • Belady 이상현상 발생하지 않음
  • 최적화에 근접하는 선택 가능

단점

  • 지역성이 맞지 않는 상황도 존재 
  • 막대한 오버헤드:
    • 매 참조 시 마다 리스트 수정/시각 기록 필요
    • 하드웨어 지원 없이 구현하면 매우 비효율적

LFU(Leat Frequently Used)

  • 메모리에서 참조 횟수가 가장 적은 페이지 교체 
  • 참조횟수 이용 
Page Table:
Page1: 5 hits
Page2: 2 hits
Page3: 7 hits

(→ 2 hits인 Page2 교체)

단점

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

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 → 교체 후 적재

클럭 페이지 교체

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

   [Page1(ref=0)]
        ↓
   [Page2(ref=1)]
        ↓
   [Page3(ref=0)]
        ↓
   [Page4(ref=1)]
        ↓
(포인터 회전)

포인터:
- ref=1 → ref=0 만들고 이동
- ref=0 → 교체

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

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

적절한 페이지 집합 크기 관리는 운영체제 성능 최적화에 핵심 

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

  • Denning이 제안한 페이지 폴트 비율 감소 모델
  • 워킹 세트 W(t, Δ)
     = 시각 t에서 직전 Δ시간 동안 참조된 모든 페이지 집합
  • 짧은 시간(Δ시간) 동안 프로세스가 참조한 페이지 집합을 메모리에 항상 올려두자는 아이디어
    • 시간 지역성 때문, 방금 쓴 것을 또 쓸 가능성 높음 

원칙

  • 워킹 세트를 메모리에 유지하는 원칙
  • 워킹 세트 미유지 시 계속 디스크로부터 페이지를 가져오는 상황(=쓰래싱) 발생

문제점

  • Δ시간 동안의 참조 이력을 전부 추적해야 함
  • 엄청난 시간/공간 오버헤드 발생
  • 구현이 너무 복잡해서 현실에서 그대로 적용하기 어렵다

PFF 알고리즘 (Paga Fault Frequency)

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

PFF

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