페이징은 메모리 관리를 효율적으로 수행하기 위한 핵심 기법 중 하나입니다. 물리 메모리를 고정된 크기의 블록(페이지)으로 나누어 가상 메모리 주소를 물리 메모리 주소로 매핑하는 방식입니다. 프로그램이 물리 메모리의 크기에 구애받지 않고 실행될 수 있도록 도와주며 외부 단편화 문제를 해결합니다.
1. 페이징의 개요
개념
- 가상 메모리와 물리 메모리를 페이지 단위로 나누고 필요한 페이지를 물리 메모리에 할당하는 것
- 운영 체제는 유휴(free) 프레임들을 관리하고 프로세스 실행 시 필요한 수의 페이지를 요청받아 해당 프로세스에 할당
- 프로세스의 가상 메모리를 불연속적인 페이지로 구성하여 물리 메모리에 적재하는 방식
- 외부 단편화 문제를 해결하고 메모리 관리의 유연성을 제공
용어
- 페이지(Page)
- 가상 메모리를 동일한 크기의 블록으로 나눈 것
- 프로세스가 사용하는 논리적 주소 공간의 단위를 의미
- 프레임(Frame)
- 물리 메모리를 동일한 크기의 블록으로 나눈 것
- 실제 물리적 메모리에서 페이지가 저장될 수 있는 영역
- 페이지 크기가 작을수록 내부 단편화가 줄어들지만 페이지 테이블 관리가 복잡
페이지 테이블
- 가상 주소와 물리 주소 간의 매핑을 담당하는 데이터 구조
- 프로세스는 자신만의 페이지 테이블을 가지며 n개의 가상 페이지를 n개의 물리 프레임에 연결
- 페이지 테이블 엔트리는 가상 페이지가 어떤 물리 프레임에 매핑되는지를 기록

페이지 테이블 엔트리 (PTE)
- V(Valid) bit
- 해당 가상 페이지의 유효 여부 저장
- 가상 주소가 접근될 때마다 valid bit를 테스트
- R(Reference) bit
- 해당 가상 페이지가 최근에 접근 되었는지 여부
- 가상 주소가 접근될 때 해당 reference bit가 set됨
- M(Modify) bit
- 해당 가상 페이지에 쓰기가 발생했는지 여부
- 가상 주소에 쓰기(write 또는 store 명령어)가 발생하면 set됨
- Prot(Protection) bits
- 해당 가상 페이지의 접근 권한
- 읽기, 쓰기, 실행가능 등
- PFN(Page Frame Number)
- 해당 가상 페이지에 연결 물리 프레임
- PTE의 구조는 CPU ISA별로 상이함 (Intel x86 vs ARMv8)

2. 페이징의 장단점
장점
- 메모리 관리의 단순화
- 페이징은 프로그램이 물리적 메모리 주소를 신경 쓸 필요 없이 가상 주소를 사용할 수 있게 하여 메모리 관리가 단순
- 효율적인 메모리 사용
- 고정된 크기의 페이지를 사용함으로써 외부 단편화를 제거
- 필요한 페이지만 메모리에 적재하여 메모리를 절약
- 보호와 격리
- 프로세스는 독립적인 페이지 테이블을 가지며 이는 다른 프로세스의 메모리에 접근하지 못하도록 보호
단점
- 내부 단편화
- 고정된 페이지 크기로 인해 페이지 내에 사용되지 않는 공간이 발생
- 페이지 테이블 오버헤드
- 큰 메모리를 사용하는 시스템에서는 페이지 테이블 관리가 복잡
- 추가적인 메모리 접근
- 페이지 테이블을 통한 주소 변환 과정에서 추가적인 메모리 접근이 필요하여 성능 저하가 발생
3. 운영 체제 사례
- 운영 체제에서 가상 메모리는 Linux와 Windows가 각각의 방식으로 관리
- 가상 메모리는 Linux와 Windows 운영 체제는 모두 페이징과 세그멘테이션을 사용하여 가상 메모리를 관리
- Linux는 페이지 테이블을 사용하여 가상 주소를 물리 주소로 변환하고 페이지 교체 알고리즘을 통해 메모리 관리를 수행
- Windows는 세그멘테이션을 통해 각 프로세스의 메모리 공간을 보호하고 가상 메모리의 크기를 동적으로 조정
4. 기술파악
TLB(Translation Lookaside Buffer)
- 주소 변환을 빠르게 수행하기 위한 캐시
- 최근에 사용된 페이지 테이블 엔트리를 저장하여 페이지 테이블에 접근하는 시간을 줄임
- TLB의 크기는 보통 16~256개의 엔트리를 가지며 LRU(Least Recently Used) 알고리즘을 사용하여 교체 정책을 결정
TLB 주소변환 과정

