페이지 부재 처리 과정 6단계

핵심 인사이트 (3줄 요약)

  1. 본질: 페이지 부재(Page Fault) 처리 6단계는 CPU(하드웨어)가 램에 없는 데이터를 요구하며 뻗었을 때, OS(소프트웨어) 커널이 깨어나 디스크에서 데이터를 퍼와 램에 꽂아주고, 멈췄던 CPU를 다시 완벽하게 살려내는 숨 막히는 트랜잭션 구출 작전이다.
  2. 가치: 하드웨어 트랩(Trap), 커널 스케줄링(Context Switch), 디스크 DMA I/O, 페이지 테이블 갱신이라는 컴퓨터 공학의 모든 핵심 뼈대 기술이 이 6단계 파이프라인 안에 유기적으로 톱니바퀴처럼 맞물려 돌아간다.
  3. 융합: 이 6단계 과정은 수백만 클럭이 소요되는 어마어마한 지연(Penalty)을 낳지만, OS가 디스크를 기다리는 동안 다른 프로세스에게 CPU 제어권을 넘겨주는 멀티태스킹 마술을 부려 시스템 전체의 CPU 가동률(Utilization)을 극한으로 방어한다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: 가상 메모리 환경에서 CPU가 Invalid (I) 비트가 찍힌 페이지를 밟았을 때(Page Fault 발생), 하드웨어가 멈추고 제어권을 넘겨받은 운영체제가 디스크(Swap)에서 램으로 페이지를 밀어 넣고 프로그램을 다시 원래대로 실행시키기까지의 정형화된 6가지 표준 루틴이다.

  • 필요성: CPU는 빛의 속도로 코드를 실행하는 무지성 폭주 기관차다. 눈앞에 데이터가 없으면 즉시 시스템을 멈추고 블루스크린(Kernel Panic)을 띄우는 게 원래 하드웨어의 본성이다. 하지만 가상 메모리(요구 페이징) 철학을 달성하려면, 이 폭주 기관차를 "안전하게 잠재우고 -> 디스크에서 조용히 선로를 깔아준 뒤 -> 다시 아무 일 없었다는 듯 깨워서 출발"시켜야 한다. 이 과정에서 레지스터 값이 하나라도 꼬이거나 명령어가 두 번 실행되면 프로그램 데이터가 산산조각이 나므로, 한 치의 오차도 없는 철통같은 6단계의 복구 매뉴얼이 필수적이었다.

  • 💡 비유: 페이지 폴트 6단계는 심장 수술 중의 **'인공심폐기(ECMO) 응급 처치 매뉴얼'**과 같다. 수술 중 갑자기 피(데이터)가 부족하면 심장(CPU)은 멈춘다. 이때 의사(OS)가 1. 즉시 기계에 알람(Trap)을 울리고, 2. 환자의 현재 상태를 기록(문맥 백업)한 뒤, 3. 혈액은행(디스크)에 피를 주문한다. 4. 피가 도착할 때까지 다른 환자를 돌보다가(Context Switch), 5. 피가 팩(램)에 도착하면 환자 몸에 연결하고 장부(페이지 테이블)에 기록한 뒤, 6. 심장에 전기 충격을 줘서 다시 심장을 뛰게(명령어 재실행) 만드는 완벽한 생명 연장술이다.

  • 등장 배경 및 난관의 극복:

    1. 트랩의 일상화: 에러일 때만 뜨던 트랩을 데이터 배달 주문용으로 일상화시켜야 했다.
    2. 디스크 병목의 한계: 디스크 I/O는 8ms로 너무 느리다. CPU가 기다리게 놔두면 서버가 얼어붙는다.
    3. Instruction Restart (명령어 재실행) 기술의 완성: 중간에 끊긴 어셈블리 명령어를 마치 처음 실행한 것처럼 상태를 롤백(Roll-back)시키는 하드웨어 지원이 완성되며 6단계 파이프라인이 완성되었다.

Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

교과서적 Page Fault 처리 6단계 해부

