[OS] 메모리 관리(4) - 가상 메모리

가상 메모리(Virtual Memory)

배경

한 프로세스의 크기는 물리 메모리의 크기보다 클 수 없다. 프로세스는 항상 메모리에 적재되어 있어야하기 때문.

그런데, 반드시 모든 프로세스가 항상 메모리에 올라와 있어야하는가? -> No. 왜냐하면 모든 프로세스가 항상 동시에 실행되는 것은 아니기 때문.

예를 들어, 워드 프로세스와 웹 브라우저를 동시에 실행시켜놓고, 웹 서핑만 계속하는 경우, 워드 프로세스가 반드시 메모리에 올라와있어야 할 이유는 없음.

또한 현재 실행되고 있는 프로세스일지라도, 반드시 모든 코드가 메모리에 올라올 필요는 없음. 예를 들어, 예외처리를 위한 코드, 잘 사용되지 않는 기능을 위한 코드, 필요 이상으로 크게 할당된 배열 등, 당장 필요하지 않는 내용들이 존재한다.

따라서 프로세스가 저장되는 공간을 보조 저장 장치까지 확장해서 프로세스를 보조 저장 장치에 저장하여, 필요할때만 메모리에 올려서 사용하면, 물리 메모리보다 더 큰 크기의 프로세스를 실행하는 것도 가능함. 이것이 가상 메모리.

F2B5D078-CA6E-4679-901A-F40C559AD2A8 (출처: Operating System Concepts 10th ed.)

스와핑(Swapping)

이렇게 당장 필요하지 않은 프로세스 영역을 보조 저장 장치로 내쫓는 것을 스왑-아웃(swap-out), 보조 저장 장치에 저장된 프로세스를 메인 메모리로 올리는 것을 스왑-인(swap-in), 그리고 보조 저장 장치에 프로세스가 저장되는 영역을 스왑 영역이라고 한다.

요구 페이징(demand-paging), 요구 세그먼트(demand-segment) 등 OS마다 세부적인 구현 방법은 다르다.

장점

  • CPU utilization(이용률): CPU가 얼마나 많이 이용되는가
  • Throughput(처리량): 단위 시간동안 수행이 완료된 작업 수
  • Turnaround Time(총 처리 시간): 임의의 프로세스를 처리하는데 걸리는 시간
  • Response Time(응답 시간): 요청을 보낸 후 첫 응답이 올 때까지의 시간

Turnaround Time과 Response Time이 늘어나지 않으면서 CPU 이용률과 처리량을 높일 수 있다.

프로세스간 메모리 공유가 가능해진다.

  • 각 프로세스는 각자 자신의 메모리 주소 공간을 사용하는 것처럼 보임.
  • 시스템 라이브러리 공유 가능

프로그램 사용 중에 메모리 공간에 대해 신경쓰지 않아도 된다.

  • 프로세스는 무한의 메모리 공간을 사용하는 것처럼 행동할 수 있음

관련 이슈

  1. 가상 메모리의 페이지 테이블 구성: 어떤 부분이 메모리에 있고 어떤 부분이 스왑 영역에 있는지 알 수 있어야함.
  2. 페이지 폴트: 현재 메모리에 탑재되지 않은 부분을 요구하는 경우 어떻게 처리할지?
  3. 페이지 할당: 어느 부분을 메모리에 탑재하고 어떤 부분을 스왑 영역에 둘지?
  4. 스왑 영역: 스왑 영역의 크기는 어느정도로 해야할지
  5. 프레임 할당: 각 프로세스별로 프레임을 얼마씩 할당할지
  6. 쓰레싱: 프로세스가 실제 작업보다, swap-in, out을 처리하는데 더 많은 시간을 쓰고 있는 상태
  7. 작업 집합: 프로세스당 몇 개의 프레임을 할당하는 것이 적절한가
  8. 페이지 교체 알고리즘: 가용 프레임이 없을 때 어떤 프레임을 비워야할지
  9. 쓰기 시 복사