[운영체제] 가상메모리(Virtual Memory)와 요구 페이징(Demand Paging), Valid-Invalid Bit, 페이지 부재(Page Fault)과정
가상 메모리(Virtual Memory)
메인 메모리의 크기는 한정되어 있다. 따라서 물리적인 메모리 크기보다 크기가 큰 프로세스는 실행시킬 수 없게 된다. 예를 들어 메인 메모리의 크기가 100MB 일 때 300MB 크기의 프로세스는 실행시킬 수 없다. 크기가 큰 프로세스를 실행시키기 위해서는 메인 메모리를 크게 키우는 방법이 있겠지만, 이것은 매우 비효율적이다. 따라서 나온 방법이 바로 가상 메모리(Virtual Memory)이다.
가상 메모리는 메모리 관리 기법의 하나로, 기계에 실제로 이용 가능한 자원을 추상화하여 사용자들에게 매우 큰 메모리인 것처럼 보이게 만드는 것을 말한다. 즉, 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식이다.
가상적으로 주어진 주소를 가상 주소(virtual address) 혹은 논리 주소(logical address)라고 하며, 실제 메모리 상에서 유효한 주소를 물리 주소(physical address)라고 한다.
논리 주소 공간은 메모리 관리 장치(MMU)에 의해 물리 주소로 변환된다.
가상 메모리의 장점은 다음과 같은 것들이 있다.
- 사용자 프로그램이 물리 메모리보다 커져도 된다. 즉 메모리 크기의 제약이 자유로워진다.
- 각 사용자 프로그램이 더 적은 메모리를 차지하여 더 많은 프로그램을 동시에 수행할 수 있다.
- CPU 이용률과 처리율이 높아진다.
- 프로그램을 메모리에 올리고 스왑 하는 필요한 입출력 횟수가 줄어든다.
- 가상 메모리 파일의 공유를 쉽게 하고 공유 메모리 구현을 가능하게 한다.
- 프로세스 생성을 효율적으로 처리할 수 있는 메커니즘을 제공한다.
요구 페이징(Demand Paging)
프로세스를 실행 시 모든 부분이 필요한 것은 아니다. 따라서 실행 시 필요한 부분만 메모리에 올림으로써 메인 메모리에 올라가는 프로세스의 크기를 줄일 수 있다.
요구 페이징은 실행시킬 프로세스들을 페이징 과정을 통해 외부 단편화 문제를 해결한다. 따라서 프로세스를 페이지 단위로 나누어 실행에 필요한 부분과 필요 없는 부분으로 나눈다. 이때 당장 실행에 필요한 페이지만 메모리에 적재하는 기법이 요구 페이징이다. 당장 실행에 필요없는 부분은 Backing Store에 저장해놓았다가 필요할 때 메모리에 올리게 된다.
극단적인 케이스로 프로세스를 실행할 때 어떠한 페이지도 메모리에 올리지 않고 시작할 수도 있다. 이를 Pure Demand Paging이라고 한다. 반대로 우선 필요할 것 같은 페이지를 메모리에 올려놓고 나중에 다른 페이지가 필요하면 다른 페이지를 메모리에 올리는 방법을 pre-paging이라고 한다.
요구 페이징 기법을 사용할 때, 필요한 페이지가 메모리에 존재할 수도 있고 Backing Store에 존재할 수도 있다. 이때 페이지가 메모리에 적재되어 있는지 판단할 방법이 필요하다. 여기서 이용하는 것이 Valid-Invalid Bit이다.
+페이징에 대해 잘 모른다면 다음을 참고하자.
Valid-Invalid Bit
모든 페이지 테이블에는 valid-invalid bit이 존재한다. 이때 valid(1)는 페이지가 메모리에 존재한다는 뜻이고, invalid(0)는 페이지가 메모리에 존재하지 않는다는 뜻이다.
따라서 페이지 테이블을 통해 논리주소에서 물리 주소로 접근할 때 valid(1)하다면 바로 해당 페이지를 접근하게 되고,
만약 invalid(0)하다면 Page Fault가 발생한다.
페이지 부재(Page Fault) 과정
- 페이지 테이블을 통해 페이지를 참조(reference)하려고 하는 해당 페이지가 invalid(0) 하다면, 즉 페이지가 메모리에 없다면 MMU가 OS에 페이지 부재 트랩 (Page Fault Trap)을 발생시킨다.
- OS는 내부 테이블(주로 PCB에 있음)을 체크하여
- 부적절한 참조(invalid reference)라면 프로세스를 중지(abort)한다. (부적절한 참조==참조할 수 없는 곳을 참조)
- 그저 메모리에 없는 것이라면 3번과정으로 넘어간다.
- 페이지가 Backing Store에 존재한다면
- 물리 메모리에 비어있는 프레임(Free Frame)이 존재한다면 그곳에 페이지를 읽어온다. 이때 만약 비어있는 프레임이 없다면 페이지 교체 알고리즘(Page Replace Algorithm)을 통해 교체할 페이지를 골라야 한다.
- 페이지 테이블을 리셋한다. (페이지 테이블의 valid-invalid bit를 valid로 수정한다)
- 다시 프로세스를 실행한다.