OS 교과서에서 30년 넘게 토시 하나 안 틀리고 가르치는 완벽한 6단계 파이프라인 시퀀스다. 외우는 것이 아니라 물 흐르듯 이해해야 한다.

┌────────────────────────────────────────────────────────────────────────────────────────┐
│              가상 메모리를 살려내는 마법의 6단계 스텝                                  │
├────────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                        │
│ [ 전제 ] CPU가 "가상 3번 페이지 데이터 내놔!" 명령어를 때림.                           │
│         MMU가 장부를 보니 'I (Invalid)' 비트다.                                        │
│                                                                                        │
│ 1️⃣ Step 1: 트랩(Trap) 발생과 OS 진입                                                  │
│   - 하드웨어(MMU)가 멱살을 잡고 CPU를 멈춤.                                            │
│   - 제어권이 유저 앱에서 -> OS 커널의 Page Fault Handler로 튕김.                       │
│                                                                                        │
│ 2️⃣ Step 2: 합법성 검사 (Legality Check)                                               │
│   - OS: "이 앱이 허공을 찌른(해킹/버그) 건지, 내 스왑에 있는지 장부(PCB) 보자"         │
│   - 불법(SegFault)이면 여기서 척살! 합법이면 다음 단계로.                              │
│                                                                                        │
│ 3️⃣ Step 3: 빈 프레임(Free Frame) 확보                                                 │
│   - OS가 램(RAM)을 뒤져 비어있는 4KB 상자 하나를 찾아냄.                               │
│   - (만약 램이 꽉 찼다면? 여기서 남의 페이지를 쫓아내는 '페이지 교체' 발생)            │
│                                                                                        │
│ 4️⃣ Step 4: 디스크(HDD/SSD)에서 페이지 읽기 (I/O)                                      │
│   - OS가 디스크 컨트롤러에 "스왑 500번 섹터를 아까 찾은 램 빈방에 복사해!" 명령.       │
│   - ⚠ 주의: 복사에 10ms가 걸리므로 CPU는 기다리지 않고 다른 앱으로 튐(Context Switch)! │
│                                                                                        │
│ 5️⃣ Step 5: 페이지 테이블 갱신 (Table Update)                                          │
│   - 복사가 끝나면 디스크가 "다 옮겼슈!" 하고 인터럽트로 OS를 깨움.                     │
│   - OS는 페이지 테이블에 [3번 페이지 -> 램 X번 방]으로 적고 `V 비트`를 켬.             │
│                                                                                        │
│ 6️⃣ Step 6: 명령어 재실행 (Restart Instruction)                                        │
│   - OS가 아까 기절시켜둔 앱을 깨우고 레지스터를 복원시킴.                              │
│   - 터졌던 그 명령어 라인부터 "다시" 실행시킴. 램에 데이터가 있으니 스무스 통과!       │
└────────────────────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 이 6단계는 철저한 비동기(Asynchronous) 이벤트의 릴레이다. 가장 눈여겨볼 곳은 4단계다. 디스크에서 램으로 퍼 나르는 시간은 컴퓨터 세계에서 10년과 같은 긴 시간이다. OS는 바보가 아니기 때문에 이 시간 동안 CPU를 놀리지 않는다. 즉, 페이지 폴트가 나면 그 프로세스는 강제로 Waiting(Sleep) 상태로 쫓겨나고, 스케줄러가 Ready 큐에 있던 다른 쌩쌩한 프로세스(예: 멜론 플레이어)를 끄집어와 CPU에 태워버린다. (극강의 다중 프로그래밍 효율).


Step 6의 악몽: 명령어 롤백(Roll-back)의 한계점

