출처 - https://github.com/jmxx219/CS-Study (opens in a new tab)
페이지 교체 알고리즘(Page Replacement Algorithm)
페이지 교체 알고리즘의 목표는
페이지 부재율을 최소화 하여 성능을 높이는 것
- 페이징 기법으로 메모리를 관리하는 운영체제에서 필요한 페이지가 메모리에 적재되지 않았을 경우(Page Fault (opens in a new tab)), 어떤 페이지 프레임을 선택하여 교체할 것인지 결정하는 방법
- 메모리가 꽉 차있으면 기존 페이지 중 하나를 물리 메모리에서 디스크의 스왑 영역으로 보내야 하는데, 이떄 기존 페이지들 중에서 어떤 것을 내려서 교체할 지 결정함
- 대상 페이지(victim page): 교체할 페이지
- 페이지 교체 알고리즘 종류
- 간단한 알고리즘
Random
: 무작위로 대상 페이지를 선정하여 페이지 교체FIFO
: 가장 먼저 들어와서 가장 오래 있었던 페이지 교체
- 이론적 알고리즘
OPT
: 앞으로 가장 오랫동안 사용되지 않을 페이지 교체
- 최적 근접 알고리즘
LRU
: 가장 오랫동안 사용되지 않은 페이지 교체LFU
: 참조 횟수가 가장 적은 페이지 교체NUR
: 최근에 사용하지 않은 페이지 교체- FIFO 변형:
SCR
과clock
알고리즘
- 간단한 알고리즘
- 페이지 교체 알고리즘의 성능 평가 기준
- 같은 메모리 접근 패턴을 사용하여 페이지 부재 횟수, 페이지 성공 횟수
◽ OPT(Optimal Replacement, 최적 교체)
- 개념
- 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체하는 방법
- 가장 이상적이고 효율적인 방법이지만 페이지의 참조 상황을 미리 예측해야 하기 떄문에 실현 가능성이 희박함
- 실현이 거의 불가능하기 때문에 실제로 사용하기 보다는 연구 목적을 위해 사용됨
- 특징
- 모든 페이지 교체 알고리즘 통틀어서 page fault 발생이 가장 적음
- Belady's Anomaly 현상이 발생하지 않음
- 최적 페이지 교체 알고리즘에 근접하는 방법이 개발됨(
최적 근접 알고리즘
)- 최적 페이지 교체 알고리즘은 미래의 데이터를 참고하기 때문에 구현이 불가능하지만,
최적 근접 알고리즘
은 과거의 데이터로부터 미래를 예측하기 때문에 최적 페이지 교체 알고리즘과 유사한 성능을 보임 - LRU(최근 최소 사용 알고리즘), LFU(최소 빈도 사용 알괴즘), NUR(최근 미사용 알고리즘) 등 존재
- 최적 페이지 교체 알고리즘은 미래의 데이터를 참고하기 때문에 구현이 불가능하지만,
◽ FIFO(First in First Out)
- 개념
- 가장 먼저 들어와서 가장 오래 있었던 페이지를 교체하는 방법
- 가장 구현이 간단한 방법이지만 성능은 좋지 않음
- 구현 방법
- 큐로 구현하여 메모리의 맨 위에 있는 페이지가 가장 오래된 페이지이고, 새로운 페이지는 항상 맨 아래에 삽입됨
- 메모리가 꽉 차면 맨 위의 페이지가 스왑 영역으로 보내짐
- 단점
- 무조건 오래된 페이지를 대상 페이지로 선정하기 때문에 성능이 떨어지는 문제점 존재
- 이를 개선한 것이
2차 기회 페이지 교체 알고리즘(SCR)
임
- 이를 개선한 것이
- Belady's Anomaly (opens in a new tab) 현상이 발생함
- Belady의 이상현상(
Belady's Anomaly
): 프레임의 개수가 많아져도 page fault가 줄어들지 않고 늘어나는 현상을 말함 - 직관적으로는 프레임의 개수가 많아지면 page fault가 줄어들어야 하지만 FIFO 알고리즘을 사용하면 그렇지 않을 수 있음
- 예시) 페이지 프레임의 개수에 따른 페이지 폴트 횟수 비교
- 페이지 프레임 개수가 4개일 때 더 많은 페이지 폴트가 증가하는 것을 볼 수 있음
페이지 프레임 3개 페이지 프레임 4개
- Belady의 이상현상(
- 무조건 오래된 페이지를 대상 페이지로 선정하기 때문에 성능이 떨어지는 문제점 존재
◽ LRU(Least Recently Used)
- 개념
- 최근에 가장 오랫동안 사용하지 않은 페이지를 교체하는 방법
- 가장 많은 운영체제가 채택하는 알고리즘으로, 간단하면서 효율적인 알고리즘
- 구현 방법 종류
- 카운터로 구현
- 카운터로 각 페이지마다 사용된 시간을 저장하고, 가장 오랫동안 참조되지 않은 데이터를 제거함
- 카운터는 각 페이지 별로 존재하는 논리적인 시계로, 카운터가 가장 작은 것이 가장 오래 전에 참조되었음을 의미함
- 가장 작은 카운터를 찾기 위한 시간과 페이지 테이블이 변경될 때마다 시간 값을 관리해야 하기 때문에 오버헤드가 발생함
- 카운터로 각 페이지마다 사용된 시간을 저장하고, 가장 오랫동안 참조되지 않은 데이터를 제거함
- 스택으로 구현
- 참조된 순서만 기억하며 페이지 번호가 기록됨
- 페이지가 참조되면 해당 페이지 번호를 삭제하고 다시 삽입하여 스택의 가장 위로 올림
- 스택의 top은 항상 최근에 사용된 페이지들이 있고, 스택의 bottom에 가장 오랫동안 참조되지 않은 페이지가 존재하게 됨
- 대상 페이지를 bottom에서 바로 찾을 수 있어 찾는 시간이 필요없고, 대신 참조할 때마다 스택의 위치 이동이 일어나기 떄문에 오버헤드가 발생함
- 카운터로 구현
- 특징
- 시간 지역성 성질을 고려한 방법
- 페이지가 언제 사용되었는지에 대한 시간 정보가 필요함
- FIFO 알고리즘보다 성능이 우수하지만, OPT 알고리즘보다 성능이 떨어짐
- Belady's Anomaly 현상이 발생하지 않음
- LFU, NUR보다 비교적 구현이 쉽고 오버헤드가 적음
- 단점
- 프로세스가 주기억장치에 접근할 때마다 참조되 페이지 시간을 기록해야하기 때문에 막대한 오버헤드가 발생함
- 카운터나 스택, 큐와 같은 별도의 하드웨어 지원이 반드시 필요함
LRU에 근사한 알고리즘(LRU approximation algorithm)
LRU 구현에는 하드웨어의 지원이 있어야 하지만, 지원이 어려운 경우가 존재함
이때 하드웨어 대신참조 비트(Reference bit)
를 사용하여 LRU에 근사하는 여러 알고리즘이 사용됨
-
Reference bit Algorithm(참조 비트 알고리즘)
- 참조 비트: 0으로 초기화 되고, 페이지가 참조되면 1로 바꾸어 저장되는 비트로 주기적으로 초기화됨
- 참조 비트는 어떤 페이지가 특정 시점까지 사용되었는지, 사용되지 않았는지 알 수 있음
- 하지만 페이지의 사용 순서까지는 모름
-
Additional-Reference Bits Algorithm(부가적 참조 비트 알고리즘)
- 참조 비트 쉬프트 방식(reference bit shift)으로, 각 페이지 별로 8비트의 참조 비트를 만들어 사용함
- 일정 시간 간격으로 기록함으로써 페이지 참조 순서에 대한 추가적인 정보를 얻을 수 있음(누가 먼저 사용되었는지 판별할 수 있음)
- 일정한 시간 간격마다 모든 페이지의 참조 비트를 오른쪽으로 shift 연산을 수행하고, 도중에 참조를 하면 1로 set 함
- 8비트의 참조 비트 기록을 정수로 변환했을 때, 가장 낮은 정수값을 가지는 페이지가 가장 오랫동안 참조되지 않은 페이지가 됨
- 참조 비트를 유지하기 위한 메모리가 추가로 필요하기 때문에 낭비되는 공간이 많아짐
-
Second-Chance Algorithm (2차 기회 알고리즘)
- FIFO 기반으로, 한 번의 기회를 더 주는 알고리즘
- 페이지가 선택될 때마다 참조 비트를 확인하여 참조 비트가 0이면 바로 교체하고, 1이면 한 번 더 기회를 주고 다음 페이지를 선택하는 알고리즘
◽ LFU(Least Frequently Used)
- 개념
- 참조 횟수가 가장 적은 페이지를 교체하는 방법
- 만약 대상 페이지가 여러 개인 경우, LRU 알고리즘에 따라 페이지를 교체함
- 페이지가 몇 번 사용되었는지를 기준으로 대상 페이지를 선정함
- 참조 횟수가 가장 적은 페이지를 교체하는 방법
- 특징
- LRU는 직전 참조된 시점만 반영하지만, LFU는 참조 횟수를 통해 장기적 시간 규모에서의 참조 성향을 고려할 수 있음
- LRU와 성능이 비슷하며, FIFO 보다 성능이 우수함
- 종류
- Incache-LFU: 메모리에 적재될 때부터 페이지의 횟수를 카운트 하는 방식
- Perfect-LFU: 메모리 적재 여부와 상관 없이 페이지의 과거 총 참조 횟수를 카운트 하는 방식
- 단점
- 낭비되는 메모리 공간이 많음
- 페이지 접근 빈도를 표시하기 위한 추가 공간 필요
- 초기에 한 페이지를 집중적으로 참조하다가 이후에 다시 참조하지 않는 경우 문제가 될 수 있음
- 앞으로 사용하지 않아도 초기에 사용된 참조 횟수가 높아서 메모리에 계속 남아있기 때문
- 낭비되는 메모리 공간이 많음
◽ NUR = NRU(Not Used Recently, Not Recently Used)
- 개념
- 최근에 사용하지 않은 페이지를 교체하는 방법
- LRU와 LFU의 불필요한 공간 낭비 문제를 해결한 알고리즘
- 구현 방법
- 최근 사용 여부를 확인하기 위해 각 페이지마다 두 개의 비트(참조 비트, 변형 비트)를 사용하여 미래를 추정함
- 참조 비트: 초기값이 0이며, 페이지에 접근(read/execute)하면 1이 됨
- 변형 비트: 초기값이 0이며, 페이지가 변경(write/append)하면 1이 됨
- 각 페이지의 상태
- Class 0 -
(0, 0)
: 모든 페이지의 초기 상태 - Class 1 -
(0, 1)
: 페이지에 쓰기 또는 추가와 같은 변경이 일어난 경우 - Class 2 -
(1, 0)
: 페이지에 읽기 또는 실행과 같은 접근이 발생한 경우 - Class 3 -
(1, 1)
: 접근과 변경 두 가지 연산이 모두 발생한 경우
- Class 0 -
- NUR에서는 대상 페이지를 선정할 때 페이지를 위와 같이 4가지의 클래스로 나누고, 가장 낮은 클래스의 랜덤한 페이지를 선택함
- 우선 고려 대상은 참조 비트임
- 모든 페이지의 비트가
(1, 1)
일 경우에는 어떤 페이지가 더 자주 사용되는지 알 수 없어 교체 알고리즘을 정상적으로 사용할 수 없음- 따라서 NRU에서 모든 페이지가
(1, 1)
이 되면 모든 페이지 비트를(0, 0)
으로 초기화 함(reset)
- 따라서 NRU에서 모든 페이지가
- 최근 사용 여부를 확인하기 위해 각 페이지마다 두 개의 비트(참조 비트, 변형 비트)를 사용하여 미래를 추정함
- 특징
- LRU와 LFU와 성능이 비슷하며, FIFO보다 성능이 우수함
- NUR은 2bit만 추가하여 다른 알고리즘과 유사한 성능을 낼 수 있음
- 쉽게 구현할 수 있음
- 단점
- 각 페이지의 참조를 유지 및 업데이트하고 비트를 수정하기 위해서는 추가적인 하드웨어 지원이나 소프트웨어 오버헤드가 필요함
- 이 때문에 실제로 LRU 알고리즘을 더 많이 사용함
- 각 페이지의 참조를 유지 및 업데이트하고 비트를 수정하기 위해서는 추가적인 하드웨어 지원이나 소프트웨어 오버헤드가 필요함
FIFO 변형 알고리즘(SCR, clock)
- FIFO 알고리즘을 기본으로 하되 페이지에 접근할 때마다 순서의 변화를 주어 성능을 향상한 알고리즘
- SCR Algorithm과 clock Algorithm 존재
◽ SCR(Second Chance Replacement, 2차 기회 페이지 교체)
-
개념
- FIFO 기법의 단점을 보완하는 기법으로, 가장 오랫동안 주기억장치에 있던 페이지 중 자주 사용되는 페이지의 교체를 방지하는 방법
- 한 페이지에 접근했을 때 page fault 없이 성공하면 해당 페이지를 큐의 맨 뒤로 이동하여 대상 페이지에서 제외시킴
- 즉, 성공할 기회를 한 번더 주는 알고리즘
-
구현 방법
- FIFO 알고리즘과 reference bit을 함께 사용함
- 페이지 교체 수행 중 참조 비트가 0일 경우에는 교체하고, 참조 비트가 1일 경우에는 참조 비트를 0으로 지정한 후 FIFO 리스트의 맨 마지막으로 피드백 시켜 다음 순서를 기다리게 함
- FIFO 순서대로 page를 검색함
- reference bit이 0이면 page를 교체함
- reference bit이 1이면 기회를 한번 더 줌
- reference bit을 0으로 clear함
- page를 큐의 뒤에 삽입하고 다음 page 검사로 옮김
- reference bit을 0으로 초기화하기 때문에 다음 검사 때는 교체의 대상이 될 수 있음
- FIFO 알고리즘과 reference bit을 함께 사용함
-
특징
- 큐의 맨 뒤로 옮기면 대상 페이지로 선정될 확률이 줄어드는 특징을 이용함
- LRU, LFU, NUR보다 성능이 약간 낮고, FIFO보다 성능이 약간 높음
-
단점
- 큐를 유지하는 비용이 높고, 페이지가 성공하면 큐의 중간에 있는 값을 뒤로 이동하는 작업이 추가됨
◽ clock 알고리즘
- 개념
- SCR을 원형 큐를 이용하여 구현한 알고리즘
- 한 바퀴를 도는 동안 사용되지 않은 페이지는 참조 되지 않았으므로 교체 대상 페이지로 선정하는 알고리즘
- 구현
- 각 페이지에 참조 비트를 사용해서 교체 대상을 선정함
- 초기값은 0이고, 페이지를 성공적으로 참조하면 0에서 1로 변경됨
- 대상 페이지를 가리키는 포인터를 사용하는데, 포인터가 큐의 맨 아래로 내려가면 시계처럼 다시 큐의 처음을 가리키게 됨
- 참조 비트가 0인 것을 찾을 떄까지 포인터를 이동시킴
- 참조 비트가 1인 경우, 0으로바 바꾼 후 건너뜀
- 참조 비트가 0인 경우 페이지를 교체함
- 각 페이지에 참조 비트를 사용해서 교체 대상을 선정함
- 특징
- LRU처럼 가장 최근에 참조되지 않은 페이지를 대상으로 선정한다는 점에서 LRU와 근사하지만, 교체 되는 페이지의 참조 시점이 가장 오래되었다는 것을 보장하지 않음
- LRU: 가장 오랫동안 사용되지 않은 페이지를 찾는데 효과적
- clock: 최근에 참조된 페이지를 보존하는데 효과적
- 참조 비트가 1인 페이지를 대상 페이지에 제외함으로써
SCR
처럼 기회를 한 번 더 제공함- 하지만 대상에서 제외되는 경우는 단 한 번뿐이고, 참조 비트가 1이면 다시 0으로 바꾸기 때문에 한 바퀴를 돌아 포인터가 오면 제외하지 않음
- NUR에 비해 각 페이지 당 참조 비트 하나만 추가하면 되기 때문에 추가 공간이 적게 듦
- LRU처럼 가장 최근에 참조되지 않은 페이지를 대상으로 선정한다는 점에서 LRU와 근사하지만, 교체 되는 페이지의 참조 시점이 가장 오래되었다는 것을 보장하지 않음
- 단점
- 알고리즘이 복잡하고 계산량이 많음