diff --git "a/\354\236\204\354\235\200\354\247\200.8\354\236\245-\352\260\200\354\203\201\353\251\224\353\252\250\353\246\254.10\354\233\224 24\354\235\274.md" "b/\354\236\204\354\235\200\354\247\200.8\354\236\245-\352\260\200\354\203\201\353\251\224\353\252\250\353\246\254.10\354\233\224 24\354\235\274.md" new file mode 100644 index 0000000..3767052 --- /dev/null +++ "b/\354\236\204\354\235\200\354\247\200.8\354\236\245-\352\260\200\354\203\201\353\251\224\353\252\250\353\246\254.10\354\233\224 24\354\235\274.md" @@ -0,0 +1,222 @@ +# 가상메모리 +: 프로그램이 물리적 메모리를 고려할 필요 없이 자시 자신만이 메모리를 사용하는 것처럼 가정해 프로그램을 지원하는 것. 즉 `가상메모리`는 프로세스마다 각각 0번지부터의 주소 공간을 가지게 되며, 이들 공간 중 일부는 물리적 메모리에 적재되고 일부는 디스크의 스왑 영역에 존재하게 된다. + +프로세스의 주소 공간을 메모리로 적재하는 단위에 따라 가상메모리 기법은 `요구 페이징` 방식, `요구 세그먼테이션` 방식으로 구현될 수 있다. +#### 요구 페이징 +- 대부분의 경우에는 요구 페이징 방식 사용 +- 세부적인 구현에서는 요구 페이징 기법만이 사용 +#### 요구 세그먼테이션 +- 대게 하나의 세그먼트를 여 러 개의 페이지로 나누어 관리하는 페이지드 세그먼테이션 기법을 사용하는 경우 + +## 1. 요구 페이징(demand paging) +: 프로그램 실행 시 당장 사용될 페이지만을 올리는 방식 +- 메모리 사용량이 감소하고, 프로레스 전체를 메모리에 올리는 데 소요되는 입출력 오버헤드도 줄어든다. +- 응답시간을 단축시킬 수 있으며, 시스템이 더 많은 프로세스를 수용할 수 있게 해준다. +- 프로그램을 구성하는 페이지 중 일부만을 메모리에 적재하게 되므로 물리적 메모리의 용량보다 큰 프로그램도 실행할 수 있다. +### Valid/Invalid bit 사용 +프로세스가 실행되기 전에는 모든 페이지는 invalid으로 초기화 되어 있다. +#### Valid bit +- 특정 페이지가 참조되어 메모리에 적재되는 경우 +#### Invalid bit +- 페이지가 현재 메모리에 없는 경우 +- 그 페이지가 속한 주소 영역을 프로세스가 사용하지 않는 경우 +![페이지 테이블에서 유효 무효 비트의 의미](https://velog.velcdn.com/images/zzallang/post/f027f420-75d3-4295-aa04-48c4e25438d9/image.jpg) + + +#### page fault +: address translation 시에 invalid bit가 set 되어 있는 것 + => CPU가 참조하려는 페이지가 현재 미모리에 올라와있지 않아 무효 비트가 무효로 세팅되어 있는 경우 + - page fault 발생 시 CPU는 자동적으로 운영체제에게 넘어가게 된다. + - `page trap`이 걸렸다고도 하며 일종의 소프트웨어의 인터럽트 + +### 1) Page fault +- CPU가 invalid page에 접근하면 MMU가 page fault trap을 발생시키게 된다. +- Kernel mode로 전한이 되고 `page fault hander`가 invoke 된다. + - page fault handler : page fault를 처리하는 코드 +#### page fault 처리 루틴 +1. 해당 페이지에 대한 접근이 적법한지 체크한다. +- 잘못된 주소, 접근 권한 위반(protection violation) + => abort process (프로세스 종료) +2. 물리적 메모리에서 free frame을 할당받아 그 공간에 페이지를 읽어 온다. +- 만약 empty free frame이라면 기존에 메모리에 올라와 있는 페이지 중 하나를 디스크로 쫓아낸다. (= swap out) +3. 해당 페이지를 디스크에서 메모리로 읽어 온다. +- Disk I/O가 끝날 때까지 이 프로세스는 CPU를 preempt(빼앗기고) block 상태(봉쇄 상태)가 된다. +- Disk I/O가 끝나면 page tales entry를 기록하고 valid/invalid bit는 valid로 설정한다. +- block 상태였던 프로세스를 ready queue로 이동시킨다. +4. 이 프로세스가 CPU를 할당받고 이전에 중단되었던 instruction부터 실행 재개 + +![페이지 부재를 처리하는 과정](https://velog.velcdn.com/images/zzallang/post/3ba54a75-b266-4fb4-a1ce-b9183f91241a/image.png) + +### 2) 요구 페이징의 기능 +: Page fault가 일어나면 디스크로부터 메모리로 읽어오는 막대한 오버헤드가 발생한다. 요구 페이징의 성능은 다음과 같이 `유효 접근시간`으로 측정한다. +- Effective Access Time (유효 접근시간) += (1 - p) x memory access + + p x (OS & HW page fault overhead + + [swap page out if needed] + + swap page in + + OS & HW restrat overhead) + - (1 - p) 는 page fault가 안나는 비율이며 안나는 만큼 메모리 접근 시간만 걸리게 된다. + - OS & HW page fault overhead : 페이지 부재 발생 처리 오버헤드 + - [swap page out if needed] : 메모리에 빈 프레임이 없는 경우 스왑 아웃 오버헤드 + - swap page in : 요청된 페이지의 스왑 인 오버헤드 + - OS & HW restrat overhead : 프로세스의 재시작 오버헤드 + +- Page Fault Rate 0 ≤ p ≤ 1.0 (페이지 부재 발생 비율) + - if p = 0 on page fault : 0이라면 page fault가 절대 발생되지 않고 메모리에서 다 참조되는 경우 + - if p = 1 : 매번 메모리를 참조할 때마다 page fault가 발생한다. + +실제로 page fault 비율은 0.0에 가깝게 나오게 되어 대부분의 경우는 page fault가 발생되지 않아 메모리로부터 직접 주소변환을 할 수 있다. +*** +## 2. 페이지 교체 +#### Page replacement +: Free frame이 없는 경우 메모리에 올라와 있는 페이지 중 하나를 디스크로 쫓아내 메모리에 빈 공간을 확보하는 작업 +- 어떤 frame을 빼앗아올지 결정해야 한다. +- 곧바로 사용되지 않을 page를 쫓아내는 것이 좋다 +- 동일한 페이지가 여러 번 메모리에서 쫓겨났다가 다시 들어올 수 있다. + +![페이지 교체의 예](https://velog.velcdn.com/images/zzallang/post/70fb2637-4172-4c33-8b5f-fe778bd7a3ff/image.png) + +#### Replacement Algorithm +: Page replacement시 어떤 frame을 쫓아낼 것인지 결정하는 알고리즘 +- page fault rate를 최소화하는 것이 목표 +- 알고리즘의 평가 + - 주어진 `page reference stirng`에 대해 page fault를 얼마나 내는지 계산한다. + - page reference stirng(페이지 참조열) : 시간 순서에 따라서 페이지들에게 서로 다른 순서를 붙여놓고 페이지들의 참조된 순서를 나열해 놓은 것 + - 해당 번호의 페이지가 이미 올라와 있으면 메모리에서 hit(적중)되었다 하고, 메모리에 없는 경우에는 page fault가 발생했다고 말한다. + +### 1) 최적 페이지 교체 +#### Optimal Algorithm(MIN,OPT,Belady's Optimal Algorithm) +: page fault rate를 최소화하기 위해 페이지 교체 시 물리적 메모리에 존재하는 페이지 중 가장 먼 미래에 참조될 페이지를 쫓아낼 수 있게 하는 것. + +![최적 페이지 교체 알고리즘을 사용한 페이지 교체](https://velog.velcdn.com/images/zzallang/post/ce81afe8-8437-4b66-a2d4-546fa5952b2d/image.png) +- 어떤 알고리즘을 쓰더라도 6 page faults 이하로 할 수 없다. + +- 미래의 참조를 어떻게 아는가? +: Offline algoritym + - 가장 먼 미래에 참조되는 페이지를 미리 다 안다고 **가정**하는 것, 실제 온라인에서 사용할 수는 없다. +- 실제 시스템에서 사용하는 다른 알고리즘의 성능에 대한 upper bound(상한선) 제공 + - 아무리 좋은 알고리즘을 만들어도 Optimal Algorithm보다 좋을 수 없다. +### 2) FIFO(First In First Out : 선입선출) Algorithm +: 페이지 교체 시 물리적 메모릴에 가장 먼저 올라온 페이지를 우선적으로 내쫓는다. +- FIFO anomaly(FIFO의 이상현상) : 메모리를 증가시켰음에도 불구하고 페이지 부재가 오히려 늘어나는 상황 +![FIFO 알고리즘에 의한 페이지 교체 1](https://velog.velcdn.com/images/zzallang/post/1d1f0498-2ff7-4faf-a4ad-08228e99c87f/image.png) +![FIFO 알고리즘에 의한 페이지 교체 2](https://velog.velcdn.com/images/zzallang/post/db1fc59d-e7ea-4e39-af29-d27af1765da2/image.png) +### 3) LRU (Least Recently Used) Algorithm +가장 오래 전에 참조된 것을 지운다. +![LRU 알고리즘에 의한 페이지 교체](https://velog.velcdn.com/images/zzallang/post/6d3ea171-4543-49f6-aa6c-53c19e73f292/image.png) +### 4) LFU (Least Frequently Used) Algoritym +: 과거의 regerence count(참조 횟수)가 가장 적은 페이지를 지운다. +- 최저 참조 횟수인 page가 여럿 있는 경우 + - LFU algorithm 자체에서는 여러 page 중 임의로 선정한다. + - 성능 향상을 위해 가장 오래 전에 참조된 page를 지우게 구현하는 것이 효율적이다. + +페이지의 참조 횟수를 계산하는 방식에 따라 두 가지로 나뉜다. +- Incache-LFU +: 페이지가 물리적 메모리에 올라온 후부터의 참조 횟수를 카운트 하는 방식 +: 페이지가 메모리에서 쫓겨났다가 다시 들어온 경우 참조 횟수는 리셋된다. +- Perfect-LFU +: 메모리에 올라와 있는지의 여부와 상관없이 그 페이지의 과거 총 참조 횟수를 카운트 한다. +#### 장단점 +- LRU처럼 직전 참조 시점만 보는 것이 아니라 장기적인 시간 규모를 보기 때문에 page의 인기도를 좀 더 정확히 반영할 수 있다. +- 이전 참조 기록까지 모두 보관하고 있어야 하므로 오버헤드가 상대적으로 더 크다. +- 참조 시점의 최근성을 반영하지 못한다. +- LRU보다 구현이 복잡하다. + +![LRU 알고리즘과 LFU 알고리즘의 비교](https://velog.velcdn.com/images/zzallang/post/8d92edc4-865b-43a7-a009-c4e391311c9f/image.png) + +### 5) Clock Algoritym +: 하드웨어적인 지원을 통해 이와 같은 알고리즘의 운영 오버헤드를 줄인 방식 +- LRU를 approximation(근사)시킨 알고리즘으로 NUR(Not Used Reccently) 또는 NRU(Not Reccently Used) 알고리즘 또는 Second chance 알고리즘으로도 불린다. +- LRU처럼 가장 최근에 참조되지 않은 페이지를 대상으로 선정한다는 점에서 LRU와 유사하지만 교체되는 페이지의 참조 시점이 가장 오래되었다는 것을 보장하지는 못한다. +- Reference bit를 사용해서 교체 대상 페이지를 선정한다. +- Reference bit가 0인 것을 찾을 때까지 포인터를 하나씩 앞으로 이동 +- 포인터를 이동하는 중에 reference bit 1은 모두 0으로 바꾼다. +- Reference bit가 0인 것을 찾으면 해당 페이지를 교체한다. +- 한 바퀴 되돌아 와서도(=second chance) 0이면 그때에는 replace 당한다. +- 자주 사용되는 페이지라면 second chance가 올 때 1이다. +![클럭 알고리즘](https://velog.velcdn.com/images/zzallang/post/b841cfa5-ad8a-4976-9c4b-7af0d7707dbe/image.png) + +#### Colck algorithm의 개선 +- reference bit과 modified bit(dirty bit)를 함께 사용한다. +- reference bit = 1 +: 최근에 참조된 페이지 +: modified bit = 0 +: 최근에 변경된 페이지 (I/O를 동반하는 페이지) +*** +## 3. 페이지 프레임의 할당 +: 프로세스가 여러 개가 동시에 수행되는 상황에서 각 프로세스에 얼마만큼의 메모리 공간을 할당할 것인인가? +#### Allocation의 필요성 +- 메모리 참조 명령어 수행시 명령어, 데이터 등 여러 페이지를 동시 참조할 수 있다. + - 명령어 수행을 위해 최소한의 할당되어야 하는 frame의 수가 있다. +- Loop를 구성하는 page들은 한꺼번에 allocate 되는 것이 유리하다. + - 최소한의 allocation이 없으면 매 loop 마다 fage fault가 발생하게 된다. +### Allocation Scheme +#### Equal Allocation(균등할당) +: 모든 프로세스에게 페이지 프레임을 균일하게 할당하는 방식 +#### Proportional Allocaiton(비례할당) +: 프로세스의 크기에 비례해 페이지 프레임을 할당하는 방식 +#### Priority Allocation(우선순위 할당) +: 프로세스의 우선순위에 따라 페이지 프레임을 다르게 할당하는 방식 +*** +## 4. 전역교체와 지역교체 +#### Global replacement(전역교체) +: 모든 페이지 프레임이 교체 대상이 될 수 있는 방법 +- Replace 시 다른 프로세스에 할당된 프레임을 빼앗아 올 수 있다. +- 프로세스별 할당량을 조절하는 또 다른 방법이 될 수 있다. +- FIFO,LRU,LFU 등의 알고리즘을 global replacement로 사용사에 해당한다. +- Working set, PFF 알고리즘을 사용한다. +#### Local replacement(지역교체) +: 현재 수행 중인 프로세스에세 할당된 프레임 내에서만 교체 대상을 선정할 수 있는 방법 +- 자신에게 할당된 프레임 내에서만 선정하기 되는 것이다. +- FIFO,LRU,LFU 등의 알고리즘을 프로세스별로 운영할 때 사용된다. +*** +## 5. 스레싱 +: 집중적으로 참조되는 페이지들의 집합을 메모리에 한꺼번에 적재하지 못하면 page fault rate가 크게 상승해 CPU utilization이 급격히 떨어지는 현상 +- 프로세스의 원활한 수행에 필요한 최소한의 page frame 수를 할당 받지 못한 경우에 발생된다. +- OS는 `MPD`를 높여야 한다고 판단하게 된다. + - MPD (Multiprograming degree) : 다중 프로그래밍의 정도 +- 그러면 또 다른 프로세스가 시스템에 추가된다. (higher MPD) +- 프로세스 당 할당된 프레임의 수가 더욱 감소된다. +- 프로세스는 페이지의 swap in/swap out를 지속적으로 발생시킨다. +- 대부분의 시간은 일을 하지 않게 된다. + +=Thrashing +![스레싱 다이어그램 ](https://velog.velcdn.com/images/zzallang/post/7440471d-3e75-4005-becb-cf6902199687/image.JPG) + +### 1) Woking-set Algorithm +#### Woking-Set Model +- Locality of reference + - 프로세스는 특정 시간동안 일정 장소만을 집중적으로 참조한다. + - 집중적으로 참조되는 해당 page들의 집합을 `locality set`이라고 한다. +- Woking-set Model + - Locality에 기반하여 프로세스가 일정 시간 동안 원활하게 수행되기 위해 한꺼번에 메모리에 올라와 있어야 하는 page들의 집합을 `Working Set`이라 정의한다. + - Working Set 모델에서는 프로세스의 working set 전체가 메모리에 올라와 있어야 수행되고 그렇지 않을 경우 모든 frame을 반납한 후 swap out 시킨다. + - Thrashing을 방지한다. + - MPD를 조절한다. +#### Working-set의 결정 +- Working-set window를 사용한다 +- window size가 Δ인 경우 + - 시각 t₁에서의 working set WS(t₁) + - Thime interval[t₁-Δ,t₁] 사이에 참조된 서로 다른 페이지들의 집합 + - Working set에 속한 페이지는 메모리에 유지하고 속하지 않은 것은 버린다. (즉, 참조된 후 Δ 시간 동안 해당 페이지를 메모리에 유지한 후 버린다.) + +![워킹셋 알고리즘의 예](https://velog.velcdn.com/images/zzallang/post/515523e2-415a-44f1-9032-313426c00222/image.png) +#### Working-Set Algorithm +- 프로세스들의 working set size의 합이 page frame의 수보다 큰 경우 + - 일부 프로세스를 swap out 시켜 남은 프로세스들의 working set을 우선적으로 충적시켜 준다. (MPD를 줄임) +-Working set을 다 할당하고도 page frame이 남는 경우 + - swap out 되었던 프로세스에세 working set을 할당 (MPD를 키움) +#### Window size Δ +- Working set을 제대로 탐지하기 위해서는 window size를 잘 결정해야 한다. +- Δ 값이 너무 작으면 locality set을 모두 수용하지 못할 우려가 있다. +- Δ 값이 너무 크면 여러 굼의 locality set을 수용할 수 있다. +- Δ 값이 ∞이면 전체 프로그램을 구성하는 page를 working set으로 간주한다. +### 2) Page Fault Frequency : PFF (페이지 부재 빈도 알고리즘) +#### PFF Scheme +- page fault rate의 upper bound(상한값)과 lower bound(하한값)을 둔다. + - page fault rate이 upper bound가 넘으면 frame을 더 할당한다. + - page fault rate이 lower bound가 이하이면 할당 frame 수를 줄인다. +- 빈 frame이 없으면 일부프로세스를 swap out 시켜 프로세스의 수를 조절한다. + +![페이지 부재 빈도 알고리즘](https://velog.velcdn.com/images/zzallang/post/15927aae-6186-4485-b683-1f73111c5cfb/image.png) + diff --git "a/\354\265\234\354\247\200\354\227\260.8\354\236\245-\352\260\200\354\203\201\353\251\224\353\252\250\353\246\254.10\354\233\224 24\354\235\274.md" "b/\354\265\234\354\247\200\354\227\260.8\354\236\245-\352\260\200\354\203\201\353\251\224\353\252\250\353\246\254.10\354\233\224 24\354\235\274.md" new file mode 100644 index 0000000..405c08e --- /dev/null +++ "b/\354\265\234\354\247\200\354\227\260.8\354\236\245-\352\260\200\354\203\201\353\251\224\353\252\250\353\246\254.10\354\233\224 24\354\235\274.md" @@ -0,0 +1,214 @@ +### Demand Paging : 요청이 있으면 -> page를 메모리에 올린다 +- 실제로 필요할 때 page를 메모리에 올리는 것 +\- I/O 양의 감소 (거의 사용되지 않는 방어적인 코드는 메모리에 올리지 않게됨) +\- Memory 사용량 감소 +\- 빠른 응답 시간 (system-wide 관점) +\- 더 많은 사용자 수용 (더 많은 프로그램이 동시에 메모리에 올라갈 수 있음) + +- Valid/Invalid bit의 사용 +\- Invalid의 의미 : `사용되지 않는 주소 영역인 경우` , `페이지가 물리적 메모리에 없는 경우` +\- 처음에는 모든 page entry가 invalid로 초기화 +\- address translation 시에 invalid bit이 set되어 있으면 => `page fault` 현상 발생 +![](https://velog.velcdn.com/images/ddongpuri/post/71066792-1a10-466f-ae16-0c9cc4d59c87/image.png) + + +### Page Fault +- invalid page를 접근하면 MMU가 `trap` 을 발생시킴 (page fault trap) +- kernel mode로 들어가서 page fault handler가 invoke됨 +- 다음과 같은 순서로 page fault를 처리한다. +1. Invalid reference? (eg. bad address, protection violation) => `abort process` +2. Get an empty page frame (if no empty page frame -> `replace`) +3. 해당 페이지를 disk에서 memory로 읽어온다. + 1) disk I/O가 끝나기까지 이 프로세스는 CPU를 preempt 당함 (block) + 2) Disk read가 끝나면 page tables entry 기록, valid/invalid bit = "valid" + 3) ready queue에 process를 insert -> dispatch later +4. 이 프로세스가 CPU를 잡고 다시 running +5. 아까 중단되었던 instruction을 재개 + +> **그림으로 살펴보자!![](https://velog.velcdn.com/images/ddongpuri/post/d5752478-a823-40ea-a13a-c291ce8e9a26/image.png)** +``` +1. 주소변환을 하려고 page table을 봤더니, invalid로 표시되어 있다. 즉, 해당 페이지가 메모리에 올라와있지 않음 +2. trap 발생하여 CPU가 운영체제에게 자동으로 넘어감 +3. 해당 page는 현재 backing store에 있음 +4. 운영체제가 해당 page를 물리적인 메모리로 올려놓음 +5. 물리적인 메모리의 frame number를 엔트리에 적어넣고, invalid -> valid로 바꿈 +6. 이후 CPU를 다시 얻어서 주소 변환을 하면 valid로 되어 있기 때문에 주소 변환이 정상적으로 이루어져 물리적인 메모리의 page frame에 접근할 수 있다. +``` + +page fault가 났을 때, 디스크에 접근하는 것은 오래 걸리는 작업이기 때문에 `page fault가 얼마나 나느냐` 에 따라서 메모리 접근 시간이 크게 달라진다. +> Page Fault Rate 0 ≤ p ≤ 1.0 +\- if p = 0 no page faults +\- if p = 1l, every reference is a fault + + +> **Effective Access Time** +``` += (1 - p) x memory access ++ p(OS & HW page fault over head // os로 CPU가 넘어가서 하드웨어적으로 page fault처리 + + [swap page out if needed] // 메모리에 빈 공간이 없으면 페이지 쫓아내야함 + + swap page in // 디스크에서 읽어온 페이지 올려놓기 + + OS & HW restart overhead) +``` + +#### Free frame이 없는 경우 +`Page replacement` +- 어떤 frame을 빼앗아올지 결정해야 함 +- 곧바로 사용되지 않을 page를 쫓아내느 것이 좋음 +- 동일한 페이지가 여러 번 메모리에서 쫓겨났다가 다시들어올 수 있음 + +`Replacement Algorithm` +- page-fault rate을 **최소화** 하는 것이 목표 +- 알고리즘의 평가 +\- 주어진 page reference string에 대해 page fault를 얼마나 내는지 조사 +\* reference string : page들이 참조된 순서대로 나열해 놓은 것 +- reference string의 예 +1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 + +#### Optimal Algorithm +(미래에 참조되는 page들을 미리 다 안다고 가정) +- Belady's optimal algorithm, MIN, OPT 등으로 불림 +- MIN(OPT) : 가장 먼 미래에 참조되는 page를 replace +\- 의미 : 실제 사용은 불가능하지만, 다른 알고리즘의 성능에 대한 `upper bound` 제공 + +#### FIFO(First In First Out) Algorithm +먼저 들어온 것을 먼저 내쫓음 +- FIFO Anomaly (Belady's Anomaly) +more frames =/=> less page faults (프레임 수의 증가가 page fault의 감소를 보장하지 않음) + +#### LRU(Least Recently Used) Algorithm +가장 오래 전에 참조된 것을 지움 +(= 최근에 참조된 page가 다시 참조되는 성향이 높다) + + +#### LFU(Least Frequently Used) Algorithm +LFU : 참조 횟수(reference count)가 가장 적은 페이지를 지움 +- 장점 : LRU처럼 직전 참조 시점만 보는 것이 아니라 장기적인 시간 규모를 보기 때문에 page의 인기도를 좀 더 정확히 반영할 수 있음 +- 단점 : 참조 시점의 최근성을 반영하지 못함. LRU보다 구현이 복잡함 + + +#### LRU와 LFU 알고리즘의 구현 +![](https://velog.velcdn.com/images/ddongpuri/post/58f4b3a8-d0d4-43e1-8858-bc292c7ea415/image.png) + +- LRU +메모리 안에 있는 페이지들을 참조 시간 순서에 따라서 줄 세움(LinkedList 형태) +O(1) complexity +- LFU +메모리 안에 있는 페이지들을 참조 횟수 순으로 줄 세움 +- LinkedList 형태로 구현한다면, LRU와 달리 특정 페이지의 참조 횟수가 바뀌었을 때 어느 위치에 줄 세울지 결정하기 위해 다른 페이지와의 1:1 비교 과정이 필요함 +O(n) complexity +- Heap으로 구현시, O(log n) complexity + +------ + +### 다양한 캐슁 환경 +`caching 기법` +- 한정된 빠른 공간(=캐쉬)에 요청된 데이터를 저장해 두었다가 후속 요청시 캐쉬로부터 직접 서비스하는 방식 +- paging system 외에도 cache memory, buffer caching, Web caching(동일한 url에 대해 다시 요청을 할 경우, 내 컴퓨터에 이미 읽어온 웹 페이지를 저장해두었다가 화면에 보여줌) 등 다양한 분야에서 사용 + +`캐쉬 운영의 시간 제약` +교체 알고리즘에서 삭제할 항목을 결정하는 일에 지나치게 많은 시간이 걸리는 경우 ㅣㄹ제 시스템에서 사용할 수 없음 +- Buffer caching이나 Web caching의 경우 +\- O(1)에서 O(log n) 정도까지 허용 +- Paging system인 경우 +\- page fault인 경우에만 OS가 관여함 +\- 페이지가 이미 메모리에 존재하는 경우 참조시각 등의 정보를 **OS가 알 수 없음** +\- O(1)인 LRU의 list 조작조차 불가능 + +결론 : paging system에서는 LRU, LFU 사용할 수 없다. +(그럼 왜 배웠나..? pagign system 외에도 다양한 캐슁 환경이 있다니까~) + +### Clock Algorithm +LRU의 근사 알고리즘. Second chance algorithm, NUR(Not Used Recently), NRU(Not Recently Used) 이라고도 불림 +- `Reference bit` 을 사용해서 교체 대상 페이지 선정(circular list) +- reference bit가 0인 것을 찾으면 그 페이지를 교체 +- **한 바퀴 돌아와서도(=second chance) 0이면 그때에는 replace 당함** +- 자주 사용되는 페이지라면 second chacne가 올 때 1 + +\+ `Clock algorithm의 개선` +\- reference bit와 `modified bit(dirty bit)을 함께 사용 +\- reference bit = 1 : 최근에 참조된 페이지 +\- modified bit = 1 : 최근에 변경된 페이지 (I/O를 동반하는 페이지) +![](https://velog.velcdn.com/images/ddongpuri/post/5789caaa-a263-4f62-b4ad-66058e00f17c/image.png) + +#### Page Frame의 Allocation +- `Allocation problem` : **각 process에** 얼마만큼의 page frame을 할당할 것인가? +- Allocation의 필요성 +\- 메모리 참조 명령어 수행시 명령어, 데이터 등 여러 페이지 동시 참조 +명령어 수행을 위해 최소한 할당되어야 하는 frame의 수가 있음 +\- Loop를 구성하는 page들은 allocate 되는 것이 유리함 +(최소한의 allocation이 없으면 매 loop마다 page fault) + +- Allocation Scheme +\- Equal allocation : 모든 프로세스에 `똑같은 개수` 할당 +\- Proportional allocation : 프로세스 `크기` 에 비례하여 할당 +\- Priority allocation : 프로세스의 `priority` 에 따라 다르게 할당 + +#### Global vs Local Replacement +**Global replacement** +- Replace시 다른 process에 할당된 frame을 빼앗아 올 수 있다 +- Process별 할당량을 조절하는 또 다른 방법임 +- FIFO, LRU, LFU 등의 알고리즘을 glocal replacement로 사용시에 해당 +- Working set, PFF 알고리즘 사용 + +**Local replacement** +- 자신에게 할당된 frame 내에서만 replacement +- FIFO, LRU, LFU 등의 알고리즘을 process별로 운영시 + +#### Thrashing![](https://velog.velcdn.com/images/ddongpuri/post/8b757c77-70d8-480a-b131-c4032d47fc56/image.png) + +프로세스의 원활한 수행에 필요한 **최소한의 page frame 수를 할당받지 못한 경우** 발생 +- Page fault rate이 매우 높아짐 +- CPU utilization이 낮아짐 +- OS는 MPD(Multiprogramming degree)를 높여야 한다고 판단 +(CPU가 놀고있다고 생각해서 프로그램을 더 메모리에 올려야겠다고 판단함) +- 또 다른 프로세스가 시스템에 추가됨(higher MPD) +- 프로세스 당 할당된 frame의 수가 더욱 감소 +- 프로세스는 page의 swap in/swap out으로 매우 바쁨 +- 대부분의 시간에 CPU는 한가함 +- low throughput + +Thrashing을 막기 위해서는 **동시에 메모리에 올라가 있는 프로세스의 개수(multiprogramming degree)** 를 조절해주어야 한다. 각 프로세스가 어느 정도 메모리를 확보할 수 있도록! +-> 그것을 해주는 알고리즘 : `Working-Set Algorithm`, `PFF(Page-Fault Frequency) Scheme` + +### Working-Set Model +> **Locality of reference** +- 프로세스는 특정 시간 동안 일정한 장소만을 **집중적으로** 참조한다. +- 집중적으로 참조되는 해당 page들의 집합을 **locality set** 이라 함 + +`Working-set Model` +- Locality에 기반하여 프로세스가 일정 시간 동안 원활하게 수행되기 위해 한꺼번에 메모리에 올라와 있어야 하는 page들의 집합을 Working Set이라 정의함 +- Working Set 모델에서는 process의 working set 전체가 메모리에 올라와 있어야 수행되고 그렇지 않을 경우 **모든 frame을 반납한 후 swap out (`suspend`)** +ex) 프로그램 A의 Working Set은 페이지 5개로 구성되는데 해당 프로그램에게 페이지를 3개밖에 줄 수 없는 상황 -> "3개 필요없고, 5개 줄 때까지 하나도 안받을게~" +- Thrashing을 방지함 +- Multiprogramming degree를 결정함 + +#### Working-Set Algorithm +`Working-Set의 결정` +- 프로그램이 과거 Δ시간(window) 동안 참조한 페이지들을 Working-Set이라고 간주 +- window size가 Δ인 경우 +\- 시각 ti에서의 working set WS(ti) +Timeinterval[ti - Δ, ti] 사이에 참조된 서로 다른 페이지들의 집합 +\- Working-Set에 속한 page는 메모리에 유지, 속하지 않은 것은 버림 +(즉, 참조된 후 Δ 시간 동안 해당 page를 메모리에 유지한 후 버림) + +#### PFF(Page-Fault Frequency) Scheme![](https://velog.velcdn.com/images/ddongpuri/post/e1fbf47a-36e5-41b0-bced-cb22e3f631dd/image.png) +page-fault rate의 상한값과 하한값을 둔다 +- 어떤 프로그램의 page-fault rate이 상한값보다 높음(지나치게 빈번) +-> Working-Set 보장이 안 된 상황으로 간주하여, 해당 프로그램에게 page 수를 더 늘려줌 +- 어떤 프로그램의 page-fault rate이 하한값보다 낮음 +-> 필요 이상으로 메모리를 가지고 있다고 간주하여, 해당 프로그램으로부터 메모리를 빼앗음 +- 빈 frame이 없으면 일부 프로세스를 swap out + +### Page Size의 결정 +`Page size를 감소시키면` +- 페이지 수 증가 +- 페이지 테이블 크기 증가 (더 많은 수의 엔트리 필요) +- Internal fragmentation 감소 +- Disk transfer의 효율성 감소 +\- Seek/rotation vs transfer +> - Seek 시간 : 오래걸림 +따라서, 가능하면 한 번 디스크 head가 이동해서 많은 양의 데이터를 읽어서 메모리에 올리는 것이 좋다.(=페이지가 큰 것이 좋다.) 페이지 크기가 작으면 Disk head가 비교적 자주 이동해야함 +- 필요한 정보만 메모리에 올라와 메모리 이용이 효율적 +\- Locality의 활용 측면에서는 좋지 않음 + +\* page size를 키우는 것이 요즘의 추세이다.