가장 만들기 어려웠던 하드웨어 기술은 "명령어를 다시 재시작(Restart)"하는 6단계다.

  • 만약 코드가 ADD A, B (A에 B를 더해 A에 저장) 였다면?

  • B를 읽다가 폴트가 터졌는데, 이미 CPU 내부 임시 레지스터에서 A값이 절반쯤 변형되어 버렸다면?

  • 디스크 가져와서 6단계로 재시작(ADD A, B 처음부터 쳐라!)을 하는 순간, A에 B가 두 번 더해지는 끔찍한 데이터 파괴가 일어난다.

  • 하드웨어의 구원: 모토로라나 인텔의 초기 CPU 설계자들은 폴트가 터지는 순간 실행 중이던 마이크로 오퍼레이션(명령어의 파편들)을 완벽하게 되돌리는 마이크로코드 롤백 보드(Undo state)를 칩셋에 때려 박았다. 이 미친 설계 덕분에 6단계는 프로그래머 눈에 100% 투명하게(아무 일 없었던 것처럼) 굴러간다.

  • 📢 섹션 요약 비유: 요리사(CPU)가 당근을 썰다 칼질 3번 만에 "앗 도마가 없네(Page fault)" 하고 멈췄습니다. 도마를 사 온 뒤, 요리사는 썰다 만 당근을 마저 써는 게 아니라 아예 시간을 5초 전으로 되돌려 완전한 새 당근을 다시 처음부터 썰게 만드는(명령어 재실행) 마법 시계의 롤백입니다.


Ⅲ. 융합 비교 및 다각도 분석

비교 1: 시스템 콜(System Call) vs 페이지 폴트(Page Fault)

운영체제 커널에 진입하는 대표적인 두 가지 트랩(Trap)의 극명한 차이다.

항목시스템 콜 (예: read(), printf())페이지 폴트 (Page Fault)
발생 원인프로그래머가 코드에 의도적으로 적어넣은 호출아무 생각 없이 변수 읽다 우발적으로 지뢰 밟음
명령어 종류INT 0x80, SYSCALL 등 명시적 소프트웨어 트랩MMU 하드웨어가 멱살 잡는 하드웨어 익셉션(예외)
처리 후 복귀호출한 명령어의 **'다음 줄(Next)'**부터 이어서 실행뻗었던 명령어의 **'그 줄(Same)'**부터 처음부터 재실행
예측 가능성100% 예측 가능언제 어디서 튀어나올지 며느리도 모름

숨겨진 함정: 페이지 교체 (Page Replacement)

위 6단계 중 **3단계(빈 프레임 확보)**는 이상적인 상황일 뿐이다. 현실에서는 램이 16GB 꽉 차 있어서 빈방이 단 한 개도 없는 경우가 99%다.

  • 빈방이 없으면 OS는 3.5단계로 **"그럼 지금 램에 있는 놈 중 가장 안 쓸 것 같은 쓰레기 1놈(LRU)을 골라서 디스크로 발로 차버려라(Swap Out)!"**라는 페이지 교체(Page Replacement) 로직을 강제로 태운다.
  • 쫓아내는 놈이 수정된 데이터(Dirty Bit = 1)라면 디스크에 쓰는 시간(8ms)이 추가로 걸린다.
  • 결국 빈방이 없으면 [스왑 아웃(디스크 쓰기) -> 스왑 인(디스크 읽기)]의 2번 디스크 I/O를 맞아야 해서 페널티 시간이 2배로 폭증한다. (이 교체 알고리즘은 뒤에서 자세히 배운다).
┌──────────┬────────────┬────────────┬─────────────────────────────────┐
│ 램(RAM) 상태│ 3단계 (빈방 찾기)│ 디스크 I/O 횟수 │ 폴트 처리 속도    │
├──────────┼────────────┼────────────┼─────────────────────────────────┤
│ 빈방 있음 🟢│ 즉시 할당 (O) │ 1번 (읽기만)   │ 평범한 렉 (1x)        │
│ 빈방 없음 🔴│ 남의 방 뺏기(교체)│ 2번 (쓰고 읽기) │ ☠️ 지옥의 렉 (2x)│
└──────────┴────────────┴────────────┴─────────────────────────────────┘

