핵심 인사이트 (3줄 요약)
- 본질: NUR (Not Used Recently)은 최근 사용 여부와 쓰기 비용을 함께 보아, "당장 버려도 덜 아픈 페이지"를 고르는 페이지 교체 판단 규칙이다.
- 가치: LRU (Least Recently Used)처럼 모든 접근 순서를 추적하지 않고도, 참조 비트와 수정 비트라는 작은 단서만으로 실용적인 교체 우선순위를 만든다.
- 판단 포인트: 핵심은 가장 오래된 페이지를 찾는 것이 아니라, 운영체제 (Operating System)가 하드웨어 비트를 주기적으로 초기화해 "최근"의 기준을 제대로 유지하느냐에 있다.
Ⅰ. 개요 및 필요성
NUR (Not Used Recently)은 페이지마다 붙어 있는 참조 비트 (Reference Bit)와 수정 비트 (Modified Bit)를 이용해 교체 대상을 등급별로 고르는 알고리즘이다. 가상 메모리에서 정말 어려운 문제는 "무엇이 가장 오래전에 쓰였는가"를 완벽히 아는 것이 아니라, 지금 빼도 성능과 디스크 비용이 가장 덜 흔들리는 페이지가 무엇인가를 빠르게 판단하는 일이다. 이 지점에서 NUR은 LRU처럼 정밀한 기록 대신, 최근성의 흔적과 쓰기 비용의 흔적만 남긴다.
이 방식이 필요한 이유는 두 가지다. 첫째, 모든 페이지의 정확한 접근 순서를 추적하면 메모리 접근 자체보다 관리 오버헤드가 커질 수 있다. 둘째, 페이지를 내보낼 때 수정된 페이지는 보조기억장치에 다시 써야 하므로, 같은 "안 쓰이는 페이지"라도 비용이 다르다. NUR은 이 두 문제를 동시에 다루면서, 운영체제와 메모리 관리 장치가 협력하는 현실적인 절충안을 제시한다.
이 그림은 NUR이 왜 "최근성"과 "쓰기 비용"을 함께 보게 되었는지를 보여준다.
┌────────────────────────────────────────────────────────────────────────────┐
│ NUR이 해결하려는 두 가지 낭비 │
├───────────────────────┬────────────────────────────────────────────────────┤
│ 기록 오버헤드 낭비 │ 디스크 쓰기 낭비 │
├───────────────────────┼────────────────────────────────────────────────────┤
│ 모든 접근 순서 추적 │ 수정된 페이지를 내보내면 │
│ → 구현 복잡도 증가 │ 디스크 기록(Input/Output) 추가 발생 │
│ → 메타데이터 증가 │ → 지연시간 증가 │
├───────────────────────┴────────────────────────────────────────────────────┤
│ NUR의 답: 최근 사용 흔적(R) + 수정 여부(M)만 보고 │
│ "덜 중요하고, 덜 비싼 페이지"부터 교체 │
└────────────────────────────────────────────────────────────────────────────┘
NUR은 그래서 "정확한 과거 복원"보다 "빠른 현재 판단"에 초점을 둔다. 페이지 교체는 매번 벌어질 수 있는 운영체제의 일상 업무이기 때문에, 완벽한 알고리즘보다 지속 가능한 알고리즘이 더 중요하다.
- 📢 섹션 요약 비유: 이사할 때 상자를 버린다고 해보자. 최근에 안 열어본 상자부터 보되, 다시 정리해서 가져가야 하는 상자보다 그냥 버려도 되는 상자를 먼저 치우는 방식이 바로 NUR이다.
Ⅱ. 아키텍처 및 핵심 원리
NUR의 동작은 단순하지만, 그 단순함은 하드웨어 지원 위에 서 있다. MMU (Memory Management Unit)는 어떤 페이지가 읽히거나 쓰일 때 참조 비트를 1로 세팅한다. 여기에 쓰기까지 발생하면 수정 비트도 1이 된다. 운영체제는 일정 주기마다 참조 비트를 0으로 초기화해, "최근"이라는 기준이 영원히 누적되지 않도록 만든다.
핵심 원리는 페이지를 네 등급으로 나누는 것이다. R=0, M=0이면 최근에 쓰이지 않았고 디스크에 다시 쓸 필요도 없으므로 최우선 희생자다. R=0, M=1은 최근에는 안 쓰였지만 더티 페이지 (Dirty Page)라서 내보낼 때 쓰기 비용이 든다. R=1인 페이지들은 최근에 다시 참조된 흔적이 있으므로 한 단계 보호된다.
| 등급 | 비트 상태 | 의미 | 교체 우선순위 |
|---|---|---|---|
| Class 0 | R=0, M=0 | 최근 미사용 + 수정 없음 | 가장 먼저 교체 |
| Class 1 | R=0, M=1 | 최근 미사용 + 수정 있음 | 다음 후보 |
| Class 2 | R=1, M=0 | 최근 사용 + 수정 없음 | 가급적 유지 |
| Class 3 | R=1, M=1 | 최근 사용 + 수정 있음 | 가장 늦게 교체 |
이 그림은 비트가 세팅되고 다시 초기화되면서 NUR의 "최근성 창"이 만들어지는 과정을 보여준다.
┌────────────────────────────────────────────────────────────────────────────┐
│ NUR의 비트 수명 주기 │
├────────────────────────────────────────────────────────────────────────────┤
│ CPU read/write │
│ │ │
│ ▼ │
│ MMU가 해당 페이지의 R=1 설정 │
│ │ │
│ ├─ write 발생 ───────────────────────────────▶ M=1 유지 │
│ │ │
│ ▼ │
│ OS가 주기적으로 R 비트 전체 초기화 │
│ │ │
│ ▼ │
│ 다음 주기까지 다시 참조되지 않으면 │
│ "최근에 사용되지 않음"으로 분류 │
└────────────────────────────────────────────────────────────────────────────┘
여기서 중요한 트레이드오프는 리셋 주기다. 너무 짧으면 방금 잠깐 안 쓴 페이지까지 모두 오래된 것처럼 보여 거친 교체가 일어난다. 반대로 너무 길면 거의 모든 페이지가 R=1 상태에 머물러 분별력이 떨어진다. 따라서 NUR의 품질은 알고리즘 자체보다도 비트 관찰 창을 얼마나 현실적으로 잡느냐에 달려 있다.
- 📢 섹션 요약 비유: 출석부에 이름을 적는 방식과 같다. 최근에 교실에 들어온 학생은 출석 표시가 남고, 선생님이 일정 시간이 지나면 표시를 지워 다시 확인한다. 그래야 정말 한동안 안 온 학생을 골라낼 수 있다.
Ⅲ. 비교 및 연결
NUR을 제대로 이해하려면 FIFO (First-In, First-Out), LRU, 그리고 클럭 알고리즘 (Clock Algorithm)과의 경계를 함께 봐야 한다. FIFO는 가장 먼저 들어온 페이지를 내보내므로 구현은 쉽지만 지역성 (Locality)을 거의 반영하지 못한다. LRU는 가장 최근 사용 이력을 정밀하게 추적해 이상적이지만, 정확한 순위 유지 비용이 크다. NUR은 그 중간에서 "정확한 순위" 대신 "최근 사용 여부"만 본다.
| 항목 | FIFO | NUR | LRU |
|---|---|---|---|
| 판단 기준 | 적재 순서 | 최근 사용 여부 + 수정 여부 | 최근 사용 순위 |
| 구현 비용 | 매우 낮음 | 낮음 | 높음 |
| 지역성 반영 | 약함 | 중간 | 강함 |
| 쓰기 비용 고려 | 거의 없음 | 있음 | 구현에 따라 다름 |
NUR은 또한 개선된 클럭 알고리즘의 이론적 분류 체계와 맞닿아 있다. 클럭 알고리즘은 원형 포인터를 돌며 참조 비트를 깎아 가는 구현 전략이고, NUR은 그 안에서 페이지를 어떤 등급으로 보아야 하는지 설명하는 판단 틀이다. 즉 하나는 분류 철학, 다른 하나는 순회 메커니즘에 가깝다.
운영체제 관점에서는 페이지 폴트 (Page Fault)가 잦아질수록 교체 정책의 실용성이 중요해진다. 데이터베이스 버퍼, 파일 캐시, 스왑 관리 모두 "최근에 덜 쓰였는가"와 "내보낼 때 추가 비용이 큰가"를 동시에 본다. 그래서 NUR은 단순한 교과서 알고리즘이 아니라, 현대 시스템의 캐시 철학을 이해하는 출발점이 된다.
- 📢 섹션 요약 비유: FIFO는 줄 선 순서만 보고 입장을 끊는 안내원이고, LRU는 손님 한 명 한 명의 최근 방문 시간을 다 외우는 관리자다. NUR은 "최근에 안 왔고 정리 비용도 적은 손님부터 먼저 정리하자"는 실무형 매니저에 가깝다.
Ⅳ. 실무 적용 및 기술사 판단
실무에서 NUR 계열 정책은 순수 이론 그대로보다, 클럭 계열 구현이나 활성/비활성 리스트 정책으로 변형되어 등장한다. 그러나 판단 기준은 여전히 같다. 최근에 접근되지 않았고, 내보낼 때 기록 비용이 적은 페이지부터 회수한다는 원칙이다. 예를 들어 파일 캐시에서는 다시 읽어 오기 쉬운 클린 페이지를 먼저 회수하고, 데이터 수정이 반영되지 않은 더티 페이지는 쓰기 백로그와 함께 관리한다.
기술사 관점에서 중요한 판단은 다음 세 가지다.
- 하드웨어 비트 지원 여부: 참조 비트와 수정 비트를 하드웨어가 제공하지 않으면 NUR의 비용 장점이 크게 약해진다.
- 리셋 주기 설계: 워크로드가 짧은 버스트형인지, 긴 스트리밍형인지에 따라 "최근"의 폭을 다르게 봐야 한다.
- 스래싱 징후와의 연결: NUR이 잘 작동해도 물리 메모리 자체가 부족하면 결국 페이지 폴트 폭증을 막을 수 없다.
체크리스트
- 수정 비트가 1인 페이지 비율이 지나치게 높아 쓰기 병목을 만들고 있지 않은가?
- 참조 비트 초기화 주기가 실제 업무 패턴보다 너무 짧거나 길지 않은가?
- 단순 교체 정책 문제인지, 워킹 셋 (Working Set) 자체가 물리 메모리를 초과한 상황인지 구분했는가?
안티패턴
-
"최근"의 기준 없이 참조 비트를 거의 초기화하지 않는 설정
-
더티 페이지 비중이 높아졌는데도 클린/더티 비용 차이를 무시하는 분석
-
교체 알고리즘만 바꾸면 스래싱이 사라질 것이라고 오판하는 설계
-
📢 섹션 요약 비유: 냉장고 정리를 할 때 날짜표를 한 번도 갱신하지 않으면 오래된 음식이 무엇인지 알 수 없다. 반대로 매시간 전부 떼어버리면 방금 넣은 음식도 헷갈린다. 정리 주기를 맞추는 감각이 실무의 핵심이다.
Ⅴ. 기대효과 및 결론
NUR의 가장 큰 효과는 적은 정보로도 충분히 그럴듯한 교체 결정을 내릴 수 있다는 점이다. 하드웨어가 남긴 두 개의 흔적만 읽으면 되므로 관리 비용이 낮고, 수정되지 않은 페이지를 우선 회수함으로써 디스크 쓰기 부담도 줄일 수 있다. 결국 시스템은 "정확도 100점" 대신 "비용 대비 효율이 높은 80~90점짜리 판단"을 반복해 전체 성능을 안정화한다.
물론 한계도 분명하다. NUR은 정확한 순위를 모르는 근사 알고리즘이므로, 특정 시점에는 정말 중요한 페이지를 놓칠 수 있다. 또한 최근성 창이 워크로드 특성과 맞지 않으면 분류 품질이 급격히 떨어진다. 따라서 이 알고리즘은 만능 해법이 아니라, 하드웨어 지원·리셋 주기·메모리 압박 수준이 함께 맞아야 빛나는 절충안으로 기억해야 한다.
미래 방향은 더 정교한 예측 모델로 가더라도, 기본 철학은 유지된다. 즉 메모리 관리의 본질은 "모든 과거를 완벽히 기억하는 것"이 아니라, 지금 버려도 될 가능성이 높고 비용이 낮은 대상을 빠르게 고르는 것이다. NUR은 그 철학을 가장 압축적으로 보여주는 출발점이다.
- 📢 섹션 요약 비유: 훌륭한 집 정리는 모든 물건의 사용 이력을 엑셀로 적는 일이 아니다. 최근에 안 썼고 다시 꺼내는 비용도 적은 물건부터 치우는 감각을 갖는 일이다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
|---|---|
| 참조 비트 (Reference Bit) | 페이지가 최근에 접근되었는지 판단하는 최소 단서 |
| 수정 비트 (Modified Bit) | 페이지를 내보낼 때 쓰기 비용이 발생하는지 알려 주는 단서 |
| 클럭 알고리즘 (Clock Algorithm) | NUR 철학을 순환 포인터 방식으로 구현하는 대표적 실용 알고리즘 |
| 워킹 셋 (Working Set) | 어떤 페이지를 남겨야 하는지의 상위 관점으로, NUR의 교체 판단과 함께 메모리 압박을 해석 |
| 스래싱 (Thrashing) | 교체 정책이 아무리 좋아도 물리 메모리 부족이 심하면 발생하는 성능 붕괴 현상 |
📈 관련 키워드 및 발전 흐름도
페이지 교체 필요
│
▼
FIFO (First-In, First-Out)의 단순성 한계
│
▼
LRU (Least Recently Used)의 정확성 추구
│
▼
NUR (Not Used Recently)
│ ├─ 참조 비트 (Reference Bit)
│ └─ 수정 비트 (Modified Bit)
▼
클럭 알고리즘 (Clock Algorithm) · Enhanced Clock
│
▼
워킹 셋 (Working Set) · 스래싱 (Thrashing) 제어
이 흐름은 "순서 기반 교체 → 최근성 추구 → 근사화 → 시스템 수준 제어"로 확장되는 가상 메모리 사고방식을 보여준다.
👶 어린이를 위한 3줄 비유 설명
- NUR은 장난감 상자에서 무엇을 먼저 치울지 고를 때, "최근에 가지고 놀았니?"와 "다시 손봐야 하니?" 두 가지만 묻는 방법이에요.
- 한동안 안 가지고 놀았고 그대로 치워도 되는 장난감은 먼저 넣고, 방금 놀았거나 고쳐야 하는 장난감은 조금 더 남겨 둬요.
- 그래서 모든 장난감 기록을 다 쓰지 않아도, 빠르게 방을 정리할 수 있답니다.