
virtual Memory는 모든 요청에 운영체제가 관여
** 메모리 관리 방법 중 페이징 기법을 사용하는 것으로 가정
실제로 필요할 때 page를 메모리에 올리는 것
Valid / Invalid bit의 사용

Invalid reference? (eg. bad address, protection violation) -> abort process
Get an empty page frame(비어있는 page frame이 없을 경우 뺏어옴 : replace)
해당 페이지를 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
이 프로세스가 CPU를 잡고 다시 running
아까 중단되었던 instruction을 재개


page fault 값이 0이면 모든 page가 메모리에 있는 상태 page fault가 나지 않음
1일 경우엔 무조건 page fault
victim이 변경 사항이 없으면 그냥 디스크로 쫓아내면 됨
하지만 write가 발생했을 경우 쫓아낼 때 디스크에 변경사항을 써줘야함

page fault를 가장 적게 하는 알고리즘
미래에 참조되는 페이지들을 미리 다 안다고 가정하는 알고리즘
따라서 실제 시스템에서 사용할 수는 없음
빨간색은 page fault
연보라색은 메모리에서 참조

제일 오래 전에 사용 된 페이지를 쫓아내는 알고리즘

참조 횟수가 가정 적은 페이지를 쫓아내는 알고리즘



LRU Algorithm은 메모리에 있는 페이지들을 시간 순서에 따라 정렬 (linked list)
replace를 해야해 페이지를 쫓아내야하면 리스트에서 가장 위에 있는 페이지를 쫓아냄
걸리는 시간은 order of 1
LFU Algorithm은 메모리에 있는 페이지들을 참조 횟수에 따라 정렬 (linked list)
이런 식으로 구현했을 경우 걸리는 시간은 order of n
따라서 linked list로 구현하지 않고 heap 구조 중 이진트리를 이용해서 구현함
이런식으로 구현 했을 경우 걸리는 시간은 order of log n
캐슁 기법

CPU에서 프로세스A가 running 중일 때 매 실행마다 instruction을 불러와서 실행함
만약 주소변환을 했는데 해당 하는 페이지가 이미 물리적 메모리에 올라가 있을 때 그걸 그대로 가져다 씀
여기서 OS는 하는 일이 없음
만약 프로세스 A가 실행을 하다가 page fault가 발생할 경우 디스크 접근(I/O)를 필요로 하기 때문에 trap이 발생
트랩이 발생하면 CPU가 운영체제로 넘어감
운영체제는 가장 참조횟수가 적은 페이지 가장 오래된 페이지 등을 알 수 없음
왜냐하면 프로세스가 사용하는 페이지는 이미 메모리에 올라와 있는 경우에는 CPU가 운영체제한테 넘어가지 않음 하드웨어 적으로 주소변환해서 CPU한테 넘김(운영체제가 관여하지 않음)
이미 메모리에 올라가 있는건 OS가 알 수 없고
trap이 발생해서 CPU가 OS에 넘어 갔을 때 백 스토리지에서 메모리에 올라간 것만 알 수 있음
따라서 운영체제는 이미 메모리에 있는 페이지들을 쫓아낼 기준을 알 수가 없음
따라서 LRU LFU같은 것들을 페이징 시스템(버추얼메모리시스템)에서는 맞지 않음
하지만 아예 사용하지 않는 것은 아니고 퍼버캐싱 웹캐싱에서는 사용될 수 있음
그럼 페이징 시스템에서는 리플레이스를 하기 위해 어떤 알고리즘을 사용해야하는가? Clock Algorithm

