가상메모리(Virtual memory)
프로그램에 필요한 최소한의 부분만 메모리에 적재되고 그렇지 않은 부분은 디스크의 스왑 영역에 내려놓았다가 다시 필요해지면 메모리에 올라가 있는 부분과 교체하는 방식을 사용한다.
운영체제는 프로그램이 물리적 메모리의 한계를 고려할 필요없이, 자신만 메모리를 사용하는 것처럼 가정할 수 있도록 한다. 프로그램은 0번지부터 시작하는 자기 자신만의 메모리 주소 공간을 가정할 수 있는데 이러한 메모리 공간을 가상 메모리라고 한다.
가상 메모리의 기법은 요구 페이징(demand paging) 방식과 요구 세그먼테이션(demand segmentation) 방식으로 구현된다.
1. 요구 페이징
요구 페이징이란 프로그램 실행시 프로세스를 구성하는 모든 페이지를 한꺼번에 메모리에 올리는 것이 아니라 당장 사용될 페이지만을 올리는 방식을 말한다. 따라서 특정 페이지에 대해 CPU의 요청이 들어온 후에야 해당 페이지를 메모리에 적재할 수 있다.
이러한 방식 덕분에 요구 페이징은 메모리 사용량이 감소하고 프로세스 전체를 메모리에 올리는 데 소요되는 입출력 오버헤드도 줄어든다.
유효-무효 비트를 두어 각 페이지가 메모리에 존재하는지 알 수 있다. 이 비트는 각 프로세스를 구성하는 모든 페이지에 대해 존재해야 하므로 페이지 테이블의 각 항목별로 저장된다. CPU가 참조하려는 페이지가 현재 메모리에 올라와 있지 않아 유효-무효 비트가 무효로 세팅되어 있는 경우를 우리는 page fault
가 발생했다고 말한다.
유효-무효 비트
- bit == v: 메모리에 있다.
- bit == i: 메모리에 없다. 따라서 페이지 폴트 발생
요구 페이징의 페이지 부재 처리
- CPU가 무효 페이지 접근시 MMU가 페이지 폴트 트랩을 발생시킨다.
- 해당 페이지에 대한 접근이 적법한지 검사한다.
- 물리적 메모리에서 빈 프레임을 할당받아 그 곳에 해당 페이지를 읽어온다. 만약 빈 프레임이 없을 경우 메모리에 올라와 있는 페이지 중 하나를 스왑 아웃시킨다.
- 디스크 입출력 작업동안 페이지 부재를 발생시킨 프로세스는 CPU를 빼앗기고 봉쇄 상태로 전환된다.
- 이 때까지 수행되던 CPU 레지스터 상태 및 PC 값을 PCB에 저장해둠으로써 나중에 이 프로세스가 다시 CPU 할당받았을 때 이어서 작업을 수행할 수 있도록 한다.
- 입출력이 완료되면 인터럽트가 발생하고 페이지 테이블에서 해당 페이지의 유효-무효 비트를 유효로 설정한다. 해당 프로세스는 레디 큐로 이동한다.
요구 페이징의 성능
성능에 가장 큰 영향을 미치는 요소는 페이지 부재의 발생 빈도라고 볼 수 있다. 왜냐하면 페이지 부재가 발생하면 요청된 페이지를 디스크로부터 메모리로 읽어오는 막대한 오버헤드가 발생하기 때문이다.
- 페이지 폴트 🔻 요구 페이징 성능 🔺
- 유효 접근 시간(Effective access time)
= (1−P)⋅memory access P⋅(page fault overhead +
[swap page out] + swap page in + restart overhead)
- 페이지 부재 발생비율(page fault rate): 0≤P≤1
- P=0: 페이지 부재가 한 번도 일어나지 않은 경우
- P=1: 모든 참조 요청에서 페이지 부재가 발생한 경우