이번 포스팅에서는 가상 메모리에 대해 살펴보겠습니다. 이전 포스팅까지 다루었던 물리적인 메모리의 주소 변환은 운영체제가 관여하지 않지만, 가상 메모리에서의 주소 변환은 전적으로 운영체제가 관리합니다.
앞으로 살펴볼 가상 메모리 챕터에서는 앞의 메모리 관리 기법 중에 페이징 기법을 사용하는 것으로 가정합니다. 실제로 대부분의 시스템은 페이징 기법을 사용합니다.
우선, 몇 가지 개념을 살펴보겠습니다.
1. Demand Paging
Demand Paging은 프로그램이 실행될 때, 프로세스를 구성하는 주소 공간을 전부 물리적 메모리에 올리는 것이 아닌 Page 요청이 있을 때 메모리에 올리는 것입니다.
좋은 소프트웨어일수록 방어적으로 코드를 작성하기 때문에, 프로그램을 구성하는 코드 중 실제로 자주 사용되는 부분은 제한적입니다. 때문에 사용하지 않는 Page를 전부 물리적 메모리에 올리면 메모리가 낭비됩니다. Demand paging은 필요한 것만 메모리에 올리게 되어 I/O양이 감소하고 그만큼 물리적 메모리를 사용하는 양이 감소합니다.
물리적 메모리 사용량의 감소로 더 빠른 응답 시간을 얻을 수 있습니다. 만약 물리적 메모리 공간이 무한이라면 프로그램 시작 시 프로그램을 통째로 올려놓아 Disk에 갈 필요를 없애면 응답 시간이 필요 없을 수 있습니다. 하지만, 실제 환경은 한정된 메모리 공간에 여러 프로그램을 동시에 실행시켜야하기 때문에 메모리 공간을 효율적으로 사용해야 합니다. 그래서 빈번하게 사용되는 페이지를 메모리에 올리고, 메모리에서 직접 서비스하는 비율을 높여 응답 시간을 빠르게 할 수 있습니다.
(1) Memory에 없는 Page의 Page Table
하나의 프로그램을 구성하는 논리적 메모리는 여러 개의 페이지로 구성이 되어있습니다. 그리고 당장 필요한 페이지는 Demand Paging에 의해 물리적 메모리에 올라가있고, 나머지 페이지들은 Swap Area(Backing Store)에 내려가 있게 됩니다.
Page Table에는 페이지에 대한 주소 변환 정보와 Valid/Invalid 정보가 담겨있습니다. 해당 페이지가 물리적 메모리에 올라와있지 않으면 Invalid라고 나타냅니다. 그래서 프로그램을 최초로 실행시키면 Page table의 Valid/Invalid Bit는 모두 Invalid입니다. 이후 요청이 와서 메모리에 올라가는 페이지는 Valid로 바뀝니다.
위 그림에서 프로그램은 A부터 F까지의 페이지로 구성됩니다. G, H 페이지는 사용되지 않는 Page이지만 주소 공간에서 주소 영역을 지원해주기 때문에 Page table에는 7번까지의 Entry가 생성됩니다.
Page table에서 valid라고 표시된 0, 2, 5번 페이지가 물리적 메모리 4, 5, 6에 할당되어있습니다. 그리고 Invalid로 표시된 1, 3, 4번 페이지는 물리적 메모리에 올라가있지 않고 디스크에 내려가 있습니다.
만약 여기서 Invalid 페이지에 주소 변환을 요청한다면 Page Fault가 발생합니다.
(2) Page Fault
만약 위 그림에서 CPU가 1번 Page를 주소 변환을 하려한다고 가정해보겠습니다.
1번 Page를 주소 변환하려했지만, 해당 페이지는 Invalid입니다. 그러면 메모리에 올라가 있지 않은 상태인 Page Fault가 발생합니다. Page Fault가 발생하면 그 페이지를 디스크에서 메모리로 올리는 I/O작업을 수행합니다. 그리고 페이지를 메모리에 올리기 위해 CPU 제어권이 운영체제에게 넘어갑니다. 운영체제는 Page Fault에 대한 인터럽트 처리 루틴을 통해 Fault 난 Page를 메모리에 올리게 됩니다.
운영체제에서는 주소가 잘못되었거나 접근 권한이 없는 등의 잘못된 메모리 요청인지를 먼저 확인합니다. 만약 요청이 잘못되었다면 Abort를 시킵니다. 정상적인 요청이라면 해당 페이지를 Disk에서 Memory로 올려주어야 하는데, 메모리가 꽉차있다면 메모리에서 Page를 하나 쫓아내 빈 메모리 공간을 얻습니다. 이후 Disk에서 읽어온 Page를 메모리에 올려놓습니다.
Page Fault가 발생하면 Disk Controller에게 Fault가 발생한 Page를 읽어오라고 요청합니다. 디스크 I/O를 하게 되면, 디스크에서 메모리로 올리는 작업은 매우 느리기 때문에 이 프로세스가 CPU를 갖는 것이 CPU 자원의 낭비가 됩니다. 그래서 Disk Read 요청 후 CPU를 빼앗겨 Blocked 상태가 되고, 당장 프로세스를 실행할 수 있는 Ready 상태의 프로세스에 CPU 제어권을 넘겨줍니다.
Disk Read가 끝나면 Page Table에 Page Frame 번호와 Valid 를 표시합니다. 그 후 Page Fault가 났던 프로세스가 다시 CPU 제어권을 잡아 메모리 주소 변환을 하게 되면 Page Fault가 나지 않고 MMU에 의해 주소 변환이 이루어집니다.
Page Fault 처리 순서를 보기 쉽게 정리하면 다음과 같습니다.
- Invalid Reference 인지 체크한다. (eg. Bad address, Protection Violation) → Abort Process
- Empty Page Frame 을 가져온다 (없으면 뺏어온다. Replace)
- 해당 페이지를 Disk에서 Memory로 읽어온다.
- Disk I/O가 끝나기까지 이 프로세스는 CPU를 Preempt 당한다. (block)
- Disk Read가 끝나면 Page Table Entry 기록한다. Valid/Invalid Bit = "valid"
- Ready Queue에 Process를 Insert → Dispatch Later
- 이 프로세스가 CPU를 잡고 다시 Running 상태로 간다.
- 아까 중단되었던 Instruction을 재개한다.
(3) Steps in Handling a Page Fault
위의 Page fault 과정을 그림으로 살펴보겠습니다.
위 그림은 Memory Reference를 요청(1)했는데 메모리에 올라와 있지 않은 상태(Invalid)입니다. 그래서 Trap(2)이 걸려 운영체제로 CPU 제어권이 넘어가게 됩니다. 운영체제는 Backing store에 있는 Page를 물리적 메모리로 가져옵니다(4). 물리적 메모리 Frame이 비어있다면 메모리에 올리고, 비어있지 않다면 메모리에 올라간 Page 중 하나를 쫓아내고 올립니다. 올리는 작업이 끝나면 Page table Entry에 해당 페이지 Frame 번호를 올리고 Valid로 상태를 변경(5)합니다. 이후 Valid로 표시되어 주소 변환을 정상적으로 실행하게 됩니다.
(4) Preformance of Demand Paging
Demand paging의 성능은 Page Fault가 얼마나 자주 발생하느냐에 따라 크게 좌우됩니다. 디스크에 접근하는 작업은 매우 느리기 때문에 Page Fault의 비율이 낮을수록 메모리에 접근하는 시간이 짧아지게 됩니다.
Page Fault가 얼마나 자주 발생하는지를 나타내는 Page Fault 비율(p)은 0에서 1사이의 값을 가집니다. 실제로 Page Fault가 얼마나 일어나는지 시스템에서 조사를 해보면 1에 가까운 수로 거의 항상 발생하는 수준입니다.
일반적으로는 Page Fault가 발생하지 않을 때에는 메모리에서 직접 주소 변환을 수행할 수 있습니다. 그러나 Page Fault가 발생한 경우에는 디스크 접근이 필요하게 됩니다. 이때 시간이 매우 많이 소요됩니다. Page Fault까지 고려한 메모리 접근 시간은 아래와 같습니다.
(1−p)×memory access+p
여기서 (1-p)는 Page fault 가 발생하지 않는 비율입니다. 이 비율에 해당하는 경우는 메모리에 접근하는 데에만 시간이 소요됩니다.
그리고 p 는 Page fault가 발생하는 비율로 이 비율에 해당하는 경우에는 CPU 제어권이 운영체제로 넘어가 하드웨어 적으로 Page fault를 처리하는 오버헤드가 발생합니다. 이후 메모리에 빈 공간이 없다면 페이지를 쫓아내고 그 곳에 디스크에서 읽어온 페이지를 올려놓아야합니다. 이후, 페이지 테이블을 업데이트하고 CPU를 재시작하는 과정이 추가로 발생하기 때문에 오버헤드가 크게 증가합니다.
이렇듯 비어있는 페이지가 없는 경우에 어떤 페이지를 쫓아내고 새로운 페이지를 올리는 과정을 페이지 교체라고 합니다.
다음 포스팅에서는 페이지 교체에 대해 살펴보겠습니다.
참고자료
[KOCW 이화여대 반효경 교수님 - Virtual Memory1]
https://core.ewha.ac.kr/publicview/C0101020140509151648408460?vmode=f
[ Operating System Concepts - Abraham Silberschatz ]
https://www.yes24.com/Product/Goods/89496122