💫Introduction
메모리가 꽉 차서 Frame이 필요하다!
-> 피지컬 메모리에 있는 프레임에 저장되어 있는 것 들 중에서 디스크로 내려보내고(swap out) 디스크에서 진짜 필요한 것을 그 빈 자리에 다시 집어 넣어서 정상적으로 작동할 수 있도록하는 메커니즘이 필요하다.
: 요청이 있을 때만 page를 올리기 때문에 demand page
invalid
→ 아직 메모리로 올라오지 않은 상태일 수도 있고 유효하지 않은 상태일 수도 있음
⇒ 프로그램 전체를 다 안 쓸 수도 있는데 그걸 다 올려? 너무 낭비자나
Locality
특성 덕분에 잘 동작!
→ Temporal locality, Spatial locality 두 가지가 다 적용이 된다.
why demand
?
valid : 메모리에 있는 것
invalid : 메모리에 없음. → 메모리에 없지만 디스크에 있을 수 있으니 확인을 해야한다. 프로텍션에 걸리는 케이스가 아니라 디스크에 있는 상황을 Page Fault
라고 한다.
⇒ 이 판단은 OS가 한다
if valid-invalid bit == v
→ in-memory
if valid-invalid bit == i → CPU가 exceoption을 발생시킴 (interrupt)
→ not-in-memory (protection fault)
or Page fault
(os가 판단)
: invalid page에 참조하려고 하는 경우
OS마다 구현이 다른데 그냥 한 비트 더해서 하나는~ 진짜 valid invalid 하고 하나는~ 메모리 위에 올라왔는지 아닌지 이렇게 할 수도 있다.
-> 근데 그건 구현의 차이!
디맨드 형태로 메모리에 올려서 사용할 때
전체를 올리지 않고 필요한 것만 그 때 그 때 올려서 사용하고 그것을 디맨드 페이징이라고 한다,
필요한거가 메모리에 없을 때 디스크에 있는 것을 올려야 하는데 valid/invalid bit에서 invalid이면 운체가 page fault인지 protextion fault인지 확인
다 할당받아진 상태일 때
특정 프로세스에서 page fault가 나서 swap in 을 시켜야하는데 꽉차서 못한다.
- 무언가 하나를 빼야하는데 원래 프레임을 차지하고 있는 프로세스가 아직 수행을 다 마치지 않았으니 원래 있던 것을 디스크에 백업하고 당장 실행되어야 하는 것을 올림.
- 그러면 어떤 것을 뽑을것인가?!?!?!
- io는 느리다
replacement는 읽고 써야하니 두 번 해야해서 이게 제일 병목현상을 일으킨다.
✅ 처음(context switching)에는 TLB도 clean한 상태여서 hit miss, page fault가 발생한다
cold cache
: cache miss가 계속 발생hot cache
: cache hit이 계속 발생✔ Page faults
→ 페이지 테이블에 invalid - 피지컬 메모리에 올라와있지 않은데 접근을 시도
→ TLB traps to the OS (software takes over)
피지컬 메모리가 가즉차서 free frame이 없어 어떤 것을 swap out을 시켜야 한다. 이 때 어떤 것을 골라 내릴지가 굉장히 중요하다. 잘못 내리면 page fault 횟수가 늘어나게 된다.
: 어떤 걸 내리고 올릴건지, page fault ratio를 낮추는 것을 목표
→ vitim
을 정해서 디스크로 내리고 다른 것을 올림
Goal: lowest page-fault rate, 자주 사용되지 않는 것을 내림
: 먼저 들어온 것이 먼저 나간다
할당 받은지 오래된 것을 victim으로 선정
swap in된지 오래 된 것을 먼저 뺀다 → 안된당 구려!
도착시간만 고려하기 때문에 앞으로 많이 참조될 것 같은 것의 기준이 도착시간인데 이게 miss match
Reference bit
: 시간정보를 4-8비트로 사용하지 않고 1비트로 사용한다. 최근에 사용했으면 1로 중간중간 0으로 초기화, 4비트에서 1비트로 줄이고 오래 안 쓰이면 0으로 만든다.
→ 레퍼런스 비트 가 0으로 된 애들중에 누구를 빼야 하는지 알 수가 없다. 방금 전에 참조가 되었는데 0으로 초기화되었는데 선정이 되면 page fault가 발생할 수 있다.
Second chance (or LRU clock)
→ 해결법으로 가 제안이 되었다
1이면 최근에 한 번은 사용된 것이니 넘어가고 넘어가면서 0으로 초기화를 해준다. 0을 만나면 이것이 vitim이 된다.
Not Recently Used (NRU)
Use R (reference) and M (modify) bits
modify bit는 1로 한 번 바뀌면 다시 0으로 돌아가지 않는다. (메모리에 올라가 참조되어 있는 기간동안은 변하지 않는다)
우선순위 : 숫자가 작을수록 높다.
class 0 → class 1 → class2 → class 3
⇒ 이 알고리즘을 사용하기 위해서는 2비트가 필요하다
메모리에 참조한다는것은 read + write임. write하면 정보가 바뀔 수 있다. read만 있는지 write도 했는지를 따진다. 최초에 시작할 때는 class 0으로 시작을 한다. 이게 바뀌었는지 아닌지 확인할 modify bit를 페이지 테이블 엔트리에 추가를 한다. class 0에서 시작을 해서 인터럽트가 걸릴 때 마다 reference bit를 0으로 초기화를 해준다.
Least Frequently Used (LFU)
: 가장 사용이 덜 된걸 뽑자, count 횟수가 가장 적은걸 뽑자 (사용된 횟수 기준)
피지컬 메모리에 있는 frame을 어떻게 누구에게 할당해줄 것이냐
Allocation algorithms
- Equal allocation : 모든 프로세스에게 똑같이 나누어주는 것
- Proportional allocation : 큰 프로세스에게 더 많이 주는 것
→ 현재 이 방법을 사용 (우선순위 개념과 함께 하이브리드로 사용)- Priority-based allocation : 프로세스가 가지는 우선순위를 가지고 할당
Page replacement
피지컬 메모리를 다 사용하고 있을 때 vitim을 선정할 때 전체 프레임(Global Frame)을 기준을 해서 선정할 것이냐 아니면 할당된 프레임(Local Frame) 안에서 선정을 할 것인가
→ 최근 운체들은 Local Repalcemen을 기준으로! 프로세스 내에서도 로켈리티가 존재하기 때문에 프로세스 내에서 replacement를 한다.
: a process is busy swapping pages in and out
멀티프로그래밍 환경이라 다수의 프로세스가 올라가 작동한다.
프로세스 개수가 많아질수록 cpu사용률이 점점 올라가야 정상인데 그런데 어느 순간이 되면 뚝 떨어진다.(이런 경우를 Trashing)
→ 페이지 Repalcement에 의해 이런 현상 발생
프로세스 수가 많아지다보면 physical memory의 utilizaiton이 증가한다. 계속 증가하다보면 physical memory보다 많은 양을 필요로 하게 되어 page swap이 계속 일어난다.
→ 프로세스 로켈리티 사이즈의 합이 전체 메모리보다 크다
= Page Fault
가 많이 발생
= Replacement
가 빈번하게 발생 ( = I/O = 느리다 = io하는 동안 cpu는 논다)
✅ 해결 방안
→ 일시적으로 degree of multiprogramming을 줄임
병목현상이 피지컬 메모리에서 걸리는 현상, 피지컬 메모리를 무한히 둘 수 없기 때문에
현재 시스템에서 돌아가는 프로세스들이 가지는 로켈리티의 총합이 피지컬 메모리 총량보다 큰 경우와 같다
단위 시간동안 필요한 프레임의 개수 → 크냐 작냐 =⇒ 모델링
디맨드 페이징은 수행할 때 딱 필요한 페이지만 가져다 쓰는데
접근하려는 페이지 다음페이지 다음다음 까지 한 번에 다 가지고 와서 사용하는 것
미리 paging 하는 것
하드디스크를 쓸 때 사용하면 좋다
arm seek time 때문에 느린데 이왕간김에 주르륵 읽어오는 것이 더 좋다
⇒ 이걸 다 따져서 나온 것이 4KB
tlb 용량이 있는데 이 조만한 캐시 가지고 실제 접근가능한 메모리의 총량
한 줄당 4kb → 하나의 페이지 차지
DMA로 동작하는 task가 있을 때 physical memory에 특정 영역을 실제로 swap이 되지 않도록 page 교환이 되지 않도록 묶어두는 것