운영체제#9
LeeMir, 19 April 2021
3강 - Memory Management(이어서)
Problem : Too Large Page Table
- Multilevel Page Tables
- Page Table 사이에 계층이 존재
- 수많은 Second-Level Page Table 위에 Top-Level Page Table 존재
- 각 Page의 Size는 보통 4KB(2의 12승)
- 모든 Page가 존재한다면 메모리를 더 비효율적으로 사용하는 것이지만, Table의 valid가 0이면 그 Page는 존재하지 않음
- 따라서 안쓰는 공간을 없앰으로써 메모리를 더 효율적으로 사용할 수 있음
- Logical Address
P1 - P2 - d
- P1, P2 : Page Number
- d : Page Offset
- Multilevel의 경우 TLB에 Miss가 있는 순간 여러 단계에 걸쳐 모든 Table을 탐색해야하므로 메모리 효율이 더 나빠질 수 있음
- Page Table 사이에 계층이 존재
- Inverted Page Tables
- 한 System에는 Inverted Page Table이 딱 한 개씩만 존재
- Inverted Page Table에는 pid와 p가 대응되어있음
- idx 값이 physical memory의 frame number임
- 그때마다 Page Table을 탐색하면 효율이 떨어져 한번 찾았던 값을 따로 저장
- TLB에 Miss가 나서 탐색을 해야하는 경우 메모리 효율이 떨어짐
- Hash Table 사용
Address Space and OS
- Process의 상단에는 운영체제(OS)에 있는 Code Data를 가리키는 Address가 존재
- 이 부분은 모든 Process가 공유
- Process의 내용을 읽다가 시스템 호출과 마주치면 Interrupt를 걸고 상단에 있는 OS Code Data Address로 이동
- 이 때 입출력(특권 명령)을 수행하기 위해서는 Interrupt 전후로 Kernel Mode <=> User Mode 필요
Page Fault
- CPU가 Virtual Address를 Physical Address로 바꾸기 위해서 TLB를 탐색했는데, 그 valid 값이 0이었음
- Main Memory에 적재되어있지 않고 Disk의 Swap영역에 있다는 뜻
- 이 때 CPU 차원에서는 할 게 없어 Interrupt를 일으킴
- OS에서 Disk Swap영역을 탐색해 해당하는 Page를 찾아 Main Memory의 빈 Frame에 넣고 Page Table을 수정 후 Page Fault Return
- 일반적인 Interrupt와 차이점
- 일반적인 Interrupt는 발생하면 하던 일을 모두 마치고 Interrupt Handler로 이동, 돌아왔을 때에는 다음 일을 수행
- Page Fault는 하려던 일을 못해서 발생, 돌아오면 하려던 일을 재개
- 만약 Main Memory가 꽉차있다면, 기존에 있는 Page를 쫓아내고 빈 Frame을 만듦
- 쫓아내는 기준은 “교체 정책”에 의해 수행
- 기존에 한 번 쫓아냈던 Page인데 Page Fault로 인해 다시 적재한다면 매우 비효율적인 일
- Demand Paging
- 모든 Page를 Main Memory에 적재하지 않고, Page Fault Handler로 Page가 필요할 때(참조될 때)에만 적재
- Memory 효율 up
- 모든 Page를 Main Memory에 적재하지 않고, Page Fault Handler로 Page가 필요할 때(참조될 때)에만 적재
Page Replacement Algorithm(페이지 교체 정책)
- Optimal
- 어떤 Page를 참조할지 Pattern을 미리 아는 상황에서 가장 참조 덜되는 Page를 쫓아냄
- Ideal 하지만 실현 불가능, 다른 알고리즘과 효율성을 비교할 때 사용
- NRU(Not Recently Used), FIFO
- Reference Bit : 이 Page는 최근에 참조되었음을 표시
- Modified Bit : 이 Page는 최근에 수정되었음을 표시
- 만약 수정되었다면 쫓아낼 때 Disk Swap영역에 수정 내용을 적용해야하는 과정이 생김
- NRU : 최근에 참조되지 않았으면서, 수정되지도 않은 Page부터 쫓아냄
- FIFO : 가장 오래된 Page부터 쫓아냄
- 구현하기 단순함
- Hot Page(자주 참조되는 Page)가 계속 쫓아질 가능성이 있음
- Second Chance Algorithm
- FIFO를 따르되 Ref. Bit가 1이면 0으로 초기화 시킨 후 맨 뒤(front => rear)로 보내서 한번 더 기회를 줌
- The Clock Page Replacement Algorithm
- Second Chance Algorithm과 동일하나, Circular 구조
- LRU Page Replacement Algorithm
- Top : Most recently used (MRU) page
- Bottom : Least recently used (LRU) page
- 참조된 Page는 Top으로 이동
- 항상 Bottom Page를 교체
- Software적으로 구현하기도 쉬워 기본 Algorithm으로 각광을 받고 있으나 CPU Cache로 하기는 쉽지 않음
- 행렬로 만들어 가장 최근에 참조된 Page idx의 행을 1로, 열을 0으로 바꾸면 행의 크기에 따라 Top과 Bottom을 구분할 수 있음
- NFU(Not Frequently Used)
- 각 Page마다 그 시점의 Ref Bit를 기록 후 Right Shift(Aging 기법이 추가된 것임)
- Aging을 하지 않는 NFU는 그냥 Ref Bit를 더해주는 형식
- 1이 많을수록 많이 참조되었다는 뜻
- Page 값이 가장 작은 것부터 쫓아냄
- Page가 많을 수록 Memory의 부담이 커짐
- 각 Page마다 그 시점의 Ref Bit를 기록 후 Right Shift(Aging 기법이 추가된 것임)
- Working Set Page Replacement
- 사용한 Page를 Working Set이라는 단위로 묶음
- Working Set에 속하지 않는 Page를 쫓아냄
- 운영체제가 주기적으로 Page Fault Frequency를 측정해 프로세스의 Working Set을 측정할 수 있음
- Page Fault가 너무 많이 일어나면 Working Set(할당 Page 개수)을 늘려주고 적게 일어나면 Working Set을 줄임
- Global vs Local Page Replacement
- Global : 교체할 Page의 범위가 모든 프로세스
- Local : 교체할 Page의 범위가 해당 프로세스
Load Control
- Thrashing
- 여러 프로세스가 돌아가는데 각 프로세스에 할당된 Page의 수가 Working Set을 만족 못할 경우, 프로세스가 수행되는 시간보다 Page 교체 시간이 더 많이 발생, Memory 효율성 현저히 떨어짐
- 주로 프로세스가 많아지면 발생
- Swapping
- 몇 개의 프로세스를 골라 Swap Out한 후, 그 프로세스들이 사용하던 Working Set을 다른 프로세스들에게 나눠줘서 다른 프로세스들이 수행될 수 있게 함
- 여러 프로세스가 돌아가는데 각 프로세스에 할당된 Page의 수가 Working Set을 만족 못할 경우, 프로세스가 수행되는 시간보다 Page 교체 시간이 더 많이 발생, Memory 효율성 현저히 떨어짐