요구 페이징(Demand Paging)
이전에 가상 메모리 포스팅을 할 때 했던 얘기가 있는데 만약 내가 하고 싶은 게임의 용량이 20GB인데 어떻게 16GB 메모리에서 실행될 수 있을까? 라는 얘기를 잠깐 했었다.
실행에 필요한 메모리 용량보다 훨씬 적은 메인 메모리를 가지고 있으면서도 돌아갈 수 있었던 이유는 실행에 필요한 부분만 메모리에 올려서 실행했기 때문인데 이러한 기능을 해주는 것이 요구 페이징(Demand Paging)이다.
실제로 게임을 다운받아 보거나 직접 프로그램을 개발해 보면 굳이 필요 없는(프로그램이 돌아가는데 필수적이지 않은) 파일들이 많은 것을 알 수 있다. 이처럼 프로세스를 실행 시 모든 부분이 필요하지 않기 때문에 실행에 필요한 부분만 메모리에 올려 메인 메모리에 올라가는 프로세스의 크기를 현격히 줄일 수 있다.
요구 페이징은 당장 실행에 필요한 페이지만 메모리에 적재하는 기법인데 반대로 생각해보면 당장 실행에 필요 없는 페이지는 어떻게 되는 것일까?
당장 실행에 필요없는 부분은 Backing Store에 저장해 놓았다가 필요할 때 메모리에 올리게 된다.
- Backing Store
Backing Store는 swap device로 하드웨어의 한 부분으로 페이지를 임시로 보관하는 공간이다.
요구 페이징 기법을 사용할 때 필요한 페이지가 메모리에 존재할 수도 있고 Backing Store에 존재할 수도 있다. 이때 페이지가 메모리에 적재되어 있는지 판단할 방법이 필요한데 이때 사용하는 것이 Valid-Invalid Bit이다.
모든 페이지 테이블에는 Valid-Invalid Bit 값이 존재하는데 1은 페이지가 메모리에 존재한다는 뜻이고 0은 페이지가 메모리에 존재하지 않는다는 뜻이다.
따라서 페이지 테이블을 통해 논리주소에서 물리 주소로 접근할 때 valid(1)이면 바로 해당 페이지를 접근하게 되고 valid(0)이라면 Page Fault가 발생한다.
위의 그림을 예시로 들자면 페이지 D는 3번이라는 페이지 번호를 가지고 있지만 현재 페이지 프레임은 없는 상태로 Invalid Bit 값을 가지고 있다. 즉, valid(0)이 되므로 Backing Store에서 페이지 D를 찾아서 페이지 프레임에 올려줘야 한다.
요구 페이징의 종류
- Pure Demand Paging
처음부터 모든 페이지를 적재시키지 않고 CPU가 요구할 때 valid를 바꾸어 페이지를 적재시키는 방법
페이지를 요구할 때만 메모리에 적재하므로 메모리의 낭비는 매우 줄일 수 있다. 하지만 요구에 의해 앞선 페이지 부재의 현상을 처리하려고 하면 많은 부담이 발생한다.
- Pre-Paging
우선 필요할 것 같은 페이지를 적재시키고 필요할 때 다른 페이지를 적재시키는 방법
처리하는 속도는 빠르지만 메모리 낭비가 발생할 수도 있다.
요구 페이징의 장점
사용자 프로그램이 물리 메모리보다 커져도 된다. 메모리 크기의 제약이 자유로워진다. 처음에 설명했듯이 게임이 20GB여도 16GB 메모리에 올리는 것이 가능해진다.
각 사용자 프로그램이 더 적은 메모리를 차지하여 더 많은 프로그램을 동시에 수행할 수 있다.
위의 장점과 이어지는 것으로 제한된 메모리에 더 많은 프로세스를 올릴 수 있기 때문에 그만큼 CPU의 이용률과 처리율이 높아지게 된다.
요구 페이징에서 페이지 폴트 처리
앞서 요구 페이징에서 설명했던 것처럼 페이지에 필요한 물리 메모리가 없을 경우(valid 값이 0인 경우) 페이지 폴트가 발생한다고 했는데 그럼 어떻게 해당 문제를 처리할 수 있는지 알아보자.
전체적인 그림은 위와 같다. 순서를 체크해보면서 어떻게 페이지 폴트 처리가 이뤄지는지 확인해 보자.
1. 페이지 테이블을 통해 참조(Reference)하려고 하는 해당 페이지의 valid 값이 0이라면 즉, 페이지가 메모리에 없다면 MMU가 OS에 페이지 부재 트랩(Page Fault Trap)을 발생시킨다.
2. OS는 PCB에 있는 내부 테이블을 참고하여 부적절한 참조가 있는지 확인하고 만약 부적절한 참조라면 프로세스를 중지시킨다. 여기서 부적절한 참조라는 것은 참조할 수 없는 곳을 참조한다는 뜻이다.
3. 페이지가 Backing Store에 존재하는지 확인한다.
4. 물리 메모리에 비어있는 프레임이 존재한다면 그곳에 Backing Store에서 있는 페이지를 읽어온다. 이때 비어있는 프레임이 없다면 페이지 교체 알고리즘을 사용하여 페이지를 교체해 준다.
5. 페이지 테이블과 내부 테이블을 리셋하여 기존의 Invalid Bit 값을 Valid Bit 값으로 변경해 준다.
6. 다시 프로세스를 실행시킨다.
참고 자료
'CS > OS' 카테고리의 다른 글
운영체제 - TLB (0) | 2024.07.04 |
---|---|
운영체제 - 페이지 교체 알고리즘 (0) | 2024.07.03 |
운영체제 - 페이징과 세그먼테이션 (0) | 2024.07.02 |
운영체제 - 주소 변환 (0) | 2024.06.30 |
운영체제 - 주소 공간과 가상 메모리 (0) | 2024.06.30 |