Swapping과 Swap Space
일반적으로 프로세스가 사용하는 자원은 RAM, 메인 메모리에 들어있다.
그러나 프로세스가 사용해야 할 모든 자원을 메인 메모리에 올리기에는 용량이 부족하다.
따라서 일부의 작업만 메인 메모리에 올리고 나머지는 다른 저장 공간에 저장한 뒤에 필요할 때 불러와 사용하게 된다.
이 과정을 Swapping이라 하며 메인 메모리에 올라가지 못한 자원이 저장되는 공간을 Swap Space라고 한다.
Memory Access Flow
자원에 접근하기 위해서는 가상 메모리 주소를 물리적 주소로 변환하는 다음과 같은 translation 과정이 필요하다.
1. 먼저 TLB를 확인한다.
-> TLB에 요청받은 주소가 있다면 물리적 주소를 반환받는다. (끝)
-> 요청받은 주소가 없다면 page table에서 해당하는 PTE를 찾는다.
2. 그 다음, 자원이 메인 메모리에 있는지 swap space에 있는지 확인하기 위해 PTE 안의 Present Bit를 확인하게 된다.
-> 해당 자원이 메인 메모리에 있다면 해당 PTE를 TLB에 추가하고 물리적 주소를 반환받는다. (끝)
-> 해당 자원이 swap space에 있다면 Page Fault를 발생시킨다.
3. Page Fault가 발생하면 해당 page를 메인 메모리로 올려놓아야 한다.
-> 메인 메모리에 빈 공간이 있다면 해당 page를 메모리에 올린다.
-> 메인 메모리가 가득 차 있다면 page를 쫓아내고 해당 page를 메모리에 올린다.
4. 해당 page를 메모리에 올렸다면 present bit를 바꾸고 PFN을 최신화 한 뒤 코드를 재실행한다.
Swap Daemon
메모리가 가득 차게 되면 page fault가 발생하므로 미리 사용하지 않는 page들을 쫓아내야 page fault를 줄일 수 있다.
이를 위해, 메모리의 빈 공간인 free space에 HW(High Watermark)와 LW(Low Watermark)를 지정한다.
빈 공간이 줄어들어 LW에 도달하게 되면 Swap Daemon이 page를 쫓아내고 빈 공간이 HW까지 늘어나면 멈추게 된다.
Swapping Policy
그렇다면 page를 쫓아낼 때 어떤 기준으로 page를 쫓아내야 가장 효율적으로 시스템을 동작시킬 수 있을까?
그리고 얼마나 효율적으로 동작하는지를 측정하기 위해 어떤 지표를 사용해야 할까?
먼저 효율성을 측정하기 위해 Average Memory Access Time (AMAT, 평균 메모리 접근 시간)을 사용하자.
AMAT는 (TLB Hit 확률 * 메모리 접근 시간) + (TLB Miss 확률 * 디스크 접근 시간) 으로 계산한다.
이제 어떤 기준으로 page를 쫓아낼 지 생각해보자.
사실 Optimal Policy, 최적의 방법은 이미 여러 방법으로 증명되어 있다.
가장 먼 미래에 사용될 page를 쫓아내는 것이다.
하지만 이 방법은 우리가 미래를 알 수 없기 때문에 실현 불가능한 방법이다.
그렇다면 이 방법을 사용했을 때의 AMAT를 기준으로 하여 다른 방법들이 어떤 성능을 보이는지 측정해보자.
1. FIFO, First In First Out
- 가장 먼저 들어온 page를 내쫓는다.
2. LRU, Least Recently Used
- 사용 빈도를 기록해 가장 적게 쓰인 page를 내쫓는다.
3. Random
- 무작위로 page를 내쫓는다.
TLB Hit Rate를 비교했을 때, LRU 방식이 가장 Optimal Policy에 근접한 성능을 냈고,
FIFO와 Random 방식은 서로 비슷했으며, 더 낮은 성능을 보임을 알 수 있다.
추가적으로 Clock Algorithm 방식도 알아보자.
Clock Algorithm은 use bit를 page가 접근될 때 1로 설정하여, 접근된 page와 접근되지 않은 page를 기록한다.
그 후 page들을 돌아가면서 use bit를 확인하여 1이면 0으로 바꾸고, 0이면 쫓아낸다.
따라서 최근에 접근된 page에게는 1번 쫓아내지 않을 기회를 주는 것이다.
성능을 측정해보면 Clock Algorithm은 FIFO와 Random 방식보다는 높고 LRU보다는 조금 낮은 성능을 보인다.
'Computer Science > Operating System' 카테고리의 다른 글
Lock의 개념과 구현 방법 (4) | 2019.09.05 |
---|---|
Thread와 Thread API (0) | 2019.09.04 |
Advanced Page Table (0) | 2019.04.23 |
Translation Lookaside Buffers - TLB란? (0) | 2019.04.23 |
Paging이란? (0) | 2019.04.23 |