페이징
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
페이징은 컴퓨터의 가상 메모리 관리 기법으로, 램(RAM)과 디스크 간에 페이지를 이동시켜 메모리 사용 효율을 높인다. 1960년대 아틀라스 컴퓨터에서 처음 구현되었으며, 페이지와 프레임, 페이지 테이블, MMU(메모리 관리 유닛) 등을 활용하여 논리 주소를 물리 주소로 변환한다. 페이지 폴트, 페이지 교체 알고리즘, 요구 페이징, 예측 페이징 등의 기법을 통해 메모리 관리 효율을 높이며, 스레싱을 방지하고 페이지 공유를 지원한다. 페이지 크기는 하드웨어에 의해 결정되며, 성능 향상을 위해 TLB(Translation Lookaside Buffer)와 페이지 컬러링 등의 기술이 사용된다.
더 읽어볼만한 페이지
페이징 | |
---|---|
개요 | |
![]() | |
종류 | 단순 페이징 다단계 페이징 역 페이지 테이블 |
관련 개념 | 가상 메모리 세그멘테이션 TLB 페이지 테이블 페이지 폴트 |
상세 내용 | |
정의 | 컴퓨터의 메모리 관리 기법 중 하나 |
목적 | 프로세스가 사용하는 메모리 공간을 동일한 크기의 페이지로 나누어 관리 물리적 메모리의 프레임에 매핑하여 사용 |
장점 | 외부 단편화 문제 해결 메모리 사용의 효율성 향상 프로세스가 물리적 메모리에 연속적으로 위치할 필요가 없음 |
단점 | 페이지 테이블 관리에 따른 오버헤드 발생 내부 단편화 발생 가능성 존재 |
작동 방식 | 프로세스의 가상 주소를 페이지 번호와 페이지 오프셋으로 분리 페이지 테이블을 사용하여 가상 페이지 번호를 물리적 프레임 번호로 변환 변환된 물리적 프레임 번호와 페이지 오프셋을 결합하여 실제 물리 주소 생성 |
페이지 크기 | 일반적으로 4KB 또는 8KB 사용 시스템 아키텍처 및 운영체제에 따라 다름 |
페이지 테이블 항목 (PTE) | 유효 비트: 페이지가 유효한지 여부 표시 수정 비트: 페이지 내용이 수정되었는지 여부 표시 참조 비트: 페이지가 참조되었는지 여부 표시 보호 비트: 페이지에 대한 접근 권한 (읽기, 쓰기, 실행) 설정 프레임 번호: 해당 페이지가 위치한 물리적 메모리 프레임 번호 |
페이지 교체 알고리즘 | FIFO: 가장 먼저 들어온 페이지를 교체 LRU: 가장 오랫동안 사용되지 않은 페이지를 교체 LFU: 가장 적게 사용된 페이지를 교체 최적 페이지 교체 (Optimal Page Replacement): 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체 (구현 불가) |
다단계 페이징 | 페이지 테이블 자체를 페이지로 나누어 관리하는 기법 메모리 공간 절약 효과 주소 변환 과정이 복잡해지는 단점 |
역 페이지 테이블 | 물리적 메모리 프레임마다 페이지 테이블 항목을 갖는 구조 시스템 전체에 하나의 페이지 테이블만 존재 메모리 사용량 감소 효과 페이지 검색 속도 저하 가능성 |
TLB (Translation Lookaside Buffer) | 페이지 테이블 항목을 캐싱하는 하드웨어 버퍼 주소 변환 속도 향상 캐시 미스 발생 시 성능 저하 |
2. 역사
1960년대에 스와핑은 초창기 가상 메모리 기술이었다. 전체 프로그램 또는 전체 세그먼트가 RAM에서 디스크나 드럼으로 "스와핑 아웃"(또는 "롤 아웃")되고 다른 프로그램이 "스와핑 인"(또는 "롤 인")될 수 있었다.[2][3] 스와핑 아웃된 프로그램은 현재 실행 중이지만 RAM이 다른 프로그램에서 사용되는 동안 실행이 일시 중지된다. 스와핑 아웃된 세그먼트를 가진 프로그램은 해당 세그먼트가 필요할 때까지 계속 실행될 수 있으며, 이 시점에서 해당 세그먼트가 스와핑 인될 때까지 일시 중지된다.
프로그램은 여러 개의 오버레이를 포함할 수 있으며, 이들은 다른 시간에 동일한 메모리를 차지한다. 오버레이는 RAM을 디스크로 페이징하는 방법이 아니라 프로그램의 RAM 사용을 최소화하는 방법일 뿐이다. 이후 아키텍처는 메모리 세그먼테이션을 사용했으며, 개별 프로그램 세그먼트가 디스크와 RAM 간에 교환되는 단위가 되었다. 세그먼트는 프로그램의 전체 코드 세그먼트 또는 데이터 세그먼트였으며, 때로는 다른 큰 데이터 구조이기도 했다. 이러한 세그먼트는 RAM에 상주할 때 연속적이어야 했으며, 단편화를 해결하기 위해 추가적인 계산과 이동이 필요했다.[4]
페란티의 아틀라스와 맨체스터 대학교에서 개발된 아틀라스 슈퍼바이저(1962)는 메모리 페이징을 구현한 최초의 시스템이었다.[5] 그 후 페이징을 지원하는 초기 시스템과 운영 체제에는 다음이 포함된다.
시스템/운영체제 | 연도 | 비고 |
---|---|---|
IBM M44/44X 및 MOS 운영 체제 | 1964[6] | |
SDS 940[7] 및 버클리 타임 쉐어링 시스템 | 1966 | |
수정된 IBM System/360 Model 40 및 CP-40 운영 체제 | 1967 | |
IBM System/360 Model 67 및 TSS/360, CP/CMS | 1967 | |
RCA 70/46 및 시분할 운영 체제 | 1967 | |
GE 645 및 멀틱스 | 1969 | |
PDP-10에 Raytheon BBN이 설계한 페이징 하드웨어와 TENEX 운영 체제 | 1969 |
페이지는 가상 메모리를 일정한 크기로 나눈 블록이며, 프레임은 물리 메모리를 같은 크기로 나눈 블록이다. 페이지와 프레임의 크기는 같으며, 페이지가 하나의 프레임을 할당받으면 물리 메모리에 위치하게 된다. 프레임을 할당받지 못한 페이지들은 외부 저장장치에 저장되며, 이때도 프레임과 같은 크기 단위로 관리된다.[35]
페이지 테이블은 프로세스의 페이지 정보를 저장하며, 하나의 프로세스는 하나의 페이지 테이블을 가진다. 페이지 테이블은 페이지 번호를 색인으로, 해당 페이지에 할당된 물리 메모리(프레임)의 시작 주소를 내용으로 가진다. 이 시작 주소와 페이지 주소를 결합하여 물리 메모리 주소를 알 수 있다.[1]
이러한 시스템과 메모리 페이징을 지원하는 후속 시스템은 일련의 페이지 주소 레지스터 또는 메모리 내 페이지 테이블을 사용하여 프로세서가 RAM의 임의의 페이지를 처리하여 마치 연속적인 논리 주소 공간처럼 보이게 한다. 이러한 페이지가 디스크와 RAM 간에 교환되는 단위가 되었다. 다른 동적 메모리 할당에 비해, 페이징 방식에서는 프로그램에 할당하는 메모리가 연속적일 필요가 없고, 큰 단편화(외부 단편화)가 거의 발생하지 않으므로, 메모리를 낭비하지 않는다.[35]
프로그램은 특정 시점에서 해당 코드와 데이터를 모두 사용하지 않는다(참조 지역성). 따라서, 필요에 따라 페이지를 디스크에 쓰거나, 페이지의 내용을 디스크에서 읽어 들이는 것으로 가상 메모리의 개념을 구현할 수 있다. 이 점 또한 페이징 방식이 다른 메모리 할당 기법보다 우수한 점이다.
역사적으로 "페이징"이라는 용어는 가변 길이 세그먼트가 아닌 고정 길이 페이지를 이용한 메모리 관리를 지칭하는 경우가 있으며, 가상 메모리나 보조 기억 장치로의 전송과 같은 기법을 포함하지 않는 경우도 있었다.[37][38] 그러나 최근에는 그러한 용법은 드물다.
최근의 일부 시스템에서는 "페이징"과 "스와핑"이라는 용어를 동시에 사용하고 있다. 역사적으로 "스와핑"은 프로그램 전체를 보조 기억 장치로 전송(또는 보조 기억 장치에서 주 기억 장치로 전송)하는 것을 의미했다.[39][40] 1960년대에 세그먼트 방식과 페이징 방식의 가상 메모리 개념이 등장하면서, "스와핑"이라는 용어는 세그먼트 단위 및 페이지 단위의 보조 기억 장치와 주 기억 장치 간의 전송을 의미하게 되었다. 오늘날의 가상 메모리는 대부분 페이징 방식이 되었기 때문에, "스와핑"은 "페이징"과 거의 동의어로 사용되기도 한다. 또한, 스왑 파일과의 페이지 인(page-in)과 페이지 아웃(page-out)만을 "스와핑"이라고 칭하기도 한다.
유닉스 계열 운영체제에서는, 초기 가상 메모리 기술로서 커널 내에서 장기간 슬립 중인 프로세스를 대상으로 PCB 및 커널 스택을 보조 기억 장치로 내보냈으며, 이를 "스와핑"이라고 불렀다. 스왑된 프로세스는 PCB 및 커널 스택을 메모리로 다시 불러와야 실행을 재개할 수 있다. 전통적으로 스와핑 처리는 프로세스 ID가 0인 프로세스가 담당했으며, 이 프로세스는 `swapper`라고 불렸다. 현재는 프로세스의 주소 공간 전체가 페이징 대상이 되었기 때문에 스와핑의 효과는 작아졌지만, `swapper`라는 명칭은 많은 유닉스 계열 운영체제에 남아 있다. 또한, 유닉스 계열 운영체제에서 가상 메모리의 보조 기억 장치 영역을 "스왑 영역", "스왑 파티션" 등으로 부르는 유래가 되었다.
3. 페이지와 프레임
4. 페이지 테이블
'''페이지 테이블 엔트리'''(Page Table Entry, PTE)는 페이지 테이블의 레코드이다.[1] PTE는 일반적으로 다음과 같은 정보를 포함한다.[1]
페이징 방식에서는 메모리 관리 유닛(MMU)이 페이지 테이블을 사용하여 실제 메모리 접근을 하드웨어 레벨에서 제어한다.[1] 물리 메모리는 페이지라고 불리는 작은 블록으로 분할되며, 각 페이지에는 페이지 번호가 부여된다. 운영체제(OS)는 사용하지 않는 페이지 목록을 유지하며, 프로그램이 메모리를 요청하면 해당 프로그램에 페이지를 할당하고, 프로그램별로 할당된 페이지를 관리하는 목록에 추가한다.[1]
페이지 할당 예시는 다음과 같다.
페이지 번호 | 페이지 할당처 | 물리 메모리 주소 |
---|---|---|
0 | 프로그램 A.0 | 1000:0000 |
1 | 프로그램 A.1 | 1000:1000 |
2 | 프로그램 A.2 | 1000:2000 |
3 | 프로그램 B.0 | 1000:3000 |
4 | 프로그램 B.1 | 1000:4000 |
5 | 프로그램 D.0 | 1000:5000 |
6 | 프로그램 D.1 | 1000:6000 |
7 | 프로그램 B.2 | 1000:7000 |
위 표를 바탕으로 각 프로그램의 페이지 테이블에는 다음과 같은 매핑이 저장된다.
- 프로그램 A: 0 → 0, 1 → 1, 2 → 2
- 프로그램 B: 0 → 3, 1 → 4, 2 → 7
- 프로그램 D: 0 → 5, 1 → 6
프로그램이 메모리에 접근하는 과정은 다음과 같다. 예를 들어 프로그램 A가 "LOAD memory at 20FE" 명령을 실행하면, MMU는 페이지 크기(예: 4KB)에 따라 주소를 페이지 번호와 페이지 내 상대 주소로 분리한다. MMU는 페이지 테이블을 참조하여 해당 페이지 번호에 매핑된 물리 메모리 주소를 찾고, 페이지 내 상대 주소를 더하여 최종 물리 주소에 접근한다.[1]
최근 컴퓨터 아키텍처에서는 페이징 속도를 높이기 위해 TLB(Translation Lookaside Buffer)라는 특수 캐시를 사용한다. TLB는 최근에 접근한 가상 주소와 물리 주소의 매핑 정보를 저장하여 페이지 테이블 참조 없이 빠르게 매핑 정보를 얻을 수 있게 한다.[1]
4. 1. 페이지 테이블 구조
페이지 테이블은 다양한 방식으로 구성될 수 있다.5. 동적 주소 변환
페이징 기법에서 가상 주소는 페이지 번호와 페이지 오프셋(변위)으로 구성된다. 메모리 관리 유닛(MMU)은 페이지 테이블을 참조하여 가상 주소를 물리 주소로 변환한다. 이러한 동적 주소 변환은 하드웨어(MMU)와 소프트웨어(운영체제)의 협력을 통해 이루어진다.[35]
동적 주소 변환 과정은 다음과 같다.
# 실행 중인 프로세스가 가상 주소 V(p, d)를 참조한다.
# 페이징 기법을 통해 페이지 p가 페이지 프레임 p'에 있음을 알아낸다.
# 실제 주소 r = p' + d를 구한다.
예를 들어, 프로그램 A가 "LOAD memory at 20FE"(20FE번지에서 로드)라는 명령을 실행했을 때, 20FE(16진수)를 2진수로 표기하면(16비트 시스템에서) 0010000011111110이 된다. 페이지 크기가 4KB라면, MMU는 다음과 같이 주소를 해석한다.
0010000011111110 = 20FE
|__||__________|
| |
| v
v 페이지 내 상대 메모리 주소 (00FE)
페이지 번호 (2)
페이지 크기가 4096바이트이므로, MMU는 주소의 최상위 4비트를 페이지 번호, 나머지 12비트를 페이지 내 상대 메모리 주소로 취급한다. 페이지 크기가 2048바이트라면, MMU는 선두 5비트를 페이지 번호, 나머지 11비트를 페이지 내 상대 메모리 주소로 취급한다. 즉, 페이지 크기가 작을수록 페이지 수가 많아진다.
MMU는 해당 프로그램의 페이지 테이블을 참조하여 매핑된 OS의 페이지 번호를 얻는다. 프로그램 A의 두 번째 페이지는 OS의 두 번째 페이지에 매핑되어 있다. OS 페이지 번호에 해당하는 물리 매핑을 얻는다. 두 번째 OS 페이지는 물리 메모리 주소 1000:2000에 해당하며, 프로그램이 참조하려는 주소의 페이지 내 상대 주소는 00FE이므로, MMU는 물리 주소 1000:20FE 위치의 메모리에 접근한다.
최근의 컴퓨터 아키텍처에서는 페이징을 고속화하기 위해 TLB(Translation Lookaside Buffer)라는 특수 캐시를 사용한다. TLB는 과거에 접근한 가상 주소와 물리 주소의 매핑을 보존하여, 페이지 테이블 참조 없이 매핑 정보를 빠르게 얻을 수 있게 한다.
6. 페이지 폴트
프로세스가 현재 RAM의 페이지 프레임에 매핑되지 않은 페이지를 참조하려고 할 때, 프로세서는 이 유효하지 않은 메모리 참조를 페이지 폴트로 처리하고 프로그램에서 운영 체제로 제어를 전송한다. 이를 '''페이지 폴트'''라고 한다. 운영 체제는 페이지 폴트에 의해 제어권을 얻어 프로그램에서는 보이지 않는 형태로 처리를 수행한다. 그 흐름은 다음과 같다.[36]
# 보조 기억 장치 내에서 요청된 데이터의 위치를 특정한다.
# RAM상의 빈 페이지 프레임을 획득한다.
# 요청된 데이터를 해당 페이지 프레임에 로드한다.
# 페이지 테이블을 갱신하여 해당 페이지 프레임을 매핑한다.
# 요청한 프로그램에 제어권을 반환하고 페이지 폴트를 발생시킨 명령어를 투명하게 재실행시킨다.
이러한 과정을 "페이지 인"이라고 부른다.
7. 페이지 교체 알고리즘
물리 메모리가 가득 찼을 때 어떤 페이지를 내보낼지 결정하는 알고리즘을 페이지 교체 알고리즘이라고 한다. 효율적인 페이지 교체 알고리즘은 페이지 폴트 횟수를 최소화하여 시스템 성능을 향상시킨다.[36] 다양한 페이지 교체 알고리즘이 존재하며, 각각 장단점이 있다. 많은 운영 체제는 최근 사용 안 함(LRU) 알고리즘과 유사한 것을 사용하거나, 워킹 세트 기반의 알고리즘을 사용한다.
페이징 시스템은 응답성을 향상시키기 위해 어떤 페이지가 즉시 필요할지를 예측하는 다양한 전략을 활용한다. 프로그램이 참조하기 전에 선행적으로 페이지를 로드하는 시스템도 있다. 스왑 프리페치라고도 불리는 기술로, 참조 지역성을 이용하여 가까운 미래에 참조될 것으로 예측되는 페이지를 미리 로드해 둔다.
8. 페이지 패치 기법
페이지 패치 기법은 크게 요구 페이징과 예측 페이징으로 나눌 수 있다.
요구 페이징 (Demand Paging) 은 프로세스가 실행될 때 모든 페이지를 한 번에 물리 메모리에 로드하는 것이 아니라, 특정 페이지에 접근할 때 해당 페이지를 물리 메모리에 할당하는 방식이다. 이는 지연 로드 기법의 한 예이다.
요구 페이징은 다음과 같은 장점을 가진다.
- 필요한 페이지만 로드하므로 메모리 사용량이 절약되고, 여러 프로그램(멀티태스킹)을 동시에 실행하는 능력이 향상된다.
- 프로그램 실행 전 로드로 인한 지연 시간이 없다.
- 페이지 읽기가 최소화되어 디스크 부하가 적다.
- 페이지는 업데이트될 때까지 여러 프로그램에서 공유될 수 있으며, 카피 온 라이트를 통해 리소스를 더욱 절약할 수 있다.
- 실제 메모리 용량보다 더 큰 프로그램을 실행할 수 있게 해준다. 이는 오버레이라는 오래된 기술보다 발전된 형태이다.
- 기존 페이징 방식에서 사용하는 하드웨어 외에 추가적인 장치를 필요로 하지 않는다.
하지만 요구 페이징은 프로그램이 임의의 가상 페이지에 처음 접근할 때 지연이 발생한다는 단점이 있다. 이를 해결하기 위해 프리페이징(Prefetching)이라는 기법을 사용하기도 한다. 프리페이징은 이전에 사용했던 페이지를 기억해두었다가, 스케줄링에 의해 프로그램이 실행될 때 해당 페이지들을 미리 물리 메모리에 로드하여 성능을 향상시키는 기법이다.
리눅스와 같은 유닉스 계열 시스템에서는 `mmap()` 시스템 호출이 요구 페이징 방식으로 구현되어 있다. OS는 실행 파일을 매핑하지만, 파일 내용을 실제로 물리 메모리에 로드하지는 않는다. 읽기 전용이고 공유 가능한 매핑의 경우, 물리 메모리에 남아있는 내용을 그대로 사용하여 실행하기도 하는데, 이를 페이지 캐시라고 부른다.
예측 페이징 (Anticipatory Paging) 은 일부 시스템에서 요구 페이징과 함께 사용되는 기법으로, 가까운 미래에 필요할 가능성이 있는 페이지를 추측하여 미리 RAM에 로드하는 방식이다. 예를 들어, 간단한 예측 페이징 알고리즘은 아직 필요하지 않더라도 다음 몇 개의 연속된 페이지를 가져오는 방식으로 동작한다(참조 지역성 활용). 스왑 프리페치(Swap Prefetch)는 충분한 여유 페이지가 있는 경우 최근에 스왑 아웃된 페이지를 미리 가져오는 방식이다.[8]
8. 1. 요구 페이징 (Demand Paging)
프로세스가 실행을 시작할 때 물리 메모리는 할당되지 않으며, 프로세스의 워킹 세트 대부분이 물리 메모리에 배치될 때까지 페이지 폴트가 계속 발생한다. 즉, 액세스하려는 시점에 물리 메모리에 페이지를 할당하는 방식을 요구 페이징(Demand Paging)이라고 부른다. 이는 지연 로드 기법의 한 예이다.요구 페이징의 장점은 다음과 같다.
- 액세스되지 않은 페이지는 로드되지 않아 메모리 사용량이 절약되고, 멀티 프로그래밍(멀티태스킹)의 정도를 향상시킨다.
- 프로그램 실행 시작 전 로드로 인한 지연이 없다.
- 페이지 읽기가 최소화되어 디스크 부하가 적다.
- 페이지는 업데이트될 때까지 여러 프로그램에서 공유되며, 카피 온 라이트를 통해 더욱 리소스를 절약할 수 있다.
- 실제 메모리 용량보다 더 큰 프로그램을 실행할 수 있다. 이는 오버레이라는 오래된 기술보다 뛰어나다.
- 원래의 페이징 방식이 필요로 하는 이상의 하드웨어 기기를 필요로 하지 않는다.
요구 페이징의 단점은 다음과 같다.
- 프로그램이 임의의 가상 페이지에 처음 액세스할 때 지연이 발생한다. 이를 해결하기 위해 프리페이징(Prefetching)이라는 기법을 사용하기도 한다. 프리페이징은 이전에 동작했을 때 사용했던 페이지를 기억해두고, 스케줄링에 의해 실행될 때 해당 페이지들을 미리 물리 메모리에 로드하여 성능 향상을 꾀하는 기법이다. 특별히 액세스했던 페이지를 기억해두지 않더라도, 프로그램 카운터와 스택 포인터가 가리키는 가상 페이지라도 미리 로드해두면 어느 정도의 성능 향상은 기대할 수 있다.
- 페이지 교체 알고리즘과 관련된 메모리 관리가 복잡해진다.
리눅스와 같은 유닉스 계열 시스템에서는, `mmap()` 시스템 호출도 요구 페이징에 의해 구현되어 있다. 이는 새로운 프로그램을 실행할 때에도 적용된다. OS는 실행 파일 (과 이에 종속된 라이브러리)을 매핑하지만, 이때 파일의 내용을 물리 메모리에 실제로 로드하지 않는다. 매핑이 읽기 전용이고 공유 가능하면, 물리 메모리에 남아있는 내용을 그대로 사용하여 실행하기도 한다. 이를 페이지 캐시라고 부른다.
사용되지 않는 물리 페이지에는, 스왑 영역 이외의 파일에 대응하는 페이지 캐시와 아무런 대응이 없는 완전한 미사용 페이지가 있다. 일반적으로 페이징 방식에서는, 새롭게 필요하게 된 페이지가 페이지 캐시에 있으면 이를 재사용하고, 없으면 완전히 미사용 페이지를 사용한다. 사용이 끝난 페이지는, 그 내용이 스왑 영역 이외에 대응하고 있으면 페이지 캐시로 내용이 그대로 유지되고, 스왑 영역에 대응했던 익명(Anonymous) 페이지는 완전한 미사용 페이지로 되돌려진다. 물론, 완전한 미사용 페이지를 다 사용한 후에 더 메모리를 사용해야 할 때에는 페이지 캐시가 다른 용도로 이용된다. 이와 같이 현재 사용 중이 아닌 물리 메모리를 유효 활용하여 가능한 한 디스크 접근을 줄이도록 고안하고 있다. 덧붙여, 페이지 캐시로 존재하는 영역을 `mmap()`으로 매핑하면 페이지 캐시가 그대로 사용되지만, `read()` 시스템 호출로 읽는 경우에는 사용자 버퍼로의 복사가 발생한다.
스왑 프리페치라고도 불리는 기술은 (참조 지역성을 이용하여) 가까운 미래에 참조될 것으로 예측되는 페이지를 미리 로드해 둔다. 프로세스가 경험하는 페이지 폴트 횟수를 줄이려는 시도이다. 예를 들어, 어떤 참조에서 페이지 폴트가 발생했을 때, 연속된 몇 페이지도 곧바로 참조할 것이라고 예측하고 함께 로드해 두는 전략이 있다. 또한, 어떤 큰 프로그램이 종료되어 많은 메모리를 해제했을 때, 페이지 아웃되어 있던 다른 프로그램이 메모리를 필요로 할 것이라고 예측하여 미리 페이지 인 해두는 전략도 있다.
8. 2. 예측 페이징 (Anticipatory Paging)
일부 시스템에서는 요구 페이징과 함께 예측 페이징을 사용하여 지연 시간을 줄이려고 시도한다. 예측 페이징은 가까운 미래에 필요할 가능성이 있는 페이지를 추측하여 해당 페이지가 요청되기 전에 미리 RAM에 로드하는 방식이다.페이지 부재가 발생하면 예측 페이징 시스템은 참조된 페이지뿐만 아니라 곧 참조될 가능성이 있는 다른 페이지도 가져온다. 간단한 예측 페이징 알고리즘은, 예를 들어, 아직 필요하지 않더라도 다음 몇 개의 연속된 페이지를 가져오는 방식으로 동작한다(참조 지역성 활용). 이는 CPU의 사전 인출 입력 큐와 유사하다. 스왑 프리페치(Swap Prefetch)는 충분한 여유 페이지가 있는 경우 최근에 스왑 아웃된 페이지를 미리 가져오는 방식이다.[8]
이러한 예측 페이징은 참조 지역성을 이용하여 가까운 미래에 참조될 것으로 예측되는 페이지를 미리 로드해 둠으로써 프로세스가 경험하는 페이지 폴트 횟수를 줄이는 것을 목표로 한다. 예를 들어, 특정 참조에서 페이지 폴트가 발생했을 때, 연속된 몇 페이지도 곧바로 참조할 것이라고 예측하고 함께 로드하는 전략을 사용하거나, 큰 프로그램이 종료되어 많은 메모리가 해제되었을 때 페이지 아웃되었던 다른 프로그램이 메모리를 필요로 할 것이라고 예측하여 미리 페이지 인을 수행하는 전략을 사용할 수 있다.
9. 페이지 공유
다중 프로그래밍 또는 다중 사용자 환경에서, 여러 사용자가 동일한 프로그램(코드와 데이터가 별도의 페이지에 있도록 작성된)을 실행할 수 있다. 이때 RAM 사용을 최소화하기 위해 모든 사용자는 프로그램의 단일 사본을 공유한다. 각 프로세스의 페이지 테이블은 코드를 주소 지정하는 페이지가 단일 공유 사본을 가리키도록 설정되며, 데이터를 주소 지정하는 페이지는 각 프로세스에 대해 다른 물리적 페이지를 가리키도록 설정된다.
다른 프로그램도 동일한 라이브러리를 사용할 수 있다. 공간을 절약하기 위해 공유 라이브러리의 단일 사본만 물리적 메모리에 로드된다. 동일한 라이브러리를 사용하는 프로그램은 동일한 페이지(라이브러리의 코드와 데이터를 포함)에 매핑되는 가상 주소를 갖는다. 프로그램이 라이브러리의 코드를 수정하려는 경우에는 카피 온 라이트를 사용하여 필요할 때만 메모리가 할당된다.
공유 메모리는 프로그램 간의 효율적인 통신 수단이기도 하다. 프로그램은 메모리의 페이지를 공유한 다음 데이터를 교환하기 위해 쓰고 읽을 수 있다.
멀티태스킹 또는 멀티유저 환경에서는 여러 사용자가 동일한 프로그램을 실행하는 경우가 많은데, 각 사용자별로 프로그램의 사본을 생성하는 것은 메모리 낭비로 이어진다. 이를 해결하기 위해 해당 페이지들을 프로세스 간에 공유할 수 있다.[1]
페이지를 공유하는 경우, 한 프로세스가 데이터를 갱신했을 때 다른 프로그램이 갱신된 데이터에 접근하지 않도록 주의해야 하는데, 이를 카피 온 라이트라고 한다.[1]
10. 스레싱 (Thrashing)
스레싱은 대규모 데이터 구조로 작업하는 프로그램에서 주로 발생하며, 이로 인해 지속적인 페이지 폴트가 발생하여 시스템 성능이 크게 저하되는 현상이다. 가상 메모리 시스템에서 작업 집합(자주 액세스되는 페이지)이 커져 페이지 폴트 해결 시간이 프로그램 실행 시간을 압도할 때 스레싱이 발생한다.
최악의 경우, VAX 프로세서에서처럼 단일 명령이 여러 페이지를 참조하여 RAM에 없는 경우 각 페이지마다 페이지 폴트가 발생할 수 있다. 운영 체제는 메모리 관리 루틴을 통해 페이지를 디스크에 쓰고 읽는 입출력(I/O)을 처리해야 한다. 프로그램에 충분한 페이지가 할당되지 않으면 페이지 폴트 해결 과정에서 필요한 페이지가 버려져 명령 재시작 시 다시 폴트가 발생할 수 있다.
스레싱을 해결하기 위해 동시에 실행하는 프로그램 수를 줄이거나 컴퓨터의 RAM 양을 늘려 프로그램당 사용 가능한 페이지 수를 늘릴 수 있다.
스레싱의 특징은 워킹 세트가 커져도 특정 임계점까지는 페이지 폴트 횟수가 크게 증가하지 않지만, 임계점을 넘으면 페이지 폴트가 급증하여 시스템 성능이 저하된다는 것이다. 예를 들어, IBM의 System/360 Model 67과 System/370에서 데이터 전송 명령이 여러 페이지 경계를 넘을 경우 최대 8회의 페이지 폴트가 연속 발생하여 스레싱이 발생할 수 있다.[1]
11. 페이지 크기
페이지의 크기는 하드웨어에 의해 정의된다. 대개 컴퓨터 구조에 따라 512바이트에서 16MB 사이이며 2의 제곱으로 증가한다.[1] x86과 amd64에서는 한 페이지가 4KB, ia64에서는 8KB의 크기를 가진다.[3]
페이지 방식 구현 코드는 상대적으로 복잡하다. 가상 메모리에서는 다수의 페이지에 대해 스케일 아웃하는 구현이 요구된다.[4] 하드웨어 측면에서는 일반적인 크기보다 큰 페이지를 지원함으로써 페이지 수 자체를 줄이는 방법도 있다. 이 경우, 단순히 페이지 크기를 크게 하면 하위 호환성이 상실되거나 메모리 단편화 문제가 심각해지기 때문에, 일반적으로 페이지 크기를 가변으로 한다.[4]
몇몇 MMU 설계에서는 최소 페이지 크기의 배수(대부분 2의 거듭제곱 배) 크기의 페이지를 지원한다. OS의 메모리 관리에 가변 페이지 크기를 지원하게 되면, 단편화 등의 문제로 설계가 복잡해지기 때문에 지원되지 않는 경우가 있지만(이 지원을 '''슈퍼 페이지'''라고 한다), 그 경우에도 OS 자체를 거대한 페이지에 배치함으로써 실행 효율을 높일 수 있으므로, 그러한 설계가 되어 있는 경우가 많다.[14]
12. 성능
가상 메모리 운영 체제의 백킹 저장소(보조 기억 장치)는 일반적으로 RAM보다 수 차수만큼 느리다. 기계식 저장 장치를 사용하면 지연 시간이 발생하며, 하드 디스크의 경우 수 밀리초의 지연이 발생한다. 따라서 실용적인 경우 스와핑(페이지 아웃)을 줄이거나 제거하는 것이 바람직하다. 일부 운영 체제는 커널의 결정에 영향을 미치는 설정을 제공한다.
- 리눅스는 런타임 메모리를 스와핑하는 것과 시스템 페이지 캐시에서 페이지를 삭제하는 것 사이의 균형을 변경하는 `/proc/sys/vm/swappiness` 매개변수를 제공한다. 값을 크게 설정할수록 적극적으로 페이지 아웃(빈 페이지 프레임을 생성)을 수행한다.
- Windows 2000, XP 및 Vista는 커널 모드 코드 및 데이터를 페이징 아웃할 수 있는지 여부를 제어하는 `DisablePagingExecutive` 레지스트리 설정을 제공한다.
- 메인프레임 컴퓨터는 탐색 시간을 없애기 위해 헤드-트랙 디스크 드라이브 또는 드럼을 페이지 및 스왑 저장소로 자주 사용했으며, 회전 지연 시간을 줄이기 위해 동일한 장치에 대한 여러 동시 요청을 처리하는 여러 기술[32]을 사용했다.
- 플래시 메모리는 지울 수 있는 횟수가 제한되어 있으며(플래시 메모리의 제한 사항 참조), 한 번에 지울 수 있는 최소 데이터 양이 매우 클 수 있다(Intel X25-M SSD의 경우 128KiB[33]). 페이지 크기와 일치하는 경우는 거의 없다. 따라서 플래시 메모리는 메모리 조건이 타이트한 경우 스왑 공간으로 사용하면 빨리 마모될 수 있다. 장점으로는, 플래시 메모리는 하드 디스크에 비해 사실상 지연이 없고 RAM 칩처럼 휘발성이 아니라는 점이다. ReadyBoost 및 Intel Turbo Memory와 같은 방식은 이러한 특성을 활용하기 위해 만들어졌다.
많은 유닉스 계열 운영 체제(예: AIX, 리눅스, 솔라리스)는 성능을 향상시키기 위해 여러 저장 장치를 병렬로 스왑 공간으로 사용할 수 있다.
13. 구현
동적 메모리 할당과 비교했을 때, 페이징 방식은 프로그램에 할당하는 메모리가 연속적일 필요가 없고, 큰 단편화(외부 단편화)가 거의 발생하지 않아 메모리 낭비를 줄일 수 있다.[35]
프로그램은 특정 시점에 코드와 데이터를 모두 사용하지 않는 경향(참조 지역성)이 있으므로, 페이징은 필요에 따라 페이지를 디스크에 쓰거나 읽어 들여 가상 메모리를 구현하는 데 효과적이다. 이는 페이징이 다른 메모리 할당 기법보다 우수한 점으로 꼽힌다.[35]
13. 1. 윈도우
마이크로소프트 윈도우는 `pagefile.sys` 파일을 사용하여 페이징을 구현한다. 이 파일은 기본적으로 윈도우가 설치된 파티션의 루트 디렉터리에 위치하며, 시스템 설정에 따라 자동으로 크기가 조절되거나 사용자가 직접 설정할 수 있다.[14]페이지 파일의 크기는 일반적으로 실제 메모리 크기의 1.5배로 시작하여 최대 3배까지 확장될 수 있다. 사용자는 제어판의 시스템 설정에서 가상 메모리 설정을 변경하여 페이지 파일 크기를 수동으로 조절할 수 있다. 특히 물리적 메모리가 적은 시스템에서 메모리 사용량이 많은 응용 프로그램을 실행하는 경우, 페이지 파일 크기를 기본값보다 크게 설정하는 것이 성능 향상에 도움이 될 수 있다.[14]
윈도우는 사용 가능한 모든 드라이브의 여유 공간을 페이지 파일에 사용하도록 구성할 수 있다. 그러나 시스템이 블루 스크린 발생 후 커널 또는 전체 메모리 덤프를 작성하도록 구성된 경우에는 부팅 파티션(윈도우 디렉터리를 포함하는 드라이브)에 페이지 파일이 있어야 한다. 이는 윈도우가 페이지 파일을 메모리 덤프를 위한 임시 저장소로 사용하기 때문이다. 시스템 재부팅 시 윈도우는 페이지 파일에서 메모리 덤프를 별도의 파일로 복사하고, 페이지 파일에서 사용되었던 공간을 해제한다.[14]
페이지 파일은 필요에 따라 초기 할당 범위를 넘어 확장될 수 있는데, 이러한 확장이 점진적으로 이루어지는 경우 심각한 파일 시스템 조각화가 발생할 수 있으며, 이는 잠재적으로 성능 문제를 야기할 수 있다.[15] 이를 방지하기 위해 일반적으로 단일의 "고정된" 페이지 파일 크기를 설정하여 윈도우가 페이지 파일을 확장하지 못하도록 하는 것이 권장된다. 그러나 페이지 파일은 채워져야만 확장되는데, 기본 구성에서는 물리적 메모리 총량의 150%에 달한다.[16] 따라서 페이지 파일에 의해 지원되는 가상 메모리에 대한 총 수요가 컴퓨터의 물리적 메모리의 250%를 초과해야 페이지 파일이 확장된다.
고정된 페이지 파일 크기를 설정하는 것은 윈도우 응용 프로그램이 물리적 메모리 총량과 페이지 파일의 크기를 합한 것보다 더 많은 메모리를 요청하는 경우 문제가 될 수 있으며, 메모리 할당 요청이 실패하여 응용 프로그램 및 시스템 프로세스가 실패할 수 있다. 또한 페이지 파일은 순차적인 순서로 읽거나 쓰는 경우가 드물기 때문에, 완전히 순차적인 페이지 파일을 갖는 것의 성능 이점은 미미하다. 그러나 큰 페이지 파일은 일반적으로 더 많은 디스크 공간을 사용한다는 점 외에는 다른 불이익 없이 메모리 사용량이 많은 응용 프로그램의 사용을 허용한다. 조각화된 페이지 파일 자체는 문제가 되지 않을 수 있지만, 가변 크기의 페이지 파일의 조각화는 시간이 지남에 따라 드라이브에 여러 개의 조각화된 블록을 생성하여 다른 파일들이 조각화되도록 한다. 이러한 이유로, 할당된 크기가 모든 응용 프로그램의 요구를 충족할 만큼 충분히 크다는 전제하에, 고정 크기의 연속적인 페이지 파일이 더 좋다.
최신 사양의 시스템에서는 필요한 디스크 공간을 쉽게 할당할 수 있다(예: 3GB의 메모리를 가진 시스템이 750GB 디스크 드라이브에 6GB 고정 크기 페이지 파일을 가지거나, 6GB의 메모리와 16GB 고정 크기 페이지 파일 및 2TB의 디스크 공간을 가진 시스템). 두 예시 모두에서 시스템은 페이지 파일을 최대 확장 상태로 미리 설정하여 디스크 공간의 약 0.8%를 사용한다.
13. 2. 리눅스
리눅스 커널은 여러 스왑 백엔드(장치 또는 파일)를 지원하며, 백엔드 우선순위 할당도 지원한다. 커널이 실제 메모리에서 페이지를 스왑할 때 사용 가능한 여유 공간이 있는 가장 높은 우선순위의 백엔드를 사용한다. 여러 스왑 백엔드에 동일한 우선순위가 할당된 경우, 라운드 로빈 방식으로 사용되어 (이는 RAID 0 스토리지 레이아웃과 다소 유사) 기본 장치에 병렬로 효율적으로 접근할 수 있어 성능을 향상시킨다.[19]리눅스에서는 `/proc/sys/vm/swappiness`라는 파라미터가 있으며, 값을 크게 설정할수록 적극적으로 페이지 아웃(빈 페이지 프레임을 생성)을 수행한다.
Unix 계열 OS 대부분(예: AIX, Linux, Solaris)은 여러 장치를 병렬로 스왑 공간으로 사용할 수 있으며, 성능을 향상시킬 수 있다.
13. 3. macOS
macOS는 여러 개의 스왑 파일을 사용한다. 기본적으로 (애플에서 권장하는) 설치 시에는 루트 파티션에 배치되지만, 별도의 파티션이나 장치에 배치하는 것도 가능하다.[30]14. 페이지 컬러링
캐시 메모리에서의 스래싱을 방지하거나, 적극적으로 캐시 적중률을 향상시키려는 물리 페이지 관리 기법을 '''페이지 컬러링'''이라고 부른다. 페이지 컬러링은 가상 인덱스 캐시의 별칭 문제(동의어 문제)를 해결하는 데에도 사용된다.
캐시는 매년 거대해지고 있지만, 페이지 크기는 4KB가 일반적이며, 이는 페이징 방식이 일반화된 이후로 변하지 않았다. 물리 주소를 인덱스로 하는 캐시에서는 물리 페이지와 가상 페이지의 매핑에 따라 캐시 상에서 현재 사용 중인 페이지의 해당 위치가 충돌하여, 거대한 캐시를 제대로 활용하지 못하는 상황이 발생할 수 있다. 예를 들어, 캐시 크기가 16KB이고 페이지 크기가 4KB라면, 페이지는 해당 주소에 따라 캐시에서 4가지 종류의 위치에 대응할 수 있다. 이 경우, 페이지의 컬러(색상)가 4가지 존재한다고 말한다.
물리 인덱스 캐시에서는 동시에 접근하는 물리 페이지 그룹의 컬러가 서로 다르면 스래싱이 발생하지 않아 캐시 적중률이 향상된다. 페이지 컬러링 구현상의 문제는, 가상 페이지와 물리 페이지의 매핑은 한 번 이루어지면 변경되지 않으며, 매핑 시점에 어떤 메모리 접근 패턴이 될지를 예측할 수 없다는 점에 있다. 일반적으로는 가상 페이지의 컬러와 물리 페이지의 컬러가 일치하도록 매핑을 수행한다. 이렇게 함으로써 가상 공간상 연속된 영역에 대한 접근에서 스래싱이 발생하는 것을 방지한다.
그러나 이러한 구현을 한 경우 새로운 문제가 발생한다. 실행 파일의 텍스트와 데이터 영역은 가상 공간상 깔끔한 주소에 배치되는 경우가 많다. 그리고 그 주소는 캐시의 컬러로 말하면 같은 컬러가 된다. 따라서 페이지 컬러링을 하는 시스템에서는 컬러에 따라 물리 페이지의 사용률에 편향이 발생할 수 있다. 그러면 시스템 전체적으로 미사용 메모리가 충분함에도 불구하고, 특정 컬러의 빈 페이지가 없기 때문에 페이지 교체 알고리즘이 시작되어 성능 저하가 발생하는 문제가 발생한다. 이에 대처하는 방법은 다양하다.
가상 인덱스 캐시에서는 어떤 물리 페이지가 여러 프로세스에 공유될 때, 해당 매핑 대상의 가상 페이지의 컬러가 다르면 곤란한 상황이 된다. 같은 물리 페이지이면서 캐시 상의 여러 위치에 내용이 놓이게 된다. 이를 별칭 문제 또는 동의어 문제라고 부른다. 이 상태를 하드웨어가 감지하지 않고 방치하면, 한쪽 매핑을 통해 업데이트한 내용이 다른 쪽 매핑을 통해서는 관측할 수 없다는 상황이 발생한다. 물론 대부분의 시스템에서는 하드웨어가 자동으로 이 상태를 감지하고 대처하지만, 그 대처로 인한 성능 저하도 있다(캐시 미스 시 다른 컬러의 위치를 확인하여 별칭이 있으면 해당 캐시 라인을 모두 플러시하고 무효화한다). 한때의 시스템에서는 이 성능 저하가 무시할 수 없는 수준이었기 때문에, OS가 가능한 한 별칭 문제를 발생시키지 않도록 함으로써 성능 저하를 방지할 필요가 있었다. 그때 사용된 것이 페이지 컬러링이다. 참고로 R4000에서는 2차 캐시와 1차 캐시 사이의 모순 상태를 별칭 감지에 이용했기 때문에, 2차 캐시가 없는 시스템에서는 별칭 상태를 감지하는 것조차 할 수 없었다(감지한 경우에도 대처는 OS에 맡겨진다). 최근의 시스템에서는 캐시의 성능 향상으로 페널티가 무시할 수 있는 수준이 되었기 때문에, 별칭 문제에 대한 대책으로서 페이지 컬러링을 할 필요성은 작아지고 있다.
참조
[1]
웹사이트
Paging in Operating System
https://www.geeksfor[...]
2024-12-14
[2]
서적
Encyclopedia of computer science and technology
https://books.google[...]
CRC Press
[3]
서적
Memory Systems and Pipelined Processors
https://books.google[...]
Jones and Bartlett Publishers
[4]
서적
Encyclopedia of computer science and technology
https://books.google[...]
CRC Press
[5]
웹사이트
The Atlas Supervisor
http://www.chilton-c[...]
1962
[6]
간행물
Experience using a time sharing multiprogramming system with dynamic address relocation hardware
[7]
서적
Scientific Data Systems Reference Manual, SDS 940 Computer
http://bitsavers.org[...]
1966
[8]
웹사이트
Swap prefetching
https://lwn.net/Arti[...]
2005-09-27
[9]
서적
Information Processing 1962
Spartan
[10]
웹사이트
The Atlas
http://www.computer5[...]
Department of Computer Science
[11]
웹사이트
Atlas Architecture
http://www.chilton-c[...]
Atlas Computer Laboratory
[12]
서적
Computers - Key to Total Systems Control
Macmillan
1961-12
[13]
논문
One-Level Storage System
Institute of Radio Engineers
1962-04
[14]
웹사이트
Crash Dump Analysis
https://docs.microso[...]
Microsoft
2008-07-22
[15]
웹사이트
Windows Sysinternals PageDefrag
https://technet.micr[...]
Microsoft
2010-12-20
[16]
웹사이트
Page File Information
https://oingo.kpt.co[...]
2024-12-14
[17]
웹사이트
What Does Defragging Do?
https://www.hp.com/u[...]
Hewlett-Packard
2024-12-14
[18]
웹사이트
An introduction to swap space on Linux systems
https://opensource.c[...]
2021-12-08
[19]
웹사이트
swapon(2) – Linux man page
http://linux.die.net[...]
2014-09-08
[20]
웹사이트
'"Jesper Juhl": Re: How to send a break? - dump from frozen 64bit linux'
https://lkml.org/lkm[...]
LKML
2010-10-28
[21]
웹사이트
Andrew Morton: Re: Swap partition vs swap file
https://lkml.org/lkm[...]
LKML
2010-10-28
[22]
웹사이트
The Linux Kernel Documentation for /proc/sys/vm/
https://www.kernel.o[...]
[23]
웹사이트
Linux: Tuning Swappiness
http://kerneltrap.or[...]
2018-01-03
[24]
웹사이트
swap death (as in 2.1.91) and page tables
http://lkml.iu.edu/h[...]
1998-05-20
[25]
서적
DevOps Troubleshooting: Linux Server Best Practices
https://books.google[...]
Addison-Wesley
[26]
웹사이트
The Linux kernel: Memory
https://www.win.tue.[...]
[27]
웹사이트
Capacity Tuning
https://access.redha[...]
[28]
웹사이트
Memory overcommit settings
https://iainvlinux.w[...]
2014-02-16
[29]
웹사이트
swapping to death
http://tech-insider.[...]
1993-02-10
[30]
웹사이트
Mac OS X 10.1
https://arstechnica.[...]
Ars Technica
2008-07-23
[31]
웹사이트
Re: Swap issue also on Update 4 ?
http://forum.hyperio[...]
Hyperion Entertainment
2011-01-08
[32]
문서
E.g., Rotational Position Sensing on a Block Multiplexor channel
[33]
웹사이트
Aligning filesystems to an SSD's erase block size | Thoughts by Ted
http://thunk.org/tyt[...]
Thunk.org
2010-10-28
[34]
웹사이트
Magic-1 Minix Demand Paging Design
http://www.homebrewc[...]
2013-12-09
[35]
서적
Encyclopedia of computer science and technology
CRC Press
[36]
문서
Multiple Virtual Storage
[37]
서적
An Introduction to Operating Systems
Addison-Wesley
[38]
서적
Encyclopedia of computer science and technology
CRC Press
[39]
서적
Encyclopedia of computer science and technology
CRC Press
[40]
서적
Memory Systems and Pipelined Processors
https://books.google[...]
Jones and Bartlett Publishers
[41]
문서
例えば、ブロックマルチプレクサチャネルの Rotational Position Sensing
[42]
웹사이트
Aligning filesystems to an SSD’s erase block size
http://tytso.livejou[...]
2009-02-20
[43]
웹사이트
Magic-1 Minix Demand Paging Design
http://www.homebrewc[...]
[44]
매뉴얼
IBM System/370 Extended Architecture Principles of Operation
1987-01
[45]
인용
Operating Systems: Three Easy Pieces (Chapter: Paging)
http://pages.cs.wisc[...]
Arpaci-Dusseau Books
[46]
서적
An Introduction to Operating Systems
Addison-Wesley
[47]
서적
Encyclopedia of computer science and technology
https://books.google[...]
CRC Press
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com