페이지 폴트를 이해하는 게 중요할까?

Robo·2025년 3월 12일
0

공부

목록 보기
3/3
post-thumbnail

시작하기 전에

학원에서 배웠던 주제 중 곰곰히 생각하다가 페이지 폴트를 중요하게 여기셨던 게 기억이 났다. 원장님은 페이지 폴트를 잘 이해하는 학생을 눈 여겨 보셨다. 그 때 당시 배운 건 페이지 폴트에 비해 비교적 개요는 간단한 페이징 기법, 내외부 단편화 만 개념적으로 알면 되는 게 아닌가 싶었다. 하지만 페이지 폴트가 일어나는 전체 과정을 알면 좋겠다고 생각하셨고 이걸 왜 그렇게 중요하게 여기셨을까? 기억을 훑어가며 글을 정리하였다.

이건 이론적인 내용만이 아니고 실제로 우리 컴퓨터에서 끄고 올릴 수 있는 기능이다.

win10 운영체제 사진인데 시스템 속성 > 성능 옵션 > 가상 메모리 항목에서 확인 가능하다.

페이지 폴트는 운영체제가 메모리를 관리하는 핵심 원리이며, 이를 제대로 이해하면 실제 개발에서 성능 최적화와 문제 해결 능력을 크게 향상시킬 수 있다. 물론, 이 문제 해결 능력은 페이지 폴트만을 이해하는 게 아니라 캐시, 자료구조 등을 자세히 알면 자연스레 연결이 되는 내용이다.

페이지 폴트란?

개념, 정의

컴퓨팅에서 페이지 폴트(page fault)는 프로세스가 메모리에서 찾을 수 없는 페이지를 접근할 때 발생하는 예외(exception)이다.
예외가 일어났을 때, 운영체제(OS)는 해당 페이지를 디스크에서 로드하거나 예외를 처리하는 역할을 한다. MMU(Memory Management Unit)가 페이지 폴트를 감지하면, 커널이 이를 처리하여 필요한 메모리 페이지를 로드하거나, 불법적인 접근을 차단한다.

출처 : Page Fault - wikipedia

개념, 정의부터 어려운 말로 도배되어있다. 머리가 아파지기 전에 하나하나씩 짚고 넘어가자.

우선, 이 개념을 정확히 이해하기 위해선 가상 메모리 라는 개념이 확실해야한다.

가상 메모리

운영체제는 가상 메모리(Virtual Memory)를 사용하여, 물리적 메모리(RAM)의 크기보다 더 많은 프로그램을 실행할 수 있도록 한다. 하지만 가상 메모리는 물리 메모리에 비해 실제로 모든 데이터가 로드되지 않은 상태에서 프로그램을 실행할 수 있도록 설계되어 있다.

이 설명으로 가상 메모리가 왜 필요한지 이해가 되지 않는다면 단순한 예제를 보자.

💡 예제: 대용량 게임 실행 시

  • 우리가 170GB짜리 발더스게이트3 라는 게임을 실행한다고 가정하자.
  • 하지만 사용 가능한 물리적 메모리(RAM)16GB밖에 되지 않는다고 생각하자. 보통 열성적인 게이머들도 32GB를 잘 넘지 않는다.
  • 이때, 운영체제는 처음부터 170GB 전체를 메모리에 로드하지 않고, 플레이어가 탐험하는 지역의 데이터만 필요할 때 불러온다.
  • 플레이어가 새로운 지역으로 이동하면, 운영체제는 이전 지역의 데이터를 디스크로 내리고, 새로운 지역의 데이터를 불러온다.
  • 이 과정에서 페이지 폴트가 발생하며, 운영체제가 필요한 데이터를 디스크에서 로드하는 것이다.

여기서 페이지 폴트는 가상 메모리를 효과적으로 활용하는 핵심적인 기법이다. 왜냐하면, 필요할 때만 데이터를 메모리에 로드하여 메모리 사용량을 줄이고, 시스템이 더 많은 프로그램을 동시에 실행할 수 있도록 하기 때문이다.

페이지 폴트가 발생하는 과정

페이지 폴트가 발생하는 전체 흐름을 정리하면 다음과 같다.

  • 프로세스가 메모리 접근 시도
    CPU는 프로세스의 가상 주소를 참조하여 데이터 로드를 시도
    가상 주소는 물리적 주소로 변환되어야 함
    변환 과정에서 TLB(Translation Lookaside Buffer)페이지 테이블(Page Table)을 조회

  • 해당 페이지가 존재하지 않음 (페이지 폴트 발생!)
    페이지 테이블을 확인했지만, 해당 페이지가 메모리에 없음
    MMU가 페이지 폴트 예외(Page Fault Exception)를 발생시킴

  • 운영체제가 페이지 폴트를 처리
    운영체제의 커널이 개입하여 필요한 페이지를 찾음
    디스크에서 해당 페이지를 읽어와 메모리에 로드
    (만약 할당할 메모리가 부족하면 페이지 교체 알고리즘을 사용하여 기존 페이지를 제거)

  • 페이지가 메모리에 로드됨
    메모리에 데이터가 로드된 후 페이지 테이블을 업데이트
    프로세스가 다시 실행되며 정상적으로 데이터에 접근 가능