- 가상 주소 생성
- CPU는 프로그램 실행 중에 가상 주소를 생성
- 가상 주소는 프로세스의 논리적 주소 공간에서의 위치
- 페이지 번호와 오프셋 분리
- 페이지 번호와 오프셋으로 나뉜다
- 페이지 번호는 페이지 테이블에서의 인덱스 역할
- 오프셋은 페이지 내의 특정 위치
- TLB 조회
- MMU는 먼저 변환 조회 버퍼(TLB)에서 페이지 번호를 검색
- TLB는 최근에 사용된 페이지 테이블 항목을 캐시하여 빠른 접근
- TLB 히트 또는 미스
- TLB 히트
- TLB에 해당 항목이 있으면 물리적 페이지 번호를 즉시 가져와 오프셋과 결합하여 물리적 주소를 생성
- TLB 미스
- MMU는 메인 메모리에 있는 페이지 테이블을 검색하여 필요한 정보 제공
- 페이지 테이블 조회
- 페이지 테이블은 가상 페이지 번호를 물리적 페이지 번호로 매핑
- 물리적 주소 생성
- 물리적 페이지 번호와 오프셋을 결합하여 물리적 주소를 생성
- 메모리 접근
- 생성된 물리적 주소를 사용하여 메모리에 접근하고 필요한 데이터를 읽거나 쓰기
페이지 크기
- 가상 메모리의 성능에 큰 영향을 미치며 일반적으로 4KB에서 16KB 사이로 설정
- 페이지 크기가 클수록 페이지 테이블의 크기가 작아지지만 내부 단편화가 발생
- 페이지 크기가 작으면 내부 단편화는 줄어들지만 페이지 테이블의 크기가 커져서 관리가 복잡해질 수 있음
다단계 페이지 테이블
- 대규모 주소 공간에서 효율적인 관리가 가능
- 불필요한 PTE(Page Table Entry)를 줄여 공간 효율성 증가
5. 가상 메모리와 페이지 교체
페이지 교체
- 페이징 시스템에서 가상 메모리가 물리 메모리를 초과할 수 있으며 이는 페이지 교체 알고리즘을 통해 관리
- 물리 메모리가 부족할 때 덜 중요한 페이지를 디스크로 옮기고 필요한 페이지를 적재하는 과정
- LRU(Least Recently Used)와 같은 알고리즘은 덜 사용된 페이지를 디스크로 옮기고 필요한 페이지를 적재하여 효율적으로 메모리를 사용
페이지 교체과정

- 페이지 워터마크
- high_wmark_pages
- low_wmark_pages
- min_wmark_pages
- 메모리가 매우 부족한 상태로 긴급한 조치가 필요
- kswapd 데몬
- 활성화 조건
- 메모리의 여유 공간이
low_wmark_pages
이하로 떨어지면 kswapd가 활성화
- 작업
- kswapd는 불필요한 페이지를 찾아 디스크로 옮기고 사용 가능한 페이지를 확보
- 비활성화 조건
- 메모리 여유 공간이
high_wmark_pages
를 초과하면 kswapd는 다시 휴면 상태
- 페이지 할당 및 해제
- 프로세스가 메모리를 할당할 때 시스템은 현재 메모리 상태를 확인
- 만약 메모리가 충분하지 않다면 kswapd가 개입하여 필요한 페이지를 확보
- GFP_ATOMIC 할당
- 긴급한 상황에서는
GFP_ATOMIC
플래그를 사용하여 min_wmark_pages
이하에서도 페이지 할당이 가능하고 시스템의 중요한 작업이 중단되지 않도록 보장
6. 결론
페이징 기반 가상 메모리는 효율적인 메모리 사용과 프로그램 격리를 가능하게 합니다. 그러나 내부 단편화와 페이지 테이블 관리의 복잡성 등 몇 가지 단점도 존재합니다. 이러한 문제점을 해결하기 위해 다단계 페이지 테이블과 TLB(Translation Lookaside Buffer)와 같은 기술들이 활용되고 있습니다.