LRU의 근사(approximation) 알고리즘
여러 명칭으로 불림
Reference bit을 사용해서 교체 대상 페이지 선정(circular list)
Reference bit가 0인 것을 찾을 때까지 포인터를 하나씩 앞으로 이동
포인터 이동하는 중에 Reference bit 1은 모두 0으로 바꿈
Reference bit이 0인 것을 찾으면 그 페이지를 교체
한 바퀴 되돌아와서도(=second chance) 0이면 그 때는 replace 당함
자주 사용되는 페이지라면 second chance가 올 때 1
Clock Algorithm의 개선
시계 모양의 알고리즘이라 Clock Algorithm이라는 이름이 붙음
각 페이지들이 시계모양으로
페이지가 최근에 참고가 되면 레퍼런스 비트를 1로 세팅 이건 운영체제가 하지 않고 하드웨어가 하는 일
레퍼런스 비트가 1이라는건 최근에 참고 됐음을 나타냄
레퍼런스 비트가 0이라는거는 시계가 한바퀴 돌았을 때 한번도 참조되지 않았음을 의미
레퍼런스 값이 0인 것을 쫓아냄 이런 면에서 LRU와 근사 알고리즘임 하드웨어가 비트를 세팅해주는 것을 보고 운영체제는 쫓아낼 페이지를 정함
페이지가 read가 아닌 write가 발생할 때 하드웨어는 modified bit을 1로 설정해줌 이는 메모리에서 백킹스토어로 쫓겨날 때 백킹 스토어에 수정된 내용을 반영한 후 쫓겨나야 함
모디파이드 비트가 1이면 디스크에 써줘야함으로 번거로워짐 따라서 쫓아내는 페이지를 결정할 때 참조횟수뿐만 아니라 수정횟수도 참고함
프로그램이 여러개가 메모리에 올라가 있음.
프로그램이 원활하게 실행되기 위해서는 CPU에서 돌아가면서 page fault를 최소화하고 일련의 페이지들을 같이 메모리에 적재하는 것이 효율적이다.
예를 들어 for loop에 속한 페이지가 3개라면 3개를 같이 적재하는 것이 효율적
코드에 해당하는 페이지 뿐만 아니라 데이터가 필요할 경우 데이터가 있는 페이지도 같이 적재되어 잇는 것이 효율적
프로그램 별로 allocation을 해주지 않을 경우 특정 프로그램 관련 페이지로 메모리를 점령할 수 있음
메모리 참조 명령어 수행시 명령어, 데이터 등 여러 페이지 동시 참조
Loop를 구성하는 page들은 한꺼번에 allocate 되는 것이 유리함
Global Replacement
Local Replacement
위의 두 방법은 미리 할당하지 않고 그 때 그 때 유동적으로 페이지를 할당함
Global Replacement는 자신 뿐만 아니라 다른 프로그램의 페이지도 쫓아 낼 수 잇는 방법이고
Local Replacement는 자신에게 할당된 페이지를 쫓아내는 방법임

x축은 메모리에 올라와 있는 프로그램의 개수
x축이 늘어날 수록 CPU의 사용률은 높아짐
근데 지속적으로 프로그램의 개수가 늘어날 경우 Thrashing이 발생함
왜냐하면 프로그램마다 할당받는 메모리 page가 너무 적어지기 때문에 page fault가 빈번히 발생하게 됨
어떤 프로세스가 CPU를 잡더라도 page fault가 발생하기 때문에 페이지 사용률이 낮아짐
그럼 OS는 프로그램을 더 실행해도 된다고 판단(MPD를 높여도 된다) -> 그럼 또 다른 프로세스가 시스템에 추가됨
아래 두개는 Thrashing을 방지하기 위한 알고리즘
Locality of reference
Working-Set Model

워킹셋은 미리 알 수가 없음
과거를 통해 working set을 추정함
과거 델타 시간동안 참조된 페이지들을 메모리에서 쫓아내지 않음 이것을 워킹셋이라 판단함
델타시간을 윈도우라고 부름
메모리 공간이 부족해 워킹셋을 다 메모리에 올리지 못하면 디스크로 서스펜드
참조된 페이지들을 델타시간 동안만 유지한 후 버린다는 말과 똑같음 근데 버리려 했는데 다시 참조가 된다면 버리지 않음
Process들의 Working Set size의 합이 page frame의 수보다 큰 경우
Working Set을 다 할당하고도 page frame이 남는 경우
Window size Δ

현재 시점에서 page-fault rate 어느정도인지 보고 특정 프로그램이 page fault를 얼마나 내는지 본다. 그리고 page fault를 많이 내는 프로그램에 페이지를 더 할당해준다.
만약에 page fault를 많이 내는 프로세스에게 더 할당해줄 페이지가 없다면 그 프로세스를 swap out
Page size를 감소시키면
페이지 수 증가
페이지 테이블 크기 증가
Internal fragmentation 감소
Disk transfer의 효율성 감소
필요한 정보만 메모리에 올라와 메모리 이용이 효율적
따라서 트렌드는 Larger page size