가상 메모리(virtual memory)는 OS에서 사용되는 메모리 관리 기법의 하나로 컴퓨터가
실제로 이용가능한 메모리 자원(실제주소, physical address)을 추상화하여 이를 사용하는
사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말한다.
프로세스가 실행될 때 운영체제는 해당 프로세스에게 가상 주소 공간을 제공한다.
32bit 운영체제 기준으로 가상 주소 공간은 최대 4GB 의 크기로 제공한다.
이때 일반적으로 유저모드 프로세스에 2GB 커널모드 공간에 2GB 로 분할되며, 유저모드의 2GB 중에서 OS 가 점유하는 부분을 제외하면, 실질적으로 1.7 ~ 1.8 GB 정도된다.
프로세스 내의 가상 주고 공간은 페이지 단위로 나눠지고, 논리주소가 부여되며, stack 이나 heap, code 등이 해당 공간에 할당된다.
이때 사용되는 페이지만이 주 기억장치의 프레임과 매핑이 되며, 사용되지 않는 페이지는 보조기억장치에 저장된다.
이에 프로세스의 가상 주소 공간의 크기는 32bit 기준 4GB지만, 실제로 운용되는 것은 1mb ~ 2mb 이다. (예를 들어)

그림을 보면 가상 주소 공간의 논리 주소를 MMU 에서 관리하는 페이지 테이블이라는 공간이 실제 물리 주소와 매핑 시켜주는 것을 확인할 수 있다.
이때 속도 향상을 위해서 캐시 계층인 TLB 라는 녀석도 사용한다.

가상 주소에서 바로 페이지 테이블로 가는 것이 아니라, TLB 에 매핑된 물리 주소가 있는지 확인하고, 없으면 이후에 페이지 테이블로 향하는 것이다.
프로세스의 크기가 4GB 일때, 불필요한 부분까지 RAM 위에 올라가 있다면 소수의 프로세스 밖에 운용하지 못할 것이다.
이에 가상 메모리 기법을 통해 프로세스의 필요한 부분만 RAM 에 올림으로써 자원의 낭비를 줄이고, 많은 프로세스를 운용하게 할 수 있는 것이다.
"가상 메모리는 실제 메모리보다 더 크게 보이게 하는 기술이다" 라는 말도 앞선 이유 때문이다.
또한 가장 큰 이유로써, 관리적 용이함 이 있다.
메모리에 적재된 페이지중에 사용 페이지가 없을 때를 말한다.
Major Page Fault
요청한 페이지가 페이지 테이블에는 존재하지만, 물리 주소에는 존재하지 않는 경우를 말한다.
이는 최초에는 주 기억장치에 존재하던 페이지가 페이지 교체 알고리즘 에 의해 보조 기억장치(스왑 공간)로 Swap-out 됐을 것이고, 이후 프로세스가 해당 페이지에 다시 접근하려고 하는 것이 원인인 것이다.
이로 인해 운영체제는 해당 페이지를 다시 Swap-in 하여 주 기억장치로 복원 시켜야 하며, 이때 Disk I/O가 발생하게 된다.
Minor Page Fault
요청한 페이지가 물리 메모리에는 로드되어 있지만 MMU에는 로드되지 않았다고 표시된 경우 이를 Minor page fault라고 한다.
프로세스의 스레드1이 페이지 1를 사용하고 있다고 할 때, 같은 프로세스의 스레드2가 페이지 1을 요청하는 경우를 예시로 들 수 있다.
Invalid Page Fault
블루스크린 원인 중 하나이다.
요청한 페이지가 스왑 영역의 범위를 초과하거나, 페이지를 쓰기 불가능한 영역에 쓰려고 할 때 발생하는 페이지 폴트이다. 이 경우에는 페이지 폴트 핸들러가 세그멘테이션 폴트(Segmentation Fault)를 발생시킨다. 결과는 보통 커널 패닉(블루스크린)으로 나타난다.
Major Page Fault 가 발생하면 스와핑을 시도한다.
페이지 테이블에 존재하지만, RAM 에는 존재하지 않는 페이지를 하드 디스크의 스왑 영역에서 찾아와 RAM 으로 불러온다. 이를 Swap-in 이라고 한다.
그런데, RAM 에 빈 공간이 존재하지 않다면, 기존에 존재한 다른 페이지를 하드 디스크의 스왑 영역으로 빼내어 빈 공간을 창출한다. 이를 Swap-out 이라고 한다.
이러한 스와핑 과정은 페이지 교체 알고리즘 에 의해 동작한다.
FIFO (First In First Out)

FIFO(First In First Out) 는 가장 먼저 온 페이지부터 교체하는 방법을 말한다.
앞의 그림처럼 1, 3, 0 순서대로 바뀌는 것을 볼 수 있다.
LRU (Least Recently Used)
LRU(Least Recently Used) 는 최근에 사용되지 않은 페이지를 바꾸는 방법이다.
예를 들어 7 0 1 2 0 3 0 4 로 페이지 요청이 들어온다고 가정하고 4개의 페이지만 담는다고 가정하면 다음과 같이된다.

NUR (Not Used recently)

clock 알고리즘이라고 부르기도 하는데, 0은 참조되지 않았음을 1은 최근에 참조됐음을 의미한다.
한 바퀴를 돌 동안 참조가 되지 않은 부분은 0으로 바뀌게되고, 참조가 된 부분은 1로 바뀌게 되는 알고리즘이다.
LFU (Least Frequently Used)
LFU(Least Frequently Used) 알고리즘은 가장 참조 횟수가 적은 페이지를 교체하는 알고리즘이다.

만약에 0 -> 1 -> 2 -> 0 -> 0 -> 1 -> 2 -> 3 으로 요청이 들어온다고 해보자.
표에서 보는 거 처럼 먼저 0, 1, 2 가 쌓일 것이다.
이후
https://hooni-playground.com/939/