이게 기본적인 내용이다. 하지만, 학원에선 저기에 더해 똘똘하게 더 알기 원하셨던 기억이 있다. 이는 단편적으로만 적어놓겠으니 관심이 있다면 좀 더 알아보아도 좋다.

  • 페이지 폴트 예외는 소프트웨어 예외가 아닌 하드웨어 예외로 처리된다. 이로 인해 발생하는 치명적인 문제가 있다. 이는 인터럽트에 관한 내용과 연계된다.
  • 운영체제에서 페이지 폴트 시, 페이지 테이블에서 플래그, 가상 주소 등을 이용하여 페이지 교체하는 더 세세한 과정이 존재한다. 이를 통해 캐시와 관련 있는 PTE(Page Table Entry) 를 사용한다.

페이지 폴트가 성능에 미치는 영향

페이지 폴트는 운영체제가 메모리를 효율적으로 관리하는 데 유용하지만, 잦은 페이지 폴트는 오히려 시스템 성능을 심각하게 저하시킬 수 있다.

그래서 보통 페이징 파일 옵션을 아예 꺼도 좋지만 그러면 시스템이 불안정해질수도 있다. 하지만, 어떤 이유에서 시스템 성능 저하가 일어나는지 알고 넘어가자.

  • 디스크 I/O 비용 증가
    페이지 폴트가 발생하면, 운영체제는 디스크에서 데이터를 읽어와야 한다.
    하지만 디스크 I/O 속도는 메모리에 비해 수천 배 느리다.
    따라서 페이지 폴트가 자주 발생하면 시스템의 반응 속도가 급격히 저하될 수 있다.

  • 캐시 미스(Cache Miss) 문제
    페이지 폴트로 인해 새로운 페이지가 로드되면,
    기존에 캐시되어 있던 데이터가 사라질 가능성이 높아짐
    CPU 캐시 및 TLB 캐시의 효율이 떨어지며 성능 저하 발생

  • 스레싱(Thrashing) 발생 가능성
    페이지 폴트가 너무 자주 발생하면,
    CPU는 계속해서 디스크 I/O 작업만 하느라 바쁘다.
    이 상태를 스레싱(Thrashing)이라고 하며, 성능이 심각하게 저하되는 원인이 된다.

페이지 폴트를 줄이는 최적화 방법

  • 지역성(Locality) 활용하기
    시간 지역성(Temporal Locality) → 자주 사용하는 데이터를 메모리에 유지
    공간 지역성(Spatial Locality) → 연속된 데이터를 한 번에 로드

사실 우리 프로그래머가 조절할 수 있는 가장 큰 영역이다. C++ 게임 서버 프로그래머들도 그렇지만 예전 금융권에서 일하신다는 SI 영역 프로그래머분과 이야기를 나눠본적이 있는 주제다.

메모리풀, 오브젝트풀 주제인데 이것도 시간 지역성과 관련있다고 볼 수 있다. 오로지 new-delete 에 대한 시간을 줄이는 게 아닌 썼던 메모리를 계속 쓸 수 있다.

또, Stack, Queue 구조 중 어떤 구조가 메모리 참조를 할 때 반복적으로 유용하게 쓰일 수 있는가에 대해서도 중요한 영역이 되겠다.

  • 효율적인 메모리 할당
    데이터 구조를 최적화하여 불필요한 메모리 접근을 줄이기
    대용량 데이터를 사용할 때는 페이징을 고려한 설계

  • 페이지 교체 알고리즘 선택
    운영체제는 페이지 폴트가 발생했을 때, 기존의 페이지를 어떤 기준으로 교체할지 결정해야 한다.
    대표적인 알고리즘은 다음과 같다.

FIFO (First In First Out) → 가장 먼저 로드된 페이지를 제거
LRU (Least Recently Used) → 가장 오랫동안 사용되지 않은 페이지를 제거
CLOCK 알고리즘 → 사용 빈도를 고려하여 교체

마무리하며

페이지 폴트는 단순히 메모리에서 데이터를 못 찾는 현상이 아니라, 운영체제가 메모리를 관리하는 핵심 원리 중 하나다.

처음에는 "이런 걸 굳이 이렇게까지 깊이 알아야 하나?" 싶었지만, 막상 이렇게 또 보니 재밌는 주제 중 하나다. "페이지 폴트가 발생하는 과정" 의 두 주제인 하드웨어 예외는 블루스크린과 관련이 있다. PTE 또한 분명 캐시와 관련이 많으니 해당 주제도 적을 기회가 있다면 좋겠다.

참조

Operating System Concepts (공룡책) - Abraham Silberschatz, Peter B. Galvin, Greg Gagne
Linux Kernel Documentation - www.kernel.org
Wikipedia - Page Fault

profile
호호선생

4개의 댓글

comment-user-thumbnail
2025년 3월 23일

강의 복습중에 잘 보고 갑니다 감사합니다~!

1개의 답글