마치 메모리가 더 있는 것처럼 indirection !

물리적으로는 RAM이 8GB이지만 전체 program을 동시에 돌리는건 극히 드물기에 가장 중요하다고 생각되는 프로그램을 실행하는데 16GB로 수행하는척 해주는 것. 굳이 메모리에 적재되어 있지 않아도 되는 것들을 굳이 적재하지 않음( Dynamic Loading ). 3번 메모리에 접근하고 싶은데 12번 메모리와 15번 메모리에 있는 것을 더해서 3번 메모리에 넣고 싶을 때, 3, 12 그리고 15번 메모리 공간만 알면 된다. 나머지는 필요 없음 physical 메모리는 page frames으로 구성되어 있기에 contiguous하지 않다.
virtual memory가 있으면 memory mapping으로 4GB 중 필요한 것만 1GB에 할당하고 나머지는 Disk(가상 메모리)에 넣어줬다가 필요하면 1GB에 넣게 해준다. 사실 이게 꼭 필요한가 싶을 것이다. 하지만 하드웨어 resource가 커질 수록 점점 더 많은 RAM을 요구하게 될 것이다. 그렇기에 virtual memory는 반창고와 같은 임시방편이 아니라 계속 필요로 하게 될 것이다.

sparse 주소 공간

Virtual-address Space

사용하지 않는 공간은 paging하지 않고 있다가 필요할 때 paging하는 방식이다. 사용하지 않을 때 이를 보관할 공간이 필요하다. Disk안에 저장되어 있다.

Demand Paging

Virtaul memory의 이론을 가능하게 해주는 방식

대부분 프로그램 실행 시작 시 프로그램의 전체가 물리 메모리에 있을 필요는 없다. 그렇기에 처음에 필요한 것들만 적재하는 Demand Paging이 사용된다. 이를 사용하는 가상 메모리는 page들이 실행과정에서 실제로 필요해 질 때 적재된다.

Disk안에 virtual address로 저장되어 있다. Demand Paging은 swapping + paging의 개념으로 볼 수 있으며, 프로세스 단위로 swap in out이 되는 swapping이 아닌 일부부만 swapping을 수행하기에 I/O 연산의 overhead를 줄일 수 있다. 사용자 입장에서도 일부만 오게되니 메모리를 더 사용할 수 있다. swapping policy가 그만큼 중요해진다.

pager는 프로세스 전체가 아닌 실제 필요한 page들만 swap in을 하여 시간과 메모리 공간 낭비를 줄일 수 있다. 이는 프로세스가 다시 swap out 되기 전에 실제로 사용될 page들을 추측하기 때문에 가능하다. 어느 page가 disk에 있고 어떤 page가 메모리에 적재되어 있는지 구별할 수 있어야 하는데 이를 위해 valid-invalid bit가 사용된다.

기존의 address translation만 했던 MMU는 demand paging을 구현해야 할 역할이 추가된다. 내부적으로만 이런 것이 진행되어야 하고 프로그램 자체가 변경되거나 프로그래머가 코드를 변경하게 해서는 안된다.

Valid-Invalid Bit

page table에서 valid-invalid bit이 i (invalid)라면 해당 page가 가상 주소 공간에 정의되지 않았거나 메모리에 적재되지 않고 디스크에 존재한 상태이다.

valid-invalid bit이 v (valid)라면 해당 page가 메모리에 존재한다(memory resident).

이는 page fault를 발생한다. page fault(중요) → 사용할 수는 있지만 아직 메모리에 적재되지 않은 상태를 말한다.

Page Fault

처음 접근했을 때 메모리 상에 존재하지 않으니, page fault가 발생하고 storage(Disk)에서 이를 메모리에 적재한다.

  1. 명령어나 프로그램을 load할 때 page table에서 page fault가 발생 (Interrupt or Trap)
  2. OS는 단지 메모리에 없는 것인지 잘못된 참조인지 판단한다. (valid-invalid bit)