[매트릭스 해설] 빈방이 있을 때의 폴트를 Minor/Soft Fault라 치면, 빈방이 없어 남의 방을 뺏어야 하는 폴트는 Major/Hard Fault 중에서도 최악이다. 메모리를 넉넉히 꽂아야 하는 진짜 이유는 이 2배의 '쫓아내고 데려오는 시간'을 없애 빈방(Free list) 여유분을 항상 들고 가기 위함이다.

  • 📢 섹션 요약 비유: 식당(램)에 빈자리가 있으면 대기 손님을 바로 앉히면 되지만(1배 시간), 꽉 차 있으면 밥 다 먹고 폰 보는 밉상 손님을 쫓아내고 테이블 치우는 시간까지 걸려서(2배 시간) 새 손님 앉히는 데 시간이 갑절로 듭니다.

Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)

실무 시나리오: KVM 가상화의 지옥, EPT (Extended Page Table)

클라우드 가상 머신(AWS EC2 등)을 띄우면 호스트 OS(리눅스) 위에 게스트 OS(우분투)가 올라간다.

  1. 이중 폴트의 공포:
    • 우분투(게스트) 앱이 폴트를 내면 6단계 처리 과정을 밟는다.
    • 그런데 게스트 OS가 "좋아, 빈방 5번 램에 꽂아!" 했는데, 그 5번 램이 가짜(가상 램)이고 호스트 OS의 진짜 물리 램에선 디스크로 스왑 아웃되어 있다면?
    • 폴트 안에서 또 폴트가 터진다 (Nested Page Fault).
  2. 오버헤드의 기하급수적 팽창:
    • 게스트 OS의 6단계 처리를 하려고 디스크를 읽으려는데 호스트 OS도 6단계 처리를 하느라 디스크를 또 긁는다. 수십 밀리초의 렉이 발생해 클라우드 서버 성능이 토막 난다.
  3. 인텔의 구원 (HW 가속):
    • 인텔은 이 끔찍한 소프트웨어 중첩을 막기 위해 칩셋에 EPT (Extended Page Table) 하드웨어 회로를 박아넣어 호스트와 게스트의 이중 번역을 실리콘 레벨에서 단 한 번의 폴트로 퉁치게 만들어 주었다. 클라우드 혁명은 이 하드웨어 패치가 없었으면 불가능했다.

안티패턴: 대용량 배열의 랜덤 엑세스

자바나 C++로 10GB짜리 배열을 만들고, 인덱스를 1, 1억, 5십만, 2천만... 이런 식으로 무작위(Random)로 뛰면서 찌르는 코드를 짜면 어떻게 될까? 연속성이 없으니 매번 찌를 때마다 페이지 6단계 파이프라인이 펑펑 터진다. OS는 4KB 조각을 가져오느라 디스크를 미친 듯이 긁고, 가져온 조각은 단 1바이트만 쓰고 바로 버려지며 램에서 쫓겨난다. "스래싱(Thrashing)"으로 인해 CPU 점유율은 1%인데 시스템 Load는 100을 찍으며 서버는 영원한 동면에 빠진다. 코드는 무조건 배열의 0번지부터 순차적으로(Sequential) 핥고 지나가야 선행 페이징(Readahead)의 버프를 받아 폴트를 피할 수 있다.

  • 📢 섹션 요약 비유: 은행 창구(페이지 6단계)에서 앞사람이 볼일 보는 동안 뒷사람 100명이 짜증 내며 기다리는데, 앞사람이 "천 원 입금하고, 다시 만 원 찾고, 다시 천 원 입금하고..." 미친 짓(랜덤 엑세스)을 반복하면 은행 업무가 마비되는 꼴입니다. 한 번에 "10만 원 입금" 서류를 내는 게(순차적 접근) 매너입니다.

Ⅴ. 기대효과 및 결론 (Future & Standard)

정량/정성 기대효과

구분내용
논리-물리 갭(Gap)의 완벽한 추상화에러(트랩)를 정상 루틴으로 승화시킴으로써, 앱 개발자는 물리 램이 1GB든 100GB든 1도 신경 쓰지 않고 무한대인 양 코딩 가능
CPU 가동률(Utilization) 방어디스크 I/O를 기다리는 영겁의 시간 동안 문맥 교환을 쳐서 다른 프로세스에게 CPU를 넘겨주어 전체 시스템 스루풋(Throughput) 극대화
요구 페이징의 뼈대 완성"가짜 주소를 진짜 주소로 이어주고 멈췄던 곳부터 다시 돌린다"는 이 6단계는 가상화 시스템을 지탱하는 가장 거룩한 십자가

