내용 출처
KOCW 반효경 교수님 <운영체제> 강의
책 <운영체제와 정보기술의 원리>
반효경 교수님의 <운영체제> 강의 내용을 기반으로 정리했으며,
교수님의 저서 <운영체제와 정보기술의 원리>에서 추가할 만한 내용을 이와 같은 인용문 형식으로 추가함.
(이 챕터부터는 메모리 관리 기법 중 페이징 기법을 사용하는 것으로 가정한다.)
실제로 필요할 때 page를 메모리에 올리는 방식
Valid / Invalid bit의 사용
오른쪽 원통 : backing store
G, H는 사용되지 않는 페이지이므로, 페이지 테이블의 6, 7번은 invalid로 표시한다. 1, 3, 4번 페이지는 프로그램에 의해 사용되지만, 이 페이지들이 물리적 메모리에 올라와 있지 않고 swap area에 내려가 있으므로 invalid로 표시한다.
invalid page를 접근하면 MMU가 page fault trap을 발생시킨다.
커널 모드로 들어가서 page fault handler가 invoke된다.
다음의 순서로 Page Fault를 처리한다.
Page Fault Rate가 p일 때,
Effective Access Time = (1 - p) x memory access + p
Page Replacement
Replacement Algorithm
1) 쫓겨난 페이지에 대한
2) 테이블 엔트리의 bit를 invalid로 바꾸고
3) 메모리에 새로 올라온 페이지에 대해서는
4) 그 프레임 번호를 테이블 entry에 적어주고 bit를 valid로 바꿔준다.
Optimal : page fault를 가장 적게 만드는 알고리즘
가장 먼 미래에 참조되는 페이지를 replace한다.
Belady’s Optimal Algorithm, MIN, OPT 등으로 불린다.
빨간색 : page fault / 연보라색 : 메모리에서 직접 참조
하지만 실제로는 어떤 페이지가 언제 참조될 지를 미리 알 수 없다. 이 알고리즘은 이를 미리 알 수 있다는 가정에 기반한다. 그래서 실제 시스템에서 온라인으로 사용할 수는 없으므로 Offline algorithm이라고 한다. 다만 다른 알고리즘의 성능에 대한 upper bound를 제공하는 역할을 수행한다.
First In First Out : 메모리에 먼저 들어온 페이지를 먼저 쫓아낸다.
FIFO Anomaly (Beladys Anomaly)
페이지 프레임의 수를 늘려주었을 때 오히려 page fault가 증가하는 상황
Least Recently Used : 가장 오래 전에 참조된 페이지를 쫓아낸다.
시간지역성 (temporal locality)
최근에 참조된 페이지가 가까운 미래에 다시 참조될 가능성이 높은 성질
실제로 가장 많이 사용되는 알고리즘이다.
Least Frequently Used : 가장 덜 빈번하게 사용된 페이지를 쫓아낸다.
최저 참조 횟수 page가 여럿 있는 경우
장단점
페이지 참조 횟수를 계산하는 2가지 방식
1. Incache-LFU
- 페이지가 물리적 메모리에 올라온 후부터의 참조 횟수를 카운트하는 방식
- 페이지가 메모리에서 쫓겨났다가 다시 들어온 경우 참조 횟수는 1부터 다시 시작한다.
2. Perfect-LFU
- 메모리에 올라와 있는지의 여부와 상관없이 그 페이지의 과거 총 참조 횟수를 카운트하는 방식
- 페이지의 참조 횟수를 정확히 반영할 수 있지만, 메모리에서 쫓겨난 페이지의 참조 기록까지 보관해야 하므로 오버헤드가 크다.
LRU : 연결 리스트로 구현한다. 참조 시간 순서로 한 줄로 줄세운다. 아래로 갈수록 최근에 참조된 페이지다. 새로운 페이지를 참조할 경우 맨 아래로 보내면 되므로 시간복잡도는 O(1)이다.
LFU : 아래로 갈수록 가장 많이 참조된 페이지가 되도록 연결 리스트로 구현할 수 있다. 그런데 이 경우 새로운 페이지를 참조할 때, 페이지 참조 횟수를 일일이 비교해야 하므로, 시간복잡도는 O(n)가 된다. 그래서 보통 LFU 알고리즘은 힙으로 구현하며, 이때 시간복잡도는 O(log n)이 된다.
캐싱 기법
한정된 빠른 공간(캐쉬)에 요청된 데이터를 저장해 두었다가, 후속 요청시 캐쉬로부터 직접 서비스하는 방식
캐쉬 운영의 시간 제약
[paging system인 경우] 부분 설명
주소 변환 시 해당 페이지가 이미 물리적 메모리에 올라와 있는 경우, 직접 그 내용을 읽어서 CPU로 가져온다. 이러한 주소 변환에서 운영체제가 하는 역할은 없다.
반면 주소 변환 시 물리적 메모리에 해당 주소가 없는 경우, page fault가 발생한다. 이때는 디스크 접근을 필요로 하는데, 프로세스는 디스크에 직접 접근할 수 없다. 따라서 page fault trap이 발생하고, CPU 제어권이 운영체제로 넘어간다. 그러면 운영체제가 디스크에 있는 페이지를 읽어서 물리적 메모리에 올려놓고, 그 과정에서 필요시 이미 올려진 페이지 중 하나를 쫓아내야 한다.
결국 운영체제는 프로세스가 요청한 페이지가 메모리에 올라와 있지 않은 경우에만, 해당 페이지의 참조를 확인할 수 있다. 이미 메모리에 올라온 페이지가 다시 참조되는 경우에는 페이지가 참조되었다는 사실을 알 수 없다. 따라서 운영체제는 어떤 페이지가 가장 최근에 참조되었는지, 혹은 어떤 페이지의 참조 빈도가 높은지를 알 수 없다. 그래서 paging system에서는 LRU나 LFU 알고리즘을 사용할 수 없다. (단, 버퍼 캐싱이나 웹 캐싱에서는 사용 가능하다.)
그래서 사용되는 알고리즘이 바로 Clock Algorithm이다.
Clock algorithm
LRU의 근사 알고리즘
다른 명칭
운영체제는 가장 오래 전에 참조된 페이지를 알 수 없으므로, 대신 최근에 사용되지 않은 페이지를 쫓아낸다.
reference bit을 사용해서 교체 대상 페이지를 선정한다.
reference bit이 0인 것을 찾을 때까지 포인터를 하나씩 앞으로 이동한다.
포인터를 이동하는 중 reference bit 1은 모두 0으로 바꾼다.
reference bit이 0인 것을 찾으면 그 페이지를 교체한다.
reference bit이 0이라는 것은 시계 바늘이 한 바퀴 돌아오는 동안 그 페이지에 대한 참조가 없었다는 것을 의미한다.
reference bit이 1이라는 것은 시계 바늘이 한 바퀴 돌아오는 동안 그 페이지에 대한 참조가 적어도 한번은 있었다는 것을 의미한다.
페이지가 read가 아닌 write로 참조되는 경우, 하드웨어가 modified bit을 1로 세팅한다.
어떤 페이지를 쫓아낼 때 그 페이지의 modified bit이 0이라면, 그 페이지는 backing store에서 물리적 메모리로 올라온 이후로 write가 발생하지 않은 것이다. 그래서 이 경우 이미 같은 copy가 backing store에 있으므로 그냥 쫓아내기만 하면 된다.
반면 쫓아내고자 하는 페이지의 modified bit이 1이라면, 그 페이지는 물리적 메모리로 올라온 이후로 적어도 한 번은 CPU에서 write를 한 것이다. 이 페이지는 내용이 수정되었으므로, 쫓아낼 때 backing store에 수정된 내용을 반영한 후에 쫓아내야 한다.
Allocation Problem
Allocation의 필요성
Allocation Scheme
이는 프로세스별 프레임 할당량을 조절하는 또 다른 방법이 될 수 있다. 전체 시스템 차원에서 더 자주 참조되는 페이지가 메모리에 올라가기 때문에 프로세스의 프레임 할당량이 스스로 조절될 수 있는 것이다.
Thrashing (스레싱)
스레싱을 방지하기 위해서는, 동시에 메모리에 올라가 있는 프로세스의 개수를 조절해야 한다. 이를 가능하게 해주는 알고리즘이 Working-Set 알고리즘과 PFF 알고리즘이다.
Locality of reference (참조 지역성)
Working-Set Model
프로세스들의 working set size의 합이 페이지 프레임의 수보다 큰 경우
working set을 다 할당하고도 페이지 프레임이 남는 경우
Page-Fault Frequency
직접 현재 시점의 page fault를 계산하고, page-fault를 많이 일으키는 프로그램에 더 많은 페이지를 부여한다.