physical memory가 꽉 차서 못쓰는 상황 -> 디스크에서 frame 사이즈와 같은 크기로 만든 자료구조를 이용
physical memory와 디스크의 swap을 통해 공간을 만들어 physical memory크기보다 더 큰 공간을 사용할 수 있게 해준다.
2. Demand Paging
logical 영역 : 프로그램이 실행하는데 필요한 영역이 한번에 다 생성된다.
demand paging : run time에 disk에 있는 것 중에서 필요한 것만 올리는 방식
필요한 것을 필요할 때에 가져오기
메모리를 아낄 수 있고 효율적이다. (locality를 잘 이용할 수 있다)
순서
TLB miss -> page table 보기 -> invalid -> exception -> OS의 개입
1) page fault : disk에서 필요한 것을 가져와서 실행
2) protection fault : trap
cf) process에서 swap in/out : 전체 프로세스를 모두 올리고 내리는 것을 결정하기
long, mid term scheduling이 사라진 이유
locality 특성으로 인해 더욱 효율적으로 동작한다.
caching이 locality의 특성을 극대화
locality in a memory-reference pattern을 보면..
가로축으로 연속된 형태 : temporal locality
세로축으로 연속된 형태 : spatial locality
3. Memory Protection in Paging
virtual memory 없는 경우 : page table의 valid bit에 invalid가 체크되어있을때 접근한다면 무조건 protection fault이므로 trap이 발생한다.
virtual memory가 있는 경우 : page table의 valid bit가 invalid인 경우 protection fault와 page fault 두 가지 경우가 존재한다.
protection fault : trap
page fault : 디스크에 접근해서 swap
실행 이후 한 번도 access가 되지 않은 page는 invalid 이다.
4. Page fault
page fault 발생 시 처리
hardware : 매우 복잡하게 구현
OS : 대체로 사용하는 방식 (hardware의 기능/발전 덕분에 계산을 쉽게 할 수 있게 되었다)
Steps in Handling a Page Fault
5. Memory Reference
Memory reference 종류 1) TLB hit : 바로 memory 접근 (이전에 한번 써서 caching이 된 경우 - 99% 차지) 2) TLB miss : page table 참조 -> 원하는 정보를 찾아서 TLB로 업데이트 3) TLB miss 후 page table에도 정보가 없는 경우 : page fault or protection fault로 처리
순서
1) CPU가 메모리를 참조할 때 TLB를 먼저 참조
2) 맨 처음에 TLB를 참조한 순간 page table은 모두 invalid로 체크되어있어 cache miss가 발생 (처음 실행 시 느림)
3) 실행하다 보면 TLB와 page table이 채워진다. (TLB hitting range가 99%를 넘게 된다)
위의 과정을 통해 실제로 physical memory를 넘어서는 작업을 하더라도 유저 입장에서 느려지는 것을 잘 느끼지 못한다. (cache의 기능)
cache hit 증가 : hot cache / cache hit 감소 : cold cache
TLB miss 상황
page table 자체가 out된 경우
거의 일어나지 않는 상황
cache miss가 일어나서 page table을 보려고 하니 page table이 없는 경우
swap out 한 것이 page table인 경우
OS 처리 : 잘 사용하지 않는다.
hardware 처리 : 대체로 사용하는 방식
page faults
page fault가 발생하면 io가 많아지면 느려질까? -> 아니다.
올라가 있지 않은 영역을 CPU가 찾으러 가는 상황
TLB miss
page table invalid
OS가 처리
6. Copy-on-Write
fork() 상황
physical memory는 같다. -> physical memory영역을 공유하기
한 프로세스가 업데이트 되어 업데이트 한 page가 있다면 새로운 frame을 받아와서 처리한다.
exec() 상황
성능 향상
demanding paging으로 필요한 것을 필요할 때 하나씩 올린다.
No free Frame issue
1. Overview
physical memory가 꽉 찬 경우 physical memory 중 하나를 골라서 디스크로 swap out 시키기
page replacement의 목적 : 다시 참조되지 않을 법한 것을 내려야 page fault의 비율을 줄일 수 있다.
example
A 방식 : frame을 작게 할당
B 방식 : frame을 크게 할당
A의 page fault가 더 많이 발생한다.
but 특정 process의 frame 갯수가 5~6개가 되면 이후로 page fault의 수가 비슷하게 유지된다. (locality 특성)
5~6개보다 많이 frame을 할당할 필요가 없다.
Page replacement Algorithms
한 프로그램에서 많이 사용하는 frame을 예측해서 많이 사용되는 것은 유지하고 많이 쓰지 않는 것을 내리는 것이 좋은 방식이다.
1. FIFO
먼저 들어온 frame이 먼저 나가는 방식
swap in 하고 가장 오래된 것을 먼저 빼기
효율성 x
example
frame 수가 많아졌는데 page fault가 더 많아지는 case도 존재한다.
비효율적이다.
도착 시간만을 생각하는 알고리즘은 page replacement의 목적에 부합하지 않는다.
2. Optimal Algorithm
과거를 보고 현재 상태를 예측하는 방식
locality 특성을 활용
LRU, NRU, LFU
3. LRU Algorithm
Least Recently Used (LRU) Algorithm
최근에 가장 사용되지 않은 것을 내리는 방식 -> 거의 optimal 하다
time stamp를 통해 특정 시점의 시간 정보르 표시해야 한다.
time stamp 찍기 : 참조될 때 마다 참조되는 page에 대해서 time stamp를 찍는 방식
단점
시간 정보를 남기려면 4~8bit 정도의 크기가 필요 (메모리 차지)
매번 참조할 때 마다 시간 정보를 가져와야 하므로 overhead가 크다
time stamp 방식 해결 방안
stamp를 찍지 말고 stack을 이용해서 오래된 순으로 쌓아두면 정확한 시간 정보를 몰라도 오래된 것이 무엇인지 알 수 있다.
stack 방식의 문제점 : 마찬가지로 stack을 OS가 관리해야 하므로 overhead가 크다.
stack 방식 해결 방안
time stamp의 bit를 1bit로 줄여서 가지고 있으며 대략적으로 시간 정보를 관리
처음에는 0 저장되고 사용되면 1로 저장
timer interrupt가 발생하면 모든 bit를 0으로 초기화 해줘야 한다.
간소화된 time stamp 방식의 문제점
특정 주기 안에서 해당 page가 참조된 것인지 아닌지만 확인
reference bit가 1인 경우가 다수 존재하면 누가 먼저 들어온 것인지 확인 불가능하다.
간소화된 time stamp 방식 해결 방안
LRU clock사용
LRU clock
참조가 되면 refernce bit가 0에서 1이 된다.
next victim이 가리키는 것을 보면서 1인 경우 (최근에 참조됨) 0으로 바꾸고 해당 bit의 아래 bit를 확인하여 처음으로 0을 발견하면 해당 bit를 victim으로 선정하여 다음에 초기화를 해야 할 때 먼저 초기화시킬 bit를 가리키기
-> 다음 timer interrupt가 발생 이전에 page fault가 일어나면 먼저 내려야 할 것을 미리 정해두는 작업!
NRU 알고리즘보다 성능이 좋지 않아서 사용하지 않는 방식이다.
4. NRU algorithm
Not Recently Used (NRU)
정보를 read만 한 것인지 write까지 한 것인지 확인 (modify bit 사용)
page table entry에 modified bit를 추가
page table에 reference bit와 modify bit 두개가 존재
동작 방식
class 0 에서 시작 -> interrupt가 들어옴
reference bit 초기화
read만 한 경우 reference bit를 1로 설정 -> class 2
write 한 경우 modify bit 1로 설정 -> class 3
modify bit가 한번 1로 설정되면 다시 0으로 설정되는 경우가 없다.
class number가 낮은 것이 먼저 replacement된다.
class 1 vs class 2
reference bit가 1인 것은 이전 timer interrupt 이후 최근에 한번 참조가 된 것 (modify bit가 1인 것은 언제 참조된건지 알 방법이 없기 때문)