결론 및 미래 전망

페이지 부재 처리 과정 6단계 (Page Fault Handling 6 Steps)는 하드웨어, 운영체제, 디스크 스토리지라는 컴퓨터 공학의 3대 거장이 서로 멱살을 잡고 협업하여 일궈낸 종합 예술 교향곡이다. MMU가 비상벨을 울리고, 커널이 스케줄링 마술을 부리며, 디스크가 짐을 실어 나르고, 하드웨어가 멈췄던 시간을 되감기(Restart)하는 이 숨 막히는 트랜잭션이 초당 수만 번씩 여러분의 스마트폰과 서버 뒷단에서 돌아가고 있다. 미래에는 디스크 대신 CXL 기반 원격 메모리나 비휘발성 램(NVRAM)이 스왑 공간을 대체하여, 이 6단계 파이프라인의 4단계(I/O) 시간이 나노초 단위로 단축되겠지만, "부족하면 멈추고 몰래 훔쳐 온 뒤 다시 돌린다"는 이 기만적이고도 아름다운 추상화의 6단계 뼈대는 영원히 컴퓨터 아키텍처의 교과서로 남을 것이다.

  • 📢 섹션 요약 비유: 배우가 무대 위에서 대사(데이터)를 까먹고 얼음이 되었을 때(Trap), 조명이 탁 꺼지면서 무대 뒤 프롬프터(OS)가 대본(디스크)을 보고 귓속말로 대사를 속삭여준 뒤, 다시 조명이 켜지면 배우가 아무 일도 없었던 것처럼 명연기(재실행)를 이어가는 완벽한 연극 무대의 뒷모습입니다.

📌 관련 개념 맵 (Knowledge Graph)

  • 페이지 부재 (Page Fault) | 이 6단계 파이프라인 전체를 가동시키는 시발점이자 하드웨어가 내지르는 비명(트랩)
  • 트랩 (Trap) | 하드웨어가 소프트웨어(OS 커널)를 강제로 깨우기 위해 발생시키는 동기적 인터럽트(1단계 시작점)
  • 문맥 교환 (Context Switch) | 디스크에서 데이터를 가져오는 4단계의 지루한 시간 동안, CPU가 놀지 않게 남의 일을 시키는 마술
  • 명령어 재시작 (Instruction Restart) | 6단계의 화룡점정으로, 도중에 터졌던 명령어를 마치 처음 실행한 것처럼 상태를 롤백시켜주는 하드웨어 기술
  • 스래싱 (Thrashing) | 이 6단계 짓거리가 1초에 수십만 번씩 너무 자주 터져서 컴퓨터가 본업(연산)은 못하고 디스크 배달만 하다가 뻗어버리는 재앙

👶 어린이를 위한 3줄 비유 설명

  1. 페이지 부재 처리 6단계가 뭔가요? 퍼즐을 맞추다(CPU 실행) 피카츄 퍼즐 조각이 없다는 걸 깨닫고(1단계), 엄마한테 찾아달라고 부탁하고(2단계), 엄마가 장난감 상자(디스크)를 뒤져서(3,4단계) 빈칸에 퍼즐을 올려주면(5단계), 다시 신나게 퍼즐 맞추기를 이어가는(6단계) 과정이에요.
  2. 엄마가 상자 뒤질 때 나는 뭐 해요? 퍼즐을 멍하니 기다리면 바보니까, 그 10분 동안 재빨리 닌텐도 게임(다른 프로세스로 문맥 교환)을 하면서 시간을 1초도 안 버리고 놀아요.
  3. 엄마가 조각을 찾아오면요? 닌텐도를 일시 정지하고, 아까 멈췄던 피카츄 퍼즐 조각부터 완벽하게 이어서 다시 맞추기(명령어 재실행)를 시작한답니다!