요구 페이징 (Demand Paging)
요구 페이징은 메모리 효율성을 높이기 위해 프로그램의 모든 페이지를 메모리에 미리 적재하지 않고, 실행 시점에 필요한 페이지만 메모리에 적재하는 메모리 관리 기법이다.
작동 원리
- 프로세스가 실행될 때, 초기에는 페이지 테이블의 모든 페이지 항목이 "존재하지 않음" 상태로 설정된다.
- CPU가 특정 페이지에 접근하려고 하면, 페이지 테이블을 통해 확인한다.
- 페이지가 메모리에 존재하지 않으면 페이지 폴트(Page Fault)가 발생한다.
- 운영체제는 디스크에서 필요한 페이지를 읽어와 메모리에 적재하고, 페이지 테이블을 갱신한다.
- CPU는 갱신된 페이지 테이블을 참고하여 다시 명령을 실행한다.
장점
- 불필요한 페이지 적재를 방지하여 메모리 사용량 최적화
- 프로그램 크기가 물리 메모리 크기를 초과해도 실행 가능
단점
- 페이지 폴트가 자주 발생하면 성능 저하(스래싱(Thrashing))가 발생할 수 있음.
페이지 폴트 (Page Fault)
페이지 폴트는 CPU가 접근하려는 페이지가 물리 메모리에 존재하지 않을 때 발생하는 이벤트이다.
이는 정상적인 시스템 작동 과정의 일부이며, 운영체제가 이를 처리한다.
페이지 폴트 처리 과정
- CPU가 논리 주소를 통해 페이지에 접근하려고 시도한다.
- 페이지 테이블에서 해당 페이지가 메모리에 없음을 확인하고, 페이지 폴트가 발생한다.
- MMU가 페이지 폴트 인터럽트를 발생시키고, 운영체제가 처리 루틴을 실행한다:
- 디스크에서 필요한 페이지를 찾는다.
- 메모리에 페이지를 적재하고, 페이지 테이블을 갱신한다.
- 작업이 완료되면 CPU는 페이지 폴트가 발생한 명령을 재실행한다.
페이지 폴트와 성능
- 페이지 폴트가 적절히 관리되면 메모리 사용을 최적화하지만, 폴트 빈도가 높아지면 디스크 I/O 과부하로 인해 성능이 크게 저하된다.
페이지 폴트와 인터럽트
페이지 폴트는 소프트웨어 인터럽트의 한 형태로, 프로세스의 정상 실행 흐름을 일시적으로 중단시키고 운영체제의 페이지 관리 루틴을 실행하도록 한다.
페이지 폴트 인터럽트 처리
- IDT(Interrupt Descriptor Table):
CPU는 인터럽트 발생 시 IDT를 참조하여 페이지 폴트 처리 핸들러의 주소를 찾는다.
- 운영체제 커널모드 전환:
페이지 폴트 처리 루틴은 커널모드에서 실행된다. 커널모드는 메모리 및 하드웨어 자원에 대한 권한을 보유한다.
- 페이지 적재 및 테이블 업데이트:
- 필요한 페이지를 메모리에 로드한다.
- 프로세스의 페이지 테이블을 갱신한다.
- 사용자모드로 복귀:
페이지 폴트 처리가 완료되면, 프로세스의 실행을 재개한다.
사용자 모드와 커널 모드, 프로세스 및 인터럽트
사용자 모드(User Mode)
- 사용자 애플리케이션이 실행되는 제한된 모드이다.
- CPU는 하드웨어 자원(메모리, I/O 장치)에 직접 접근할 수 없다.
- 잘못된 명령 실행으로 인해 시스템 전체에 영향을 미치지 않도록 보호된다.
커널 모드(Kernel Mode)
- 운영체제가 실행되는 모드로, 모든 하드웨어 자원에 대한 접근 권한을 가진다.
- 페이지 폴트와 같은 인터럽트 처리 루틴은 커널모드에서 실행된다.
- 운영체제는 사용자 모드에서 커널 모드로의 전환을 제어한다.
사용자모드 ↔︎ 커널모드 전환
- 시스템 호출(System Call): 사용자 모드에서 커널 모드로 전환하기 위한 메커니즘
- 인터럽트 발생: 페이지 폴트나 하드웨어 인터럽트 발생 시 자동으로 커널 모드로 전환
인터럽트와 IDT (Interrupt Descriptor Table)
인터럽트 (Interrupt)
인터럽트는 CPU가 정상적인 실행 흐름을 일시적으로 중단하고, 특정 이벤트(예: 하드웨어 요청, 페이지 폴트)를 처리하도록 하는 메커니즘이다.
IDT (Interrupt Descriptor Table)
IDT는 CPU가 인터럽트 처리 루틴의 주소를 찾는 데 사용하는 데이터 구조이다.
IDT의 구조
- IDT는 최대 256개의 엔트리를 가지며, 각 엔트리는 특정 인터럽트 또는 예외의 처리 루틴을 가리킨다.
- 주요 엔트리:
- 0번: Divide-by-Zero 예외
- 14번: 페이지 폴트
- 32번: 사용자 정의 하드웨어 인터럽트
인터럽트 처리 과정
- CPU는 인터럽트가 발생하면 현재 실행 중인 프로세스를 멈추고 IDT를 참조한다.
- 인터럽트 핸들러의 주소를 찾고 해당 루틴을 실행한다.
- 인터럽트 처리가 완료되면 중단된 프로세스의 실행을 재개한다.
페이지 폴트와 인터럽트의 상호작용
- 페이지 폴트 발생:
- 프로세스가존재하지 않는 페이지에 접근
- MMU가 페이지 폴트 인터럽트를 발생
- IDT를 통해 핸들러 실행:
- CPU가 IDT를 참조하여 페이지 폴트 처리 루틴 실행
- 커널모드 전환 및 처리:
- 커널모드로 전환하여 디스크에서 페이지를 메모리에 로드
- 테이블 갱신 및 복귀:
- 페이지 테이블 갱신 후, 사용자모드로 복귀하여 프로세스 재개
정리
- 요구 페이징: 필요한 페이지만 적재하여 메모리 사용 최적화
- 페이지 폴트: 페이지 미존재 시 발생하는 이벤트로, 운영체제가 처리
- 페이지 폴트와 인터럽트: 페이지 폴트는 소프트웨어 인터럽트로 IDT를 통해 처리
- IDT: CPU가 인터럽트 처리 루틴을 찾는 데 사용하는 테이블