가상 메모리
가상 메모리 종류
- Logical Memory를 통해 메모리 영역 전체를 사용 가능하다고 가정하고 사용하는 방식이다.
- 디스크의 일정 부분을 메모리처럼 사용할 수 있는 방법이다. 일정 부분이란 것은 물리적으로 메모리처럼 사용할 수 있는 공간이 지정되어 있다는 뜻은 아니다. Physical memory와 secondary storage 사이의 swap을 통해 구현한다. free frame이 없으면 디스크를 메모리처럼 사용해서 특정 프로세스를 디스크로 내리고 새로운 프로세스를 physical memory에 할당한다.
Demand Paging
- 개념: logical memory에서는 프로그램이 실행되려면 메모리로 프로그램이 전부 다 올라온다고 가정하지만, 실제로 virtual memory를 적용하면 처음 수행할 때는 아무것도 피지컬 메모리에 올리지 않고 수행한다. CPU가 TLB 혹은 메모리에 존재하는 페이지 테이블을 통해 특정 메모리 영역을 접근했는데 플래그가 invalid 상태이면 그때 피지컬 메모리에 올린다. 처음 프로세스가 실행되면 페이지 테이블이 생성되고 전부 invalid인 상태로 시작한다. 특정 페이지를 참조했는데 invalid이면 exception으로 인해서 인터럽트를 발생시키고 운영체제를 호출하며, 인터럽트 핸들러가 protection 문제로 인한 invalid 상태인지 (not in memory) secondary storage에 존재하는 것인지 (page fault) 판단한다. 만약 page fault라면 디스크에서 페이지를 가져와서 메모리에 올린다. Protection 이슈라면 운영체제가 kill한다. context switching 이후 최초 한번은 반드시 page fault가 발생한다. 요청이 있을 때 필요한 부분만 피지컬 메모리에 올리기 때문에 Demand Paging이라고 부른다. 만약 피지컬 메모리에 free frame이 없으면 피지컬 메모리에 있는 특정 페이지를 디스크로 내려야 한다. 디스크의 어느 공간에 프로그램이 존재하는지는 PCB에 base 주소가 기록되어 있다. Invalid일 경우 PCB를 참조해서 디스크에서 가져와서 로드한다. 따라서 특정 디스크 영역이 정해진 것이 아니라 디스크 영역 전체가 가상 메모리처럼 사용되는 것이다. 하지만 용량의 한계는 정해져 있어야 한다.
- Locality: Swap in, out이 굉장히 빈번하게 발생하면 디스크 I/O가 많이 일어나므로 성능이 크게 하락하겠지만 Locality 특성으로 인해 좋은 성능으로 동작한다. Temporal locality는 시간적인 측면의 locality로, 최근에 사용된 데이터가 앞으로 사용될 가능성이 높다. Spatial locality는 공간상의 locality로, 근접한 데이터가 사용될 확률이 높다. 디스크에 있는 페이지를 피지컬 메모리에 캐싱한다는 개념으로도 생각할 수 있다.
Memory Reference
- 과정: CPU에서 메모리 엑세스하려고 하면 TLB를 참조하고 Cache hit이 나면 바로 메모리를 엑세스하고 Miss가 나면 페이지 테이블을 참조하여 Valid 비트라면 메모리를 엑세스하고 invalid 비트이면 운영체제가 개입해서 Protection 문제인지 Page fault인지 판단한다. Page fault라면 PCB를 참조해서 디스크에 접근하여 실제 메모리에 로드하고 페이지 테이블과 TLB를 업데이트한다.

Copy-on-Write
- Fork()로 인해서 프로세스가 2개가 된다. 포크된 순간은 모든 섹션이 똑같고, Demand Paging에 의해서 메모리를 새로 할당해줄 필요 없이 똑같은 영역을 공유해서 사용한다.
- 한 프로세스가 데이터 값을 업데이트하는 경우 같이 사용하면 데이터가 일치하지 않는다. 그 프로세스만의 고유한 영역이 필요하면 그 부분만 복사해서 새로 페이지를 할당해준다.
Page Replacement
필요성
- Free Frame이 없는 경우: Physical memory가 가득 차 있는 상황에서 새로운 페이지를 메모리에 올리는 경우 메모리 공간이 없으므로 Victim을 선정하고 디스크로 swap out하고 새로운 페이지를 swap in 해야 한다. 이 과정을 page replacement라고 한다. 어떤 페이지를 Victim으로 선정하냐가 중요하다. 자주 사용되는 페이지를 swap out한다면 I/O가 계속 발생해서 성능이 떨어진다.

Page Replacement Algorithm 개요
- page fault가 많이 일어나지 않는 최적의 victim을 선정하기 위한 알고리즘이다. Belady’s Proof에 따르면 가장 오랜 시간 사용되지 않은 페이지를 victim으로 선정하는 것이 page fault를 최소화한다.
- 프로세스 전체를 올려놓으면 page fault가 일어나지 않고 할당받은 프레임이 많을수록 replacement가 줄어든다. 하지만 프레임 수가 5, 6개 이상이면 page-fault rate가 거의 비슷해진다. 따라서 5, 6개 이상의 프레임을 할당하는 것은 큰 의